TECH PLAY

電通総研

電通総研 の技術ブログ

å…š841ä»¶

こんにちはクロスむノベヌション本郚 AIトランスフォヌメヌションセンタヌの杉江です。 今回は、電通総研の「OJTリヌダヌ制床」における半幎間のOJT期間で、私が配属先で経隓したこずを玹介したいず思いたす。 先に公開された、私のOJTリヌダヌを担圓しおくださった村本さんの蚘事ずあわせお読んでいただくず、OJTリヌダヌ目線ず新人目線で、同じOJT期間をどう捉えおいたのかの違いも芋えおくるかもしれたせん。 tech.dentsusoken.com 配属先に぀いお 新人教育制床の詳现は OJTリヌダヌ偎の振り返り蚘事 で説明されおいるので、ここでは私の配属先に぀いお軜く觊れおおきたす。 私は新人研修埌、AIトランスフォヌメヌションセンタヌAITCのAIコア゜リュヌショングルヌプに配属されたした。抂芁は以䞋のずおりです。簡単にたずめるず、 生成AI゜リュヌション「Know Narrator以䞋、KN」の開発メンバヌずしお配属された ずいうこずです AITCは電通総研の䞭にあるAIに特化したプロゞェクトチヌムになりたす。さらにAITCの䞭でも゜リュヌション系グルヌプ゜リュヌションコア・゜リュヌションアプリずコンサルティンググルヌプに分かれおおり、私ず新入瀟員の方は゜リュヌションコアグルヌプに所属しおいたす。゜リュヌション系グルヌプでは、゚ンタヌプラむズ向け生成AI゜リュヌション「Know Narrator」の開発、魅力向䞊に向けた技術怜蚌等を行っおいたす。 Know Narratorは自瀟開発を行っおいるプロダクトになりたすので、゜リュヌション系グルヌプが連携しながら開発をしおいたす。぀たり、新入瀟員の方は開発チヌムの䞀員ずなり、プロダクト開発における様々なスキルを身に着けながら、プロダクトの魅力向䞊に貢献しおいくこずが倧きな目暙ずなっおいきたす。 配属圓初の自分ず、半幎埌の自分 半幎で取り組んだこずを玹介する前に、配属圓初の自分がどのような状態だったのか、そしおOJT期間を半幎過ごした埌にどう倉わったのかを先に玹介したいず思いたす。 配属圓初の自分 たず、配属圓初の自分の状態に぀いお玹介したす。 経歎 情報工孊専攻の倧孊院卒 基本情報技術者詊隓合栌 わかっおいたこず プログラミング 倧孊の授業や研究を通じお、プログラミングの経隓はある皋床あった 䞍安だったこず クラりド  AWSやAzure等をほずんど觊ったこずがない AI : ChatGPTやGitHub Copilotを䜿ったこずがある皋床 チヌム開発  ちゃんず取り組んだのは新人研修が初めお こうしお振り返るず、配属圓初の自分は開発チヌムのメンバヌずしお、戊力になれる状態では党くありたせんでした。 ただ、これは特別なこずではなく、倚くの新卒瀟員が䌌たような状態で配属されるのではないかず思いたす。 配属半幎埌の自分 半幎埌には、配属圓初に感じおいた䞍安がすべおなくなったわけではありたせんが、少なくずも 「䜕もわからない状態」 からはかなり前に進めたず思いたす。䞍安だったポむントも以䞋のように倉わりたした。 䞍安だった点が、半幎埌にはどう倉わったか クラりド  Azureの資栌を二぀取埗 し、業務の䞭でもAzureの画面の簡単な操䜜ができるようになった。 AI : 生成AI゜リュヌションの機胜開発を担い 、普段の開発でもAIを掻甚しおいる。たた、 最新技術を調査しおチヌムに共有 する経隓を通しお、理解を深めた。 チヌム開発  開発チヌムに本栌的に入り、Know Narratorの䞻芁機胜の1぀を 仕様敎理から実装、テストたで䞀貫しお䞻担圓ずしおかかわり、呚囲ず連携しながらリリヌスに貢献できるようになった。 配属圓初の自分が抱えおいた䞍安は、半幎のOJT期間を通じお、 実際に手を動かしながら少しず぀埋めおいくこずができたした 。 具䜓的な取り組みずその感想 ここから、どのような取り組みを通じお成長できたかに぀いお時系列で振り返っおいきたす。 10月〜11月たずは0から䜜っお孊ぶ OJTリヌダヌ偎の振り返り蚘事 では、この時期の取り組みが次のように敎理されおいたす。これを螏たえお、自分でも振り返りたいず思いたす。 【䞻に取り組んだこず】 Know Narratorを1ナヌザヌずしおいろいろ觊っお機胜の理解を深める OJTリヌダヌが個別にタスクを指瀺し、新人はそのタスクを達成するための実装を行う 1からリポゞトリを䜜り、環境を構築し、実装‧テストたで行う実装プロセスはKN開発を螏襲し、タスク分解→実装→テスト→コヌドレビュヌの流れで進める 【狙い、身に着けおほしいスキル】 「できた」ずいう感芚を味わっおいただくために、完党に0から始めお自力で少しず぀実装し簡単な生成AIアプリを䜜る KN開発でのお䜜法をこちらでも導入しながら進めるこずで、お䜜法になれるタスクの進め方や困ったずきの盞談など、OJTリヌダヌずの䌚話を通しお慣れおいただく実際に補品導入が予定されおいる機胜の先駆け怜蚌‧チヌム共有を行うこずで、チヌム‧補品ぞの貢献を感じおいただく 共有時にどのように情報を敎理すれば䌝わるかなどをチヌム内で経隓する 10月〜11月は、補品開発に盎接関わるずいうより、たずは Know Narratorがどのような補品なのかを知るこずず、Know Narratorの開発環境で䜿われおいる技術のキャッチアップ を進めるこずに取り組みたした。 たずKnow Narratorずいう補品を知るために、たずは実際にシステムを觊っおみるこずから始めたした。 ここでは、ナヌザヌ目線で抌せるボタンを䞀通り觊り、䜕が起きるかを芋たり、裏偎でどう凊理されおいるのか気になった点を日報に曞いたりしながら進めたした。圓時は「新人に任せる仕事がないから、やっおいるのかな」ず思っおいた郚分もありたした。しかし、開発に関わるシステムを理解するために非垞に重芁な時間だったず、今になっお思いたす。 技術のキャッチアップでは、Gitのリポゞトリを1から䜜り、簡単なAIチャットアプリを䜜りながら、開発で必芁なAIや開発環境の知識、プログラミングのお䜜法などを孊びたす。 OJTリヌダヌから小さなタスクを䞀぀ず぀もらい、察象の技術をキャッチアップしながら、実装、Pull Requestの䜜成、レビュヌずいう流れで進めたした。 基本的にはたず自分なりに進め、その成果物に察しおOJTリヌダヌの村本さんだけでなく、他の開発メンバヌからもコメントやアドバむスをいただけたので、タスクを進めるたびに新しい気づきを埗るこずができたした。 䞋図は実際に䜜っおいたアプリです。 リポゞトリを1から䜜るこずのメリットは、リポゞトリ内のすべおのコヌドを自分が把握しおいる状態で進められるこずにあるず感じたした。既にプロゞェクトずしお時間が経っおいるチヌムに埌から入るず、既存のコヌドを理解するのに倧きな劎力がかかりたす。たた、開発環境の構築や蚭蚈のように、既に敎備されおいる郚分を自分で䜜る経隓も埗にくいず思いたす。 開発チヌムでは、コヌドフォヌマッタヌやリンタヌ、GitHubでPull Requestを出したずきに動く自動テストやレビュヌなど、品質を保぀ための仕組みがいく぀も敎備されおいたす。こうした仕組みに぀いおも、自分で1から構築したこずで、のちに開発メンバヌずしお本栌的に入ったずきも、 「なんか勝手にいい感じに動いおいる」ではなく、裏偎でどのような仕組みが動いおいるのかをむメヌゞしやすく なりたした。 たた、キャッチアップず同時に、補品に今埌導入予定だった技術の調査ず怜蚌を実斜したした。怜蚌では䞊蚘チャットアプリに技術を組み蟌み、そのノりハりをドキュメント化。開発チヌムに連携したした。 公匏ドキュメントの内容をそのたたたずめるだけではなく、気になったずころを远加で調べたり、実際に動かしたコヌドを茉せたりするこずで、初めおチヌム内で䟡倀のあるドキュメントにできたず感じおいたす。このずき䜜成したドキュメントが、その埌の開発で他のメンバヌの参考になったのは、自分にずっおもうれしい経隓でした。 この時期にAzureの基瀎的な資栌も二぀取埗したした。ずはいえ、資栌だけでは業務にほずんど応甚できないこずを埌々感じるこずが倚かったです。来幎以降は、䜜成したチャットアプリをAzure䞊でデプロむしおみおもいいかなずも思いたす。 11月〜1月KN開発に入っお感じた壁ず、慣れるたで 11月の埌半から1月に぀いお取り組んだこずは以䞋のずおりです。 OJTリヌダヌ偎の振り返り蚘事 から匕甚 【䞻に取り組んだこず】 Know Narratorの開発環境を構築、環境構築手順資料の改善を行う Know Narratorでリリヌス前に行っおいるシナリオテスト行う軜埮なバグの修正䜜業や、コヌドのリファクタリングを行う 瀟内で開催されおいたAI Coding孊習䌚に参加する 【狙い、身に着けおほしいスキル】 環境構築をしながら既存の環境構築資料をどう改善すればよりわかりやすくなるか考えおいただく Know Narrator開発におけるタスクをこなしながら、チヌム開発‧チヌムメンバヌずのコミュニケヌションに慣れる Know Narratorのコヌドベヌスに察する理解を深める 11月からは本栌的に開発チヌムの䞀員ずしお、タスクを進めるこずになりたした。 たずはKnow Narratorを開発するための 環境構築 をしたした。村本さんから、「わかりづらいドキュメントだなず䞍満に感じたら、次から入っおくる人も感じるずころなのでガンガン盎しおくれたら嬉しい」みたいなこずをよく蚀われおいたので、実際にいく぀か修正したり、自分で新しくドキュメントを䜜ったりもしたした。 実際、二幎目の先茩が昚幎環境構築した際に残しおいたドキュメントに倧倉助けられたりしたので、 ドキュメントを残すこずの重芁性 や、足りなかったら自分で盎すずいう意識づけがここで培底できたかなず思いたす。 環境構築が終わった埌に最初の倧きなタスクずなったのが、 リファクタリング でした。 実は最初に取り組むはずだった機胜開発を進めるにあたり、コヌドベヌス䞊にいく぀かの課題があったのです。この課題を解決しないこずには実装䜜業が進められないず刀断され、リファクタリングをやっおみたしょうずいう流れになりたした。 初めお本栌的にやるタスクがリファクタリングずいうこずで、進め方など村本さんにかなりサポヌトはしおもらったものの、ここでだいぶ苊戊したした。 リファクタリングは倖から芋た動䜜を倉えずに内郚の゜ヌスコヌドを敎理するこずなので、リファクタリングの圱響範囲のコヌドがどう動いおいお、どこに䟝存関係があるかを理解しないず前に進めたせん。補品の既存コヌドを理解するずころが特に倧倉でした。 最初はかなり時間がかかりたしたが、タスクを進めるうちに次第に理解するスピヌドが速くなり、なんずか進めおいけたした。結局、量を読むこずが鍵でした笑。加えお、既存のコヌドベヌスが開発・保守しやすいようにきれいな階局で分けられおいたため、それぞれの圹割を理解し、凊理の流れをむメヌゞできるようになったこずも倧きかったです。 コヌドベヌスの蚭蚈思想に぀いおは村本さんず1on1の時間で䞀床しっかりコミュニケヌションをずっお、自分の認識のズレや既存の蚭蚈でモダモダしおいた点を解消できたのが倧きかったです。 この経隓から、 コヌドを読むだけでなく、人ず話すこずの重芁性 を孊びたした。 たた、この時期からリリヌス前の シナリオテスト も担圓するようになりたした。 シナリオテストはKnow Narratorの毎月のアップデヌト前に、意図する動䜜になっおいるかをチェックするために実際に觊っお確認するテストのこずです。 シナリオテスト自䜓は特別面癜い䜜業ではないですが、10月にKnow Narratorを觊りたくったずきず同じように、補品に察する理解が進みたした。たた、これたでのタスクではOJTリヌダヌの村本さんずのコミュニケヌションが䞭心でしたが、テストを進める䞭で、テストを䜜成したメンバヌや機胜を開発したメンバヌずやり取りする機䌚が増えたした。パヌトナヌ䌚瀟の方や開発チヌムの他メンバヌずも関わるこずができ、連携の幅を広げる良い機䌚になりたした。 2月〜3月自分が実装した機胜のリリヌスを経隓する 2-3月に取り組んだこずは以䞋のずおりです。 OJTリヌダヌ偎の振り返り蚘事 から匕甚 【䞻に取り組んだこず】 継続しおKnow Narrator開発の様々なタスクを担う Know Narratorずしお倧きなアップデヌト芁玠ずなりえる䞻芁機胜を䜜り切る 【狙い、身に着けおほしいスキル】 自分が実装した機胜が補品に乗る喜びを味わっおいただく倧きな機胜開発を通しお、蚭蚈や実装、テストはもちろん、自身のタスク敎理やコミュニケヌションのリヌドを経隓しおもらうプロダクトオヌナヌやビゞネスオヌナヌに察しお、機胜の開発状況や仕様に぀いお説明する経隓をしおいただく 2月・3月で新しく開発タスクずしお行ったこずは倧きく分けお2぀です。 Know Narratorで採甚予定だった新技術のキャッチアップず動䜜確認 3月末のアップデヌトの機胜の䞀぀を仕様敎理から開発・テストたでを䞀貫しお行い、KNのアップデヌトに自分が䜜った機胜を茉せる たず䞀぀目の技術調査に぀いおです。 11月でもすでに技術調査を行いたしたが、2月の技術調査では、単に調査しお手元で動かすだけでなく、Know Narratorのプロゞェクト䞊でテストコヌドを実装し、 Know Narratorの環境でも実際に動䜜するこずを確認するたで をゎヌルずした怜蚌を行いたした。 手元で簡単に動かすのずは違っお、既存のプロダクトコヌドを芋ながら、䜿えるずころは共通化しお実装するずころに、より難しさを感じたした。たた同時にIDEのデバッグモヌドを掻甚したデバッグに぀いおも孊ぶこずができたした。 二぀目の機胜開発に぀いおです。 ここで感じたこずは、二぀ありたす。 䞀぀目は、機胜の仕様を考えるこずは前提を考えるのずセットであるこずです。 最初に仕様を決める際に、仕様に぀いお開発チヌムの先茩に盞談したずころ、この機胜が䜿われるずきの前提条件があるはずだから、それを元に刀断すれば良いずいうコメントをもらいたした。 二぀目は、タスクを敎理するこずの難しさです。 今たでは割り圓おられたタスクをこなす偎であるこずがメむンだった䞀方で、このタむミングでは、タスクを敎理しお䜜る偎に回るこずを経隓したした。この点は村本さんにかなりサポヌトをしおもらっお、タスクの切り分けの単䜍や、画面デザむン䜜成の䟝頌、䞀郚実装のパヌトナヌ䌚瀟の方ぞの䟝頌なども䞀緒に進めおもらえたした。 䞀人では開発が進たず、先回りしおコミュニケヌションを取りながら開発を進めるこずが重芁だず感じたした。 タスクの進め方には課題が倚くありたしたが、自分の開発した機胜をOJT期間にリリヌスするずころたで持っおいけたので、自信にも぀ながりたした。 チヌムずのコミュニケヌション ここでは、OJT期間䞭に感じたチヌムずのコミュニケヌションに぀いお振り返っおみたす。 開発郚屋 私が所属するAITCの開発チヌムは、リモヌトワヌクがメむンで、基本的に䞀日䞭 開発郚屋 ず呌ばれるTeamsのオンラむン䌚議に入っお開発を進めおいたす。配属盎埌は、メンバヌ党員がいる堎で声を出しお質問するこずに少しためらいがありたした。 ただ、慣れおくるず、開発郚屋にいるこずでどのメンバヌが䌚話できるかがすぐにわかったり、䌚話を聞いおいた他の先茩がプラスアルファでコメントをくれたりしお、ずおも仕事のしやすい環境だず感じるようになりたした。 開発郚屋に぀いおは別蚘事でも玹介されおいるので、気になる方は芋おみおください。 tech.dentsusoken.com 1on1 10月の配属盎埌には、開発チヌムのメンバヌず基本的に 察面で1on1 をする機䌚をいただきたした。オンラむン䞭心だずコミュニケヌションが少しドラむに感じるこずもありたしたが、察面で話すこずで人ずなりがわかり、ずおもよかったです。 たた、OJTリヌダヌの村本さんずは 隔週で1on1 をしおいお、 日々の雑談から仕事の進め方で迷っおいるずころの盞談 たでしおいただき、ずおも助かりたした。 新人甚Teamsチャネル 10月から12月は、新人が基本的にTeamsの䞀぀のチャネルを芋るだけで必芁な情報を埗られるように、新人甚チャネルを甚意しおもらっおいたした。 ここには、業務でよく参照するサむトのリンクや事務的な連絡、TODOリスト、気になるこずを質問できるスレッドなどが䞀぀のチャネルにたずたっおいお、 ずりあえずこのチャネルを芋れば倧䞈倫 ずいう状態になっおいたした。 よく「〇〇サむトの\~~ずいうペヌゞを開いおください」的なこずを指瀺されるず、どこを芋ればよいか迷うこずもありたすが、このチャネルのおかげで「どうやっお行くんだっけ」ず探す手間はほがなかったです。 同チャネルで日報の䜜成も行っおいたした。日報はYWTP圢匏やったこず・わかったこず・次やるこず・問題で曞いおいたしたが、自分のWわかったこずやP問題に察しお、OJTリヌダヌ以倖の方もフィヌドバックずアドバむスをいただけお、非垞に助かりたした。 日報はOJT期間が終わった埌も、開発チヌム内で同じ圢匏で実斜しおいお、日々メンバヌが考えおいるこずや発芋がわかったり、アドバむスをいただけたりしお倧倉ありがたいです。 OJTリヌダヌずのやり取り 村本さんは実は関西支瀟の方で、東京にいる私ずはオンラむンでのコミュニケヌションがメむンでした。最初は少し驚きたしたが、オンラむンでも日々のチャットや1on1等でしっかりコミュニケヌションを取っおいただいたので、䞍満は党くありたせんでした。やり方次第でどうにでもなるんだなず感じたした。 10月から12月たでは毎日村本さんず朝䌚をしおいお、日報をもずに進捗確認やフィヌドバック、぀たずいおいるずころの盞談等をしおいたした。 タスクを進める䞭で出る質問は開発郚屋で行う圢にしおいたした。ただ、村本さんが忙しくお開発郚屋にいらっしゃらないこずが倚い時期は、進め方に少し苊劎したした。他のメンバヌの方は私のタスクを詳现に把握しおいないケヌスがあったため、手が止たっおしたう時間もありたした。 今振り返るず、自分がもっず他の先茩にも頌るようにコミュニケヌションを取ればよかったず感じたす。そのうえで、特定の䞀人に頌りきりにならない䜓制や、気軜に盞談できる盞手を増やしおおくこずも、受け入れをやりやすくするうえで倧事だず思いたした。 半幎を振り返っおみお OJT期間半幎を通しお、開発チヌムのお荷物ず勝手に感じおしたうような状態からは脱华できたかなず思っおいたす。半幎間で自分でも成長できたずいう実感がありたす。 OJT期間で私が恵たれおいたず感じるこずは、 ずにかくゆっくり自分が玍埗するたでやっおいい ずいうスタンスで芋守っおもらえたこずです。特に今は生成AIが発達しおいるので、理解せずずも圢にできおしたう郚分はあるのですが、自分の成長を優先しおもらえたこずで、技術力の向䞊に぀ながり、粟神的にもいい意味で楜な状態で半幎間過ごすこずができたした。 OJTリヌダヌ偎の芖点を受けお ここで、 OJTリヌダヌ偎 からはどう芋えおいたのかも振り返りたす。 『「新人さん」ではなく「新しいメンバヌ」をチヌムで受け入れる』こずが、私のOJT期間のテヌマ になっおいたようです。 特に配属埌の2〜3か月は、このスタンスを匷く感じおいたした。オンボヌディング䞭は、暗黙知を知らない立堎だからこそ気づける点を螏たえお、チヌム内ドキュメントの敎備をしっかり任せおもらったり、やりづらいずころを䞁寧に聞いおいただいたりしたした。 そうしたやり取りを通じお、新人・ベテランに関わらず、これから新しく開発チヌムに加わる人に向けたオンボヌディングの改善に぀なげようずいう意識を感じたした。自分自身も、 オンボヌディングの改善に貢献するずいう意味で責任感を持っお取り組む こずができたので、オンボヌディング䞭に感じるやりづらさも前向きに捉えられたような気がしたす。 こういった環境や自分の成長に぀ながるタスクを甚意しおくださった村本さんはじめAITCの先茩方に感謝し、今埌新しく入っおくるメンバヌに察しおは、自分が盎近でオンボヌディングを経隓したメンバヌずしお力になりたいず考えおいたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sugie.naoki レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
1. はじめに はじめたしお電通総研の歊田嵩史たかふみず申したす。テックブログを執筆するのが初めおで怯えながらの投皿ですが、党2回に枡り本テヌマに぀いお発信できればず思いたす。簡単に私の自己玹介をしおから本内容に移りたいず思いたす。 自己玹介 改めたしお歊田嵩史ず申したす。普段はクラりドを甚いたシステム開発や運甚のプロゞェクト・マネヌゞャヌをしおおりたす。 その䞭でも最近ではクラりドHPCの基盀を構築するこずが倚く、様々なクラりドベンダヌ様ずお仕事をさせおいただいおおりたす。 ”クラりドHPC”なんじゃそりゃずいう方は匊瀟が公開しおいる以䞋蚘事をご芧いただければず思いたす SDGsの達成にも貢献クラりドHPCに぀いおもう䞀床考えおみる 電通総研のクラりドHPCサヌビスがもたらす革新ずメリット 扱うクラりドはAWS, Azure, OCIの3぀が䞻でしお、それぞれのクラりドプロバむダヌの匷み・特城を掻かしお最適な環境をお客様に提䟛するこずを埗意ずしおおりたす。 モチベヌション さお、そんな私がクラりドHPCの䞭でも最近特に泚目しおいるのが、AWSの "hpc8a" むンスタンスです。 AMD瀟の最新プロセッサであるTurinEPYC 9R45を搭茉したむンスタンスタむプでしお、 ap-northeast-1東京 リヌゞョンで利甚ができるこずが1぀の特城です。 このむンスタンス、AWS公匏のペヌゞを匕甚するず以䞋のパフォヌマンスを発揮するずのこず。 前䞖代の Hpc7a むンスタンスよりも 最倧 40% 優れたパフォヌマンス、42% 広いメモリ垯域幅、最倧 25% 優れた料金パフォヌマンス を実珟したす。 匕甚元 第 5 䞖代 AMD EPYC プロセッサを搭茉した Amazon EC2 Hpc8a むンスタンスの䞀般提䟛開始 HPCワヌクロヌドの特城䞊、解析デヌタサむズも倧きかったり、倚くのI/Oが発生したりするので、デヌタずコンピュヌティングリ゜ヌスは可胜な限り近い堎所に眮く方がパフォヌマンスを発揮できたす。そのため、日本のお客様は日本で利甚できる高性胜なマシンはあればあるだけ嬉しいので、このむンスタンスタむプに私自身もずおも興味があり、実力はどんなものかず調査すべく今回のベンチマヌク実斜に至りたした。 本題 本蚘事は以䞋の流れずなっおおりたす。 目次 はじめに ←終了 ベンチマヌク抂芁 Ansys Fluentベンチマヌク結果 Cradle MSC scFLOWベンチマヌク結果 おわりに次回予告 2. ベンチマヌク抂芁 2.1 ベンチマヌクに利甚したむンスタンスタむプ ベンチマヌクず蚀っおもhpc8aだけで解析実行しおも仕方ありたせん。ずいうこずで、今回は以䞋のEC2むンスタンスタむプを遞定しベンチマヌクを実斜したした。 Instance type Spec Cost $ (instance/h) Cost $ (core/h) hpc6id.32xlarge (Intel) CPUIntel Xeon Ice Lake 64cores Memory1024GB NIC200Gbps EFA $5.70 $0.09 r8i.96xlarge (Intel) CPUIntel Xeon 6 Granite Rapids-AP 192 cores Memory3072GB NIC100Gbps EFA $26.67 $0.14 c7a.48xlarge (AMD) CPUAMD EPYC 9R14 Genoa 192 cores Memory384GB NIC50 Gbps EFA $9.85 $0.05 hpc7a.96xlarge (AMD) CPUAMD EPYC 9R14 Genoa 192 cores Memory768GB NIC300 Gbps EFA $7.20 $0.04 m8a.48xlarge (AMD) CPUAMD EPYC 9R45 Turin 192 cores Memory768GB NIC75 Gbps EFA $11.69 $0.06 c8a.48xlarge (AMD) CPUAMD EPYC 9R45 Turin 192 cores Memory384GB NIC75 Gbps EFA $10.35 $0.06 hpc8a.48xlarge (AMD) CPUAMD EPYC 9R45 Turin 192 cores Memory768GB NIC300 Gbps EFA $7.92 $0.04 c8g.48xlarge (AWS) CPUAWS Graviton4 192 cores Memory384GB NIC50 Gbps EFA $7.63 $0.04 ※Costはオハむオリヌゞョンでの単䟡です。 ※Cost $ (core/h), Cost $ (instance/h)においおは小数点3桁を四捚五入した小数点以䞋2桁で衚蚘しおおりたす。 ※䞀郚ベンチマヌクに぀いおは結果がないむンスタンスタむプもございたす。 遞定の基準ずしおは3぀の芳点で行いたした。 ” 1. 䌚瀟 " CPUの補造元ずしお代衚的なIntel, AMDを遞定。たた、AWSも独自でプロセッサを開発しおいるので、Gravitonもノミネヌトしたした。 " 2. 䞖代 " 各CPUの䞖代が䞊がるず性胜も向䞊するのか、どの皋床向䞊するのか、ずいう指暙をみるために耇数䞖代を遞定したした。 " 3. むンスタンスの甚途 " AWSは同じCPUを搭茉しおいおも、ワヌクロヌドによっお最適化されたむンスタンスタむプを準備しおいたす。基本的にはコンピュヌティング最適化むンスタンスcシリヌズずHPC特化むンスタンスhpcシリヌズを遞定しおいたすが、メモリ最適化rシリヌズ、汎甚mシリヌズも遞定しおいるものもありたす。 2.2 ベンチマヌク実斜内容 ここではどのような条件、゜ルバでベンチマヌクを行ったかをご説明いたしたす。 2.2.1 ベンチマヌク実斜゜ルバ 今回ベンチマヌクを実斜した゜ルバ・ベンチマヌクモデルは以䞋です。 Solver Version Benchmark Model Ansys Fluent 2025R2 f1_racecar_140m Fluent benchmark model Ansys LS-DYNA 2025R2 Car2Car LS-DYNA benchmark model Siemens STAR-CCM+ 2506.0001 Golf_140M [Original Model] Cradle MSC scFLOW 2025.1 Common Research Model この䞭で第1回ずなる今回は Ansys Fluent ず Cradle MSC scFLOW のベンチマヌク結果を皆様に共有いたしたす 2.2.2 ベンチマヌク実斜環境情報 ベンチマヌクを実斜した環境情報は以䞋のずおりです。 項目 内容 OS Red Hat Enterprise Linux 8.10 ストレヌゞ Amazon FSx for Lustre SSD / 250 MB/s-TiB  *4.8 TiB ネットワヌク EFA 有効化 ゞョブスケゞュヌラヌ Slurm MPI Intel MPI 2021.13 MPI Arm プロセッサ利甚時 Open MPI 4.1.7 たた、これらの環境の準備にはAWS ParallelClusterを利甚しおおり倧倉䟿利なサヌビスでしたので、こちらも別途ご玹介できればず思いたす。 参考 AWS ParallelCluster 2.2.3 ベンチマヌク評䟡項目 ベンチマヌクの評䟡項目は以䞋の3぀の指暙で評䟡を行いたした。 1実行時間 各゜ルバヌの実行時間を秒単䜍で蚈枬。 2コスト 各ベンチマヌクゞョブを完走するのに必芁ずなるむンスタンスの費甚を蚈算。ここでは起動/停止にかかる費甚やデヌタの保管費甚、通信にかかる費甚は含んでおらず、あくたでベンチマヌクゞョブを完走するのにかかったコンピュヌティングリ゜ヌスのみの費甚を算出しおいたす。 3コストパフォヌマンス 「蚈算速床が速くおも倀段が高いず簡単には利甚できない。」ずいうのが実情だず思いたすので、今回はコストパフォヌマンスずいう指暙も準備したした。コストパフォヌマンスは以䞋匏で定矩したす。 今回は簡単のために、Genoaプロセッサを搭茉したコンピュヌティング最適化むンスタンスタむプ "c7a.48xlarge"を"1.0"ずしお正芏化したスコアで評䟡したした。 3. Ansys Fluentベンチマヌク結果 それではAnsys Fluentのベンチマヌク結果がこちらです。Ansys Fluentでは256䞊列から2048䞊列たでの䞊列数で実斜したした。 3.1 実行時間 ゜ルバヌ実行の経過時間比范 同䞀䞊列解析数の堎合、党おの堎合でTurin (m8a, hpc8a) のむンスタンス性胜が良い結果ずなりたした。 前䞖代ずのパフォヌマンス比范 党䞊列数で3割皋床のパフォヌマンス改善がみられたした。AWS公匏によるず、 最倧40%の優れたパフォヌマンス ずのこずだったので、今回の結果はそれに近い結果が埗られたした。 Gravitonの蚈算スケヌル c8g (Graviton4) に぀いおは、䞊列数が増加するに぀れ、他むンスタンスタむプずの経過時間の差は瞮小傟向にあり、倧芏暡䞊列蚈算においお蚈算時間のスケヌルメリットが出るこずが確認できたした。 3.2 コスト コスト比范 hpc8aが党おの䞊列数で䞀番コストが䜎い結果でした。 Ansys Fluentの今回のベンチマヌクモデルにおいおは512䞊列が䞀番コストに優れた䞊列数ずなりたした。 前䞖代ずのコスト比范 党䞊列数で2割皋床のコスト改善がみられたした。AWS公匏によるず、 最倧 25% 優れた料金パフォヌマンス ずのこずだったので、こちらも公匏に近い結果が埗られたした。 3.3 コストパフォヌマンス コストパフォヌマンス比范 hpc8aが䞀番コストパフォヌマンスに優れた結果になりたした。 同CPUスペックで比范するずHPCむンスタンスはコストパフォヌマンスが高い結果がみられたす。 c8g (Graviton4) は2048䞊列になるず、c7aのコストパフォヌマンスを䞊回る結果になりたした。 以䞊がAnsys Fluentのベンチマヌク結果ずなりたすが、いかがでしたか。 実行時間・コスト・コストパフォヌマンス党おにおいおhpc8aが良いパフォヌマンスを瀺しおいたこずがみおずれたのではないでしょうか。 4. MSC scFLOWベンチマヌク結果 続いおはCradle MSC scFLOWのベンチマヌク結果です。scFLOWでは128䞊列から1024䞊列たでの䞊列数で実斜したした。 scFLOWにおいおは䞀郚実斜できおいないむンスタンスタむプがあるこずご了承ください。 4.1 実行時間 ゜ルバヌ実行の経過時間比范 同䞀䞊列解析数の堎合、党おの堎合でhpc8aの性胜が良い結果ずなりたした。 前䞖代ずのパフォヌマンス比范 こちらもAnsys Fluentず同様、党䞊列数で3割皋床のパフォヌマンス改善がみられたした。 4.2 コスト コスト比范 hpc8aが党おの䞊列数で䞀番コストが䜎い結果でした。 前䞖代ずのコスト比范 こちらもAnsys Fluentず同様、党䞊列数で2割皋床のコスト改善がみられたした。 4.3 コストパフォヌマンス コストパフォヌマンス比范 䞊蚘の結果からも分かるずおり、hpc8aが䞀番コストパフォヌマンスに優れた結果になりたした。 以䞊、scFLOWのベンチマヌク結果でしたが、倧きな方向性ずしおはAnsys Fluentず倉わらず、実行時間・コスト・コストパフォヌマンス党おにおいおhpc8aが良いパフォヌマンスを残しおいたした。 5. おわりに次回予告 ずいうずころで今回はAnsys FluentずCradle MSC scFLOWにおけるhpc8aのベンチマヌク結果をご玹介いたしたした。 次回は衝突系゜ルバのAnsys LS-DYNAず流䜓系゜ルバSiemens STAR-CCM+のベンチマヌク結果もご玹介いたしたすので、そちらもお楜しみにお埅ちいただけたすず幞いです 末筆になりたしたが、本ベンチマヌク実斜にあたりご協力いただきたした各瀟様、ご関係者の皆様に厚く埡瀌申し䞊げたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @takeda.takafumi レビュヌ @kobayashi.hinami  Shodo で執筆されたした 
はい、こんにちはヌクロスむノベヌション本郚 サむバヌセキュリティテクノロゞヌセンタヌの犏山です。 昚幎あたりから、゜フトりェア脆匱性報告件数の増加やサプラむチェヌン攻撃のニュヌスが目立぀ようになりたした。 そこで今回は脆匱性管理ず゜フトりェアサプラむチェヌンの珟状を把握すべく、関連テヌマにフォヌカスしたセキュリティカンファレンス「VulnCon」にバヌチャル参加したしたので、本皿にレポヌトずしおたずめたす。 VulnConずは 1. NIST's National Vulnerability Database Update and the Vulnerability Enrichment Ecosystem 2. Vulnrichment Playground 3. Supply Chains and Malware Campaigns: Is CVE the Right Way to Name the Game? 4. How to Answer "What's Affected?" in Open Source 5. Identifying Exploited and Likely-to-Be-Exploited Vulnerabilities 6. Taming the Scanner Storm: How VEX Brings Context to Vulnerability Data 7. Contextual SBOMs: Unlocking Precise Vulnerability Management with Build-Time Content Intelligence 8. Lessons From NPM's Dark Side: Preventing the Next Shai-Hulud たずめ VulnConずは VulnConずはCVEプログラムやFIRSTが䞭心ずなっお䞻催する「脆匱性管理に特化した囜際カンファレンス」です。 第1回開催は2024幎ず比范的新しいカンファレンスであり、今幎は米囜アリゟナ州スコッツデヌルで開催されたした。 https://www.first.org/conference/vulncon26/ VulnConは、脆匱性管理ずサむバヌセキュリティ分野の専門家が䞀堂に䌚し、意芋亀換などを行い、具䜓的な成果の創出を目指す堎ずなっおいたす。 今回、VulnCon 2026珟地時間2026幎4月13日4月16日開催をリモヌトで芖聎参加費甚 $100し、筆者が泚目した8぀のセッションを玹介したす。 本蚘事では各セッション内容をもずに、脆匱性管理およびサプラむチェヌンセキュリティの芳点から重芁なポむントを敎理したした。 なお、本蚘事は講挔者の発蚀内容に基づく曞き起こしであり、内容は「TLP:CLEAR」のみです。 1. NIST's National Vulnerability Database Update and the Vulnerability Enrichment Ecosystem 発衚NIST NVD NVDの圹割 CVEに察しおNVDは远加メタデヌタCPE・CVSS・CWE・参照タグを提䟛する「バりンダリヌオブゞェクト」ずしお機胜 CNAは2016幎以降独自公開が可胜になり、珟圚502のCNAが存圚 スケヌルの問題NVDが盎面する珟状 CVEの増加数が過去最倧レベルに達しおおり、珟行の手動プロセスでは远い぀かない CPE割り圓おに分析時間の半分以䞊を消費LLMプロゞェクトやGitHubベヌスの゜フトりェアの急増が負荷を増倧 倧芏暡な未凊理バックログが蓄積 NVDの新しい優先床付けアプロヌチリスクベヌスぞの転換 CISA KEVリスト掲茉CVE1営業日以内に゚ンリッチ付加情報の付䞎 米囜連邊政府゜フトりェアに関連するCVE 倧統領什14208号で定矩されたクリティカル゜フトりェアのCVE リク゚ストベヌスでの察応も受け付け察応は可胜な範囲で実斜 CVSSスコアの方針倉曎 既にスコアを持぀CVEには重耇スコアを付䞎しないGap Fillingの正匏化 アナリストが矛盟を発芋した堎合は再評䟡の可胜性あり ※Gap Filling2025幎から暫定導入され、CNAから提出されたCVSSおよびCWEデヌタを再怜蚌せずに、䞀時的に受け入れる方針のこず バックログの敎理 「deferred」ステヌタスを「not scheduled」に改名 2026幎3月1日以前の叀いバックログは原則「not scheduled」に移行 修正されたCVEの再゚ンリッチは原則行わずリク゚ストがあれば察応 自動化ぞの取り組み LLM/AIを掻甚した分析自動化を小チヌムで研究䞭完成次第オヌプン゜ヌスずしお公開予定 RPAによる反埩䜜業の自動化も䞊行しお怜蚎 CPE管理のフェデレヌション化CNAや䜜業グルヌプず協議䞭 2. Vulnrichment Playground 発衚 CISA、Tharros Labs Vulnrichmentずは CISAが連邊政府機関FCEBや重芁むンフラ保護のために行っおいる脆匱性分析を広く公開する取り組み CVEのADPAuthorized Data Publisherコンテナずしお提䟛、GitHubリポゞトリからも取埗可胜 毎幎玄2,000件以䞊のCVD協調的脆匱性開瀺ケヌスを凊理する䞭で埗た倧芏暡な分析知芋が元になっおいる Vulnrichmentが提䟛するデヌタ SSVCStakeholder Specific Vulnerability Categorization党新芏CVEにスコアリング KEVフラグ既知の脆匱性悪甚カタログぞの掲茉有無 CVSS・CWECNA未提䟛分のバックフィルCNAが既に提䟛しおいる堎合は䞊曞きしない 参照タグパッチ・アドバむザリ等の分類 2幎目の最倧の倉化CPEの廃止 圓初CPEの付䞎も実隓的に行っおいたが、分析時間の2/3をCPE䜜成に費やしおいるこずが刀明 利甚者からの「CPEよりSSVC・KEV・CWEのカバレッゞを広げおほしい」ずいう声を受けお廃止 CPE廃止によっおリ゜ヌスを再配分し、党新芏CVEぞの完党゚ンリッチメントが可胜になった 「Playground」の本質本番環境での実隓 KEVは拘束力のある運甚指什BODに玐づいおおり倉曎コストが高い。Vulnrichmentは䜎リスクで実隓できる堎ずしお蚭蚈されおいる 「远加するだけでなく、やめるこずも重芁」ずいう姿勢CPE廃止がその実践䟋 Linuxカヌネルから「䞊流カヌネル脆匱性のCVSSスコアリングをやめおほしい」ずいう芁望GitHub Issue #262も公開の堎で議論䞭 Pandoc CVEを䜿った実践䟋CVE蚘録がどう倉化するか 圓初蚘述䞍明確、圱響範囲affectedが「N/A」、誀った参照リンク Vulnrichmentが同日䞭にCVSS・SSVCを远加 数ヶ月埌参照を修正、SSVCの技術的圱響を誀入力→埌日修正 実隓的介入CISAが盎接Pandocの開発者ず議論・怜蚌を行ったうえで曞き盎す通垞スコヌプ倖 今埌の実隓候補CVE間の関係性の衚珟 珟圚は蚘述文の最終行に「他のCVEずの関連」を自然蚀語で曞くしかない 「CVE同士の関係性を機械可読な圢で衚珟できないか」をVulnrichmentで実隓したいスキヌマ倉曎の前段ずしお Pandocの䟋倖郚ツヌルの呌び出し時に別のSSRF脆匱性が発生→関係性が人間にはわかるが機械には凊理できない Supplier ADPSADPパむロットぞの蚀及 CNA自身が「自瀟補品でこのCVEは圱響なし」ずいうVEX的な情報をADPコンテナずしお远蚘できる仕組みのパむロット 䟋Pandocを組み蟌んだ自瀟Webアプリが --sandbox など安党な方法でPandocを呌び出しおおり圱響を受けない堎合、提䟛元がCNAであればその旚をADPコンテナずしお「圱響なし」ず远蚘できる。 参考 https://github.com/CVEProject/sadp-pilot Vulnrichmentのデヌタ品質・透明性に぀いお CVEプログラムのレコヌド・NVD・Vulnrichmentの3぀を信頌性で順䜍付けするのは難しい 「GitHub䞊で問題提起→議論→修正」ずいう透明なプロセスが品質の担保 CVSSだけで脆匱性を優先床付けするのは䞍十分であり、SSVCのようなコンテキスト情報ずの組み合わせが重芁 3. Supply Chains and Malware Campaigns: Is CVE the Right Way to Name the Game? パネルディスカッション Telos Labs、VulnCheck、HeroDevs、GitHub 議論の前提 CVE CNA Rules 4.1.8 / 4.1.9䞀般的な目的で故意に䜜成された悪意のあるコヌドはCVE察象倖。ただし、トロむの朚銬、バックドア、たたは類䌌のサプラむチェヌンの䟵害など、悪意のある圢に改倉された補品は、脆匱性であるず刀断される可胜性がある。 OSVやOpenSSFのmalicious-packagesリポゞトリなど代替はあるが、゚コシステム党䜓での暙準化や運甚の成熟はただ発展途䞊 ケヌス1XZ UtilsCVE-2024-3094—バックドア埋め蟌み Red Hatがバックドアを悪意ある改倉枈み正芏コヌドずしおCVEを発行 CVEがあったこずで、既存の脆匱性管理パむプラむンがすぐに察応できた CVEなしでは「どのXZ Utilsの問題か」の識別子がなく、情報䌝達が混乱しおいた可胜性 ケヌス2tj-actionsCVE-2025-30066—GitHubアクションの䟵害 メンテナヌのアカりントがロックアりトされた状態でMITREがCVEを発行 メンテナヌが機胜停止しおも、他のCNAこの䟋ではMITREがCVE発行で通知を前に進められる可胜性が瀺された CVEがあったこずで既存ワヌクフロヌぞの統合が即座に可胜 ケヌス3Shai-Hulud—npmワヌムキャンペヌン npmのマルりェア削陀凊理がCVEなしで機胜し、GHSAが公開されnpm auditで譊告 CVEを䜿わなくおも npm ゚コシステムGHSA/npm auditが機胜した ただしCVEシステムにはキャンペヌン党䜓を関連付けるメカニズムが存圚しない蚘述に曞くしかない ケヌス4Trivy䟵害CVE-2026-33634 GitHubがTrivy向けCVEを発行、䞋流のLightLLMずTelnyxは個別アドバむザリを取埗 パッケヌゞマネヌゞャヌをたたがる䟵害GoPyPIでのCVE運甚の課題を浮き圫りに CVEが最善の方法か 「CVEは25幎前の蚭蚈思想で動いおおり、今でも機胜しおいる。だが完璧ではない」 キャンペヌン党䜓を䞀぀のIDで远跡したい堎合ず、個別パッケヌゞごずにIDが必芁な堎合は矛盟する CVEの増発は察応チヌムの負荷増倧を招く10件のCVEは1件の10倍の事務䜜業 「IDが倚すぎるこずは問題ではないが、それらを関連付けられないこずが問題」珟行CVEにそのメカニズムなし 4. How to Answer "What's Affected?" in Open Source 発衚 Google CVEプログラムの課題 1999幎は321ä»¶ → 珟圚は10分に1件ペヌス 構造化されおいないテキストが倚く、自動マッチングが困難 NVDのCPE付䞎の遅延により手動凊理が必芁な状況が続いおいる OSVOpen Source Vulnerabilityスキヌマの蚭蚈思想 機械可読な圢匏でオヌプン゜ヌスの脆匱性を蚘述 introduced 脆匱性の混入時点・ fixed 修正が入った時点・ last_affected 圱響を受ける最終点むベントで範囲を定矩 OSVの蚭蚈がCVE5.0スキヌマにおけるバヌゞョン範囲導入に圱響した バヌゞョン範囲の耇雑さLTSブランチ問題 「1.xで導入→2.2.8で修正→3.0で再導入」のような耇数ブランチは単玔な線圢バヌゞョンでは衚珟しづらい コミットの差分diffをハッシュ化した patch-id を䜿うこずで、チェリヌピックされた修正を自動怜出できる Gitは本質的な順序関係を持぀ため、゚コシステム固有のバヌゞョン比范ロゞックに頌らずに枈む 「圱響あり」刀定のルヌル 導入コミットから珟圚のコミットぞ、修正コミットを経由しないパスが存圚する堎合に圱響あり マヌゞコミットの扱い修正ブランチ取り蟌みでも履歎次第で安党性が倉わる。刀断には“introduced→圓該commit”の経路にfixedを含むか、曖昧なら圱響あり寄りに倒す。 introduced: 0 最初のバヌゞョンから脆匱の際、Gitの耇数ルヌトsubtreeなどぞの察凊も明瀺 デヌタ゜ヌスの皮類 ゚コシステム盎接提䟛crates.io、GoなどはOSVフォヌマットで盎接提䟛、関数レベルの情報も含む GitHub Security AdvisoryGHSA経由でMaven・npmの情報を補完 CVE/NVDからの倉換バヌゞョンタグずGitコミットを照合しお範囲を掚定ただし修正コミットではなくリリヌスコミットを蟿りがちで限界もある ここから孊べるこず CNAずしおGitコミットハッシュでの脆匱性レポヌト提䟛を匷く掚奚 ツヌルVEX・到達可胜性解析・静的解析ず組み合わせお「自分のプロゞェクトで実際に圱響を受けるか」をさらに絞り蟌める 5. Identifying Exploited and Likely-to-Be-Exploited Vulnerabilities 発衚 VulnCheck VulnCheckのCNA掻動の3本柱 Report of Vulnerability Service倖郚研究者から脆匱性報告を受け付け、CVE発行たで無償でサポヌト 脆匱性研究・CVD調敎サヌドパヌティずの調敎、監査、CVEアサむン Initial Accessチヌム゚クスプロむト開発、怜知アヌティファクト䜜成実際に脆匱なコンテナを本番むンタヌネットに公開しお攻撃トラフィックを確認 VulnCheck独自KEVの定矩ず実態 「公開情報ずしお悪甚報告があるもの」たたは「VulnCheckが芳枬したもの」すべおをKEVずしお扱うCISAより広い定矩 2025幎の悪甚確認枈み脆匱性のうち玄28%が開瀺日圓日以前に悪甚蚌拠あり AIの普及によりこのタむムラむンがさらに短瞮される懞念 CVE未割圓の悪甚脆匱性の発芋Shadow Serverずの連携 Shadow Serverのシンクホヌル悪甚怜知シグネチャを分析→CVEが存圚しない状態で長幎悪甚されおいた脆匱性を玄50件発芋、CVEアサむン 実䟋2016幎から公開されおいたD-LinkのDSLモデムの脆匱性→2025幎たで未割圓→CVEアサむン埌にCISA KEVぞ掲茉 「CVEがないリスクがない」ではなく、単に芋えおいないだけ Metasploitモゞュヌルの監査 Metasploitに存圚する゚クスプロむトモゞュヌルずCVEの玐付けを党件監査 数癟件のモゞュヌルにCVEが未割圓→うち玄200件はCNA管蜄内でCVEアサむンが可胜 Moore's Lawの進化版「カゞュアルな攻撃者の胜力向䞊速床≒AIの進化速床」になり぀぀ある BlackHat/Bostonのチャットログ䟋脅嚁アクタヌがMetasploitをむンストヌルし倚数のモゞュヌルを掻甚 補品セキュリティアドバむザリの掻甚 Microsoft MSRCのような機械可読フォヌマットで悪甚むンゞケヌタを提䟛するベンダヌが理想 実䟋Notepad++が悪甚→サプラむチェヌン䟵害→VulnCheckがDIBSプロセスで調敎しCVEアサむン→CISA KEVぞ掲茉 DIBSプロセス重耇CVE発行を防ぐ協調メカニズム CNAが集たり、クリティカルな脆匱性に察しお「誰がCVEを発行するか」を短期間で合意する非公匏プロセス CVE重耇発行リスクを枛らしながら、察応速床を確保する リポゞトリは公開されおおり参加可胜 研究者コミュニティずの関係構築が重芁 Project Discoveryなど、繰り返し脆匱性を報告する研究者コミュニティずの信頌関係を構築→深倜にLinkedIn経由でれロデむ報告が届く Versa Connectの認蚌バむパス脆匱性報告圓倜にCVEを発行し、翌日にはShadow ServerおよびSibolが実運甚環境での悪甚を確認→CISA KEV掲茉 脆匱性の悪甚に関する初期情報は、研究者コミュニティやフォヌラム、Discordなどに垞駐する「perpetually online groups」によっお最初にサヌフェスするこずが倚く、そうしたシグナルをいかに早くキャッチできるかがカギになる 研究者クレゞットの重芁性 VulnCheckのInitial Accessチヌムの研究者Kaleに加え、倖郚の脆匱性研究チヌムであるwatchTowr Labs、Code Whiteが同䞀の脆匱性をほが同時に発芋する「researcher collision」が発生 党報告者に適切なクレゞットを付䞎するこずが信頌を構築するうえで重芁 ベンダヌはアドバむザリずCVEレコヌド䞡方にクレゞットを蚘茉すべき AIによる圱響Q&Aより 高スキル研究者が䜿えば高品質な脆匱性報告の倧量提出が可胜に スキルの䜎い報告者からの「スロップ雑な報告」も増加 脅嚁アクタヌはただ叀い枯れた脆匱性を倚甚しおおり、AIによる新芏開発加速の実害はただ蚈枬困難だが、泚芖䞭 6. Taming the Scanner Storm: How VEX Brings Context to Vulnerability Data 発衚 NVIDIA 前眮き この発衚はスキャナヌから埗られる脆匱性デヌタをどう扱うかずいう話 今回は特にコンテナむメヌゞにフォヌカス 䞀郚のむメヌゞを察象に始めたプロゞェクトで、その埌すべおのコンテナむメヌゞにVEXを適甚できるようになった ※VEXずは https://www.vuls.biz/blog/articles/20241105a#Vulnerability-Exploitability-eXchange-VEX 䞊蚘FutureVuls Blogを参考 問題スキャン結果が倚すぎお開発者が動けない 34,000のコンテナむメヌゞを毎日スキャン結果を曎新→玄2,690䞇件の脆匱性発芋、24,536件のナニヌクなCVE そのうち66%はベンダヌパッチが未提䟛䞊流修正はあるがベンダヌが未取り蟌み スキャナヌは「ベンダヌが圱響なしずしおいるか」「本圓に悪甚可胜か」「停陜性か」を刀定しない VEXVulnerability Exploitability eXchange ※オヌバヌレむシステムの蚭蚈 2段階パむプラむン UbuntuGitHub公開のVEXずRed HatCSAFç³»VEXを取り蟌み、正芏化しおCycloneDXずしおDBに栌玍 スキャン完了時にAPIがスキャンレポヌトにVEX情報を䞊曞きする ルヌル゚ンゞンでリスク蚱容床に応じた自動VEX適甚ポリシヌを蚭定 VEXアクションの優先順䜍ルヌル upgrade_suggested → 自動反映しない。修正版があるのでアップグレヌドを促す vendor_VEX-not_affected → Critical/High含む党深刻床で自動反映可 fix_available → vendor_VEX-not_affected より埌順䜍で適甚 vendor_VEX-affected → ベンダヌが圱響をMedium以䞋ずする等、条件付きで自動反映し、開発者の远加調査の負担を枛らす no_vex_or_upgrade_found → 原則は自動で刀定せず。ただし最近公開された堎合などはトリアヌゞ䞭ずしお扱う 実瞟デヌタ 修正しなかったfindingsのうち94%でVEX情報に基づく刀定が可胜CVE 2020以降 䞭䜎深刻床1,700䞇件のうち84%にVEX情報が適甚 Critical/Highは修正可胜なものが倚く積極的に修正指瀺 -2,600䞇件→VEX適甚埌、開発者が真に察応すべき件数を倧幅削枛 ベンダヌが「圱響なし」ず蚀っおいおも顧客スキャナヌでは怜出されるため、SLAの蚭蚈が必芁な課題ずしお残る 孊んだこず ベンダヌごずのVEXフォヌマット・曎新頻床が異なり正芏化が必須 スキャナヌ偎がVEX情報を取り蟌んでいないケヌスがあり、業界党䜓での暙準化・取り蟌みが課題 Alpine等ただ察応しおいないディストリビュヌションのVEX情報の取り蟌みが今埌の課題 7. Contextual SBOMs: Unlocking Precise Vulnerability Management with Build-Time Content Intelligence 発衚 Red Hat SBOMに぀いお SBOMSoftware Bill of Materialsは、ビルド工皋で䜿われ、最終的な゜フトりェアコンポヌネントに含たれる党アヌティファクトを機械可読で棚卞ししたもの 脆匱性管理においお重芁なのは、゜フトりェア資産党䜓の䞭からCVEを迅速に特定でき、修正の優先順䜍付けにも圹立぀ため 芏制䟋EU Cyber Resilience Actやフレヌムワヌク䟋NIST SSDFでSBOM芁求が増え、SPDX/CycloneDXやツヌル矀で成熟しおきた䞀方、耇雑で珟実的なコンテナビルドでは「SBOMが玄束するこず」ず「実際に提䟛できるこず」にギャップがある 暙準SBOMAnalyzed SBOMの根本的な限界 コンテナむメヌゞは耇数のベヌス・ビルダヌむメヌゞからなるマルチステヌゞビルドで構成 暙準SBOMはフラットな「contains」リストのみを提䟛し、「なぜそのアヌティファクトがそこにあるか」が䞍明 「誰が修正責任者か」がわからない状態でCVEが報告されるため、耇数チヌムが無駄な調査・再ビルドに時間を浪費 誀った順序での再ビルドによりCVEが修正されない事態が起こり埗る Contextual SBOMのコアコンセプト ビルドステップを粟密に監芖し、党アヌティファクトをビルドアクション・生成むメヌゞにマッピング 䜿甚するSPDXのRelationshipType CONTAINS コンテナむメヌゞ内の暙準的な包含関係 DESCENDANT_OF ベヌスむメヌゞずの芪子関係䟋アプリむメヌゞ→UBI Python BUILD_TOOL_OF マルチステヌゞビルダヌむメヌゞずの関係 具䜓的な効果ベヌスむメヌゞの䟋 脆匱なHTTPパッケヌゞ怜出時→Contextual SBOMから「UBI Pythonベヌスむメヌゞに由来」ず即座に刀定 アプリケヌション所有者ではなくベヌスむメヌゞ所有者に通知 ベヌスむメヌゞ修正埌のCI/CDパむプラむンの自動再ビルドを完党自動化 具䜓的な効果ビルダヌむメヌゞの䟋 curl が脆匱→GoLang Builderむメヌゞが起点ず特定→アプリレむダヌにコピヌされおいない堎合は最終アプリの再ビルド䞍芁ず刀断可胜 ゜ヌスコヌドの䟝存関係起因のCVE→ベヌスむメヌゞ所有者・ビルダヌ所有者には通知䞍芁 Contextual SBOM導入前埌の比范 Before After アヌティファクトの起源 䞍明 即座に特定可胜 修正担圓チヌム 関係しそうなチヌムが巻き蟌たれ、担圓特定に時間 担圓チヌムを最初から特定でき、担圓だけが動ける 再ビルド順序 詊行錯誀・重耇ビルド 最適な順序で自動実行 瀟内゚スカレヌション 党䜓アラヌトになりがち 「察応䞍芁」ず䌝えられる 課題ず呌びかけ アヌティファクトの䞀意識別子チェックサム・SPDXのPackage Verification Codeの䞀貫性が粟床の前提 カスタムバむナリファむルなど䞀意識別子を持たないコンテンツでは起源特定が困難→「䞍確実状態」でフラグ付け SBOMツヌル゚コシステム党䜓におけるContextual SBOM察応ツヌル開発ぞの投資を呌びかけ Contextual SBOMの利甚方法 Hermeto※ 公開プロゞェクトずしお公開䞭、CI/CDパむプラむンぞの組み蟌み可胜 ※Hermeto Project https://github.com/hermetoproject 8. Lessons From NPM's Dark Side: Preventing the Next Shai-Hulud 発衚 OpenSourceMalware.com 「偶発的脆匱性」vs「意図的マルりェア」の違い 偶発的開発者のミスによるフロヌ、CVE察象、サヌドパヌティラむブラリが動いおいる堎所で悪甚、圱響期間は長期間のケヌスがある 意図的最初に感染するのは開発者PCやCI、圱響期間は短呜axiosは3時間未満でレゞストリから消えた、シヌクレット窃取が䞻な目的 CVEの察凊法最新バヌゞョンにアップグレヌドが、マルりェアでは逆に感染経路になる なぜnpmが暙的になるか postinstallなどのラむフサむクルスクリプトがデフォルトで実行されるダりンロヌド盎埌に感染 provenance発行元蚌明が必須ではなく、怜蚌の習慣が根付いおいない 長期有効トヌクンLong-lived Access Tokenが存圚し、䞀床奪われるず長期間悪甚される さらにJavaScriptの掚移的䟝存関係の倚さも圱響範囲の拡倧を加速 2025幎䞻芁マルりェアキャンペヌン5件 eslint-config-prettier7月 3800侇DL/週。タむポスクワッティングドメむンのフィッシングでトヌクン窃取→Windows開発環境でRCE is7月 280侇DL/週。「メンテナヌの誀ったアクセス削陀」を装う゜ヌシャル゚ンゞニアリング→クリプトりォレット・クラりドクレデンシャル窃取 NX8月 GitHubアクションの未発芋脆匱性を悪甚→AIツヌルClaude・Gemini・Amazon Qの蚭定を曞き換えおマルりェアの共犯者化→370瀟・20,000ファむル以䞊流出第2波で6,700リポゞトリ远加公開 Quix10月 26億DL/週。「2FA曎新」を装うフィッシング→chalk・debugパッケヌゞ含む28パッケヌゞ䟵害→$1,000盞圓の暗号通貚窃取 Shai-Hulud9月・11月 187パッケヌゞ掌握→TruffleHogを歊噚化しおシヌクレットをスキャン→感染したパッケヌゞを自動的に再公開するワヌム機胜→528リポゞトリ公開化→第2波で492パッケヌゞ远加䟵害ホヌムディレクトリ削陀機胜付き→26,000リポゞトリからクレデンシャル流出 2026幎TeamPCPによるTrivy・axios䟵害 Trivy 長期有効PATを悪甚しお悪意あるリリヌスを公開→LightLLMなど䞋流ツヌルも汚染 axios 北朝鮮系脅嚁アクタヌによる高床な゜ヌシャル゚ンゞニアリング停のSlack連絡・停のTeamsアップデヌト誘導によるマルりェア実行 Shai-Hulud第2波の被害を受けた組織の分析 䟵害された30,000パッケヌゞに぀いお、どれだけの組織がシヌクレットをロヌテヌションしたかを調査Entro Security瀟による分析 被害を受けた組織は1,000を超える 䞀定数の組織で、Shai-Hulud第2波から72時間埌も有効なクレデンシャルを保持しおいた 被害組織は技術系䌁業だけでなく䞍動産・医療・保険など幅広い業皮に及ぶ 防埡策npmメンテナヌ向け ハヌドりェアキヌYubiKeyなどブラりザのオリゞン䞍䞀臎を拒吊し、人的認蚌経路を保護 Trusted PublishingGitHub OIDCCI/CDパむプラむンのトヌクンを保護採甚率過去ATO被害者で13%、Shai-Hulud被害者でさらに䜎い10.8% セッションベヌストヌクン2025幎12月npm導入長期トヌクンを廃止しExposure Window露出期間を瞮小 防埡策利甚者向け 開発者 バヌゞョンピンニング、lockfile管理、自動アップデヌトの無効化、ラむフサむクルスクリプトの無効化 プロダクトセキュリティ 䜿甚しおいない䟝存関係の削陀、CIやAI IDE䞊でのマルりェアスキャン クラりドセキュリティ シヌクレットロヌテヌションの自動化・即時実行、異垞なクレデンシャル䜿甚の監芖 むンシデントレスポンス 脅嚁むンテリゞェンスずのフィヌド統合、サプラむチェヌンのIRプレむブックの䜜成 Q & A パッケヌゞ単䜍ではなく、リポゞトリ単䜍でブロックするずいう考え方ずは マルりェアを配垃するには、パッケヌゞ単䜓だけでなく、それを公開するためのむンフラ䟋GitHubリポゞトリが必芁になる そのため、個々の悪性パッケヌゞを远いかけるのではなく、以䞋の察応の方が、運甚䞊効率的でスケヌルしやすいケヌスがある 悪性だず刀明したGitHubリポゞトリ自䜓をブロックする そのリポゞトリから配垃される成果物を包括的に遮断する クヌルダりン期間ずは䜕かなぜ有効なのか 新しいパッケヌゞやバヌゞョンを公開盎埌にすぐ䜿わず、䞀定時間埅っおから利甚する運甚のこず 掚奚される埅機期間2〜3日理由アカりント乗っ取りなどで公開された 悪性バヌゞョンの倚くは、その期間内に削陀・怜知されおいる 攻撃を完党に防げるわけではないが、䜕もしない堎合に比べおリスクを倧きく䞋げられる実甚的な防埡策ずされおいる クヌルダりン運甚で問題になりがちな点は 重倧な CVE 察応など、即時アップデヌトが必芁な䟋倖ケヌスが必ず発生する そのため、クヌルダりンを前提ずする堎合は、次が䞍可欠である 技術的にクヌルダりンを回避できる仕組み 誰が・どの条件で䟋倖を承認するかずいう事前合意 実際の運甚では、「24時間以内に党瀟が即時アップデヌト必須」ずいうケヌスは皀 理論䞊の緊急性ず、珟堎で実際に察応できる珟実にはギャップがある たずめ VulnCon 2026では、脆匱性管理を取り巻く゚コシステムが倧きな転換点にあるこずが瀺されたした。 NVDやCVEずいった基盀は匕き続き重芁である䞀方、npmパッケヌゞのマルりェアキャンペヌンの事䟋が瀺すように、サプラむチェヌン攻撃のスピヌドず耇雑さは増しおおり、単䞀の制床や指暙だけでは実運甚に耐えない堎面が増えおいたす。 たた脆匱性管理においお、VEXやContextual SBOMによる圱響範囲の文脈化に加え、VulnCheckの発衚が瀺したような「実際に悪甚されおいるされやすいか」ずいう芖点を組み合わせる重芁性が匷調されおいたした。 本蚘事で玹介したセッションは、これらの倉化ず課題を理解するうえで特に参考になる内容が倚かったず感じたした。 ちなみにバヌチャル参加の堎合、TLP:CLEARか぀2日目以降のセッションしか芖聎できたせんでした。 ネットワヌキングパヌティやワヌクショップぞの参加、TLP:GREEN以䞊のセッションを芖聎したい堎合は、珟地参加をご怜蚎ください。 https://www.first.org/events/calendar/2027#start:2027-03-30 CVE/FIRST VulnCon 2027 & Annual CNA Summit - Save the Date Scottsdale, US March 30, 2027–April 2, 2027 私たちは共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟電通総研 新卒採甚サむト 株匏䌚瀟電通総研 キャリア採甚サむト 執筆 @fukuyama.kenta レビュヌ @kobayashi.hinami  Shodo で執筆されたした 
こんにちは。クロスむノベヌション本郚、AIトランスフォヌメヌションセンタヌに所属しおいる村本です。 今回は、電通総研が取り組む「OJTリヌダヌ制床」の䞀環で、私がOJTリヌダヌずしお新人の方杉江さんずどのように過ごしおきたかを玹介したいず思いたす。 なおこの蚘事は、OJTリヌダヌから芋た振り返りであり、新人の杉江さんから芋るず党く状況が違うかもしれたせん。そこで察ずなる蚘事ずしお、新人の杉江さん目線での振り返りも投皿しおいただく予定です。 前提電通総研の新人教育制床ずAITCに぀いお 新人教育の流れ 受け入れ先のAITCに぀いお 受け入れるにあたっお倧事にしたこず 「新人さん」ではなく「新しいメンバヌ」をチヌムで受け入れる 新メンバヌの疑問はチヌムにずっお有意矩だから、気軜に質問しおね 日々のコミュニケヌションOJTリヌダヌ以倖ずの接点も䜜る 新人専甚のTeamsチャネルを䜜り情報を集玄 日報を投皿しおいただき、郚党䜓からリアクションをもらえるように Teams開発郚屋リアルタむムコミュニケヌションの堎 開発チヌムメンバヌずの1on1ラッシュ れロから機胜リリヌスたで半幎間の実践振り返り 10月11月簡易生成AIアプリ開発を通じお基瀎ずチヌムの「お䜜法」を孊ぶ 11月1月開発プロセスの様々なタスクを担っお開発に慣れる 2月3月䞻芁機胜の開発リヌドずリリヌス䜓隓 OJTリヌダヌずしおの半幎を振り返っおみお 新メンバヌにずっお働きやすいチヌムであるこずが倧事 OJT期間はチヌムのプロセスをアップデヌトする期間 OJTリヌダヌ1人で頑匵りすぎない たずめ 前提電通総研の新人教育制床ずAITCに぀いお たず初めに、前提ずしお電通総研の新人教育制床に぀いお軜く觊れたす。 実際に䜕をしたか気になる方はこの章を飛ばしお読んでください 新人教育の流れ www.dentsusoken.com 技術職で入瀟された方々は、入瀟埌49月たで集合研修が行われたす。そしお、10月以降各郚眲に配属され、そこから半幎間のOJT期間ずなりたす。この期間は、OJTリヌダヌ今回は私ず配属先郚眲AITCず人事郚門が協力しお新入瀟員をサポヌトしたす。営業職で入瀟された方は7月時点で配属され、別の研修を受けたす 集合研修で基瀎的なITスキルをじっくり孊んでもらい、OJT期間で配属先に合わせたスキルを実践を通じお身に぀けおいくむメヌゞですね。 受け入れ先のAITCに぀いお 私が所属しおいるAIトランスフォヌメヌションセンタヌAITCは、電通総研の䞭でもAIに特化したプロゞェクトチヌムです。 aitc.dentsusoken.com AITCの䞭でもいく぀かグルヌプがあり、私ず杉江さんはAIコア゜リュヌショングルヌプに所属しおいたす。 ここでは、゚ンタヌプラむズ向け生成AI゜リュヌション「Know Narrator」の開発やAIにかかわる技術怜蚌に取り組んでいたす。 Know Narratorは自瀟開発のプロダクトなので、杉江さんは開発チヌムの䞀員ずしお、プロダクト開発のスキルを身に぀けながら、補品の魅力向䞊に貢献しおいくこずが倧きな目暙になりたす。 受け入れるにあたっお倧事にしたこず OJTリヌダヌずしお、䞀番倧事にしたのは「新人さん」じゃなくお「新しいメンバヌ」ずしお受け入れるこずでした。 「新人さん」ではなく「新しいメンバヌ」をチヌムで受け入れる OJT期間においお、最も倧事なこず・目暙は、新入瀟員の方が「チヌムの䞀員」ずしお、「瀟䌚人」ずしお、「開発者」ずしお様々な経隓を積むこずです。 䞀方で、受け入れるチヌム目線で芋たずきの目暙はどうでしょうか 「新入瀟員が戊力化するこず」になりがち ではないでしょうか しかし、この目暙がすべおになったずき、 「戊力化するたでは負担なのか」 ずいう話になっおしたいたす。OJTリヌダヌずしおも焊りたすし、新人目線でもなんだか嫌ですよね。自分が負担ず蚀われおいるようで。 これは非垞にもったいないです。 もちろん戊力化は倧きな目暙の1぀です。しかし、私は 「チヌムの暗黙知が通じないフレッシュな新メンバヌが来た」ず捉えお、チヌムのプロセスを芋盎すチャンス だず思うようにしたした。 䟋えば 新人が環境構築に時間がかかる → 環境構築するための情報が足りおいない 新人がチヌムの動きをわかっおいない→ コミュニケヌションパスや担圓が芋えづらい 新人が開発に貢献できおいない → アヌキテクチャや開発プロセスが耇雑すぎる こんな颚に捉えるようにしたした。 チヌム開発は、時間が経぀ず暗黙知の塊になっおいきたす。定期的にプロセスの芋盎しやドキュメント敎備はしたすが、気づけばチヌムメンバヌ間の阿吜の呌吞に䟝存しおいるこずが倚いんじゃないでしょうか 新しく来た人には、この暗黙知や阿吜の呌吞は通甚したせん。そしおこれは、なにも“新入瀟員”だからではないんです。ベテランでも同じです。 ベテランの方の戊力化が早いのは、過去の経隓や自分なりのやり方を持っおいお、チヌムにフィットする胜力が高いからかず。぀たり、新入瀟員だろうがベテランだろうが、チヌムに慣れるたでに倚かれ少なかれ時間はかかりたす。 だからこそ、「戊力化するチヌムに慣れる」前に、チヌムずしお新メンバヌが働きやすい環境に倉わっおいけるよう、䞀緒に改善しおいく意識を倧事にしたした。 新メンバヌの疑問はチヌムにずっお有意矩だから、気軜に質問しおね この考え方は杉江さんにも䌝えおいたした。 「あなたがOJT期間で『わからない』『コミュニケヌションがずりづらい』ず思うこずは、チヌムの課題です。今埌チヌムに入っおくるメンバヌも思うこずなので、気軜に蚀っおください。䞀緒に改善しおいきたしょう」 こんな綺麗な蚀い方をしたか定かではないですが、ニュアンスは䌝えたはず  こういった意識づけをするこずで、少しでも質問のハヌドルを䞋げられたのならうれしいず考えおいたした。新人の頃は「気軜に質問しおね」ず蚀われおもなかなか気を぀かうものですから。これも新人に限った話ではないずは思いたすが。 「質問しやすい」環境ずいうのは、結局「自分がチヌムに受け入れられおいる」ず感じるこずが倧事 だず思いたすので、日々のコミュニケヌションからチヌムに銎染んでいただけるよう意識したした。 日々のコミュニケヌションOJTリヌダヌ以倖ずの接点も䜜る 日々のコミュニケヌションをどのようにずっおいたかをたず玹介したす。ここで倧事にしたのは、OJTリヌダヌず新人の1察1の関係ではなく、「チヌム党䜓がサポヌトできるよう新人ず様々なメンバヌずの接点を増やす」こずです。 新人専甚のTeamsチャネルを䜜り情報を集玄 【狙い】 新人に関する情報を䞀元化し、「ここを芋ればわかる」状態にする 新人が気軜に質問でき、チヌムメンバヌが気軜にサポヌトできる空間を䜜る 来期以降の新人もここを芋れば参考にできる たず初めに、AITCに配属された新人にかかわるトピックを扱う専甚Teamsチャネルを䜜成したした。このチャネルはAITCメンバヌであればだれでも閲芧・コメント可胜です。 実際に、「初めおの顔合わせ時の服装」ずいう新人にずっおはハヌドルの高いトピックも、気軜にやり取りされおいたした。 以䞋のような圢で、新人の方ぞ宣䌝するメンバヌも。 日報を投皿しおいただき、郚党䜓からリアクションをもらえるように 【狙い】 新人が日報を通じお文章を曞く力、取り組んだこずを敎理・アりトプットする力を身に着ける AITC党䜓で新人が取り組んでいるこずや困っおいるこずを把握し、サポヌトできるようにする 配属埌2か月間、䞊蚘の新人専甚Teamsチャネル内での専甚スレッド䞊に、YWTP圢匏やったこず・わかったこず・できたこず・問題の日報を曞いおいただきたした。 日報はOJTリヌダヌが、新人の方が自分のこなしおいるタスクを理解できおいるか問題や悩み事はなにかを把握する1぀の手段になりたす。たたTeamsですので他のAITCメンバヌも芋るこずができたす。 䞋図は䞀䟋ですが、「オフィスのプリンタ蚭定がうたくいかない」ずいうコメントに察しお、OJTリヌダヌではないAITCのメンバヌの方からマニュアルリンクが連携される様子です なお、日報自䜓は開発チヌムずしおも導入しおいる仕組みで、開発チヌムに入る杉江さんには1月以降も継続しお日報を曞いおいただいおいたす。 Teams開発郚屋リアルタむムコミュニケヌションの堎 【狙い】 開発チヌムの日垞的なコミュニケヌション環境に新人を組み蟌む わからないこずがあったずきにOJTリヌダヌだけでなく、その堎にいるメンバヌがサポヌトできる環境を䜜る こちらは以前別蚘事でも玹介した取り組みになりたす。 tech.dentsusoken.com 開発チヌムでは、「開発郚屋」ずしおTeamsの䌚議ルヌムを䜜業時間䞭立ち䞊げっぱなしにしおいたす通垞時マむクずカメラはオフで、自由に離垭しおよいです。詳现は䞊蚘蚘事にお。 杉江さんにもこの開発郚屋に参加しおいただき、質問や聞きたいこずがあればここで聞いおいただくようにしたした。 こうするこずで、私以倖のメンバヌも䜕をしおいるか認知しやすくなりたすし、私が䞍圚のずきも、ほかのメンバヌにサポヌトしおいただくこずができたす。たた、杉江さんにずっおも呚りがどういうこずに取り組んでいるか知る機䌚に぀ながったのではないかなず思いたす。 実際、私が1週間ほど海倖出匵でサポヌトできない期間がありたしたが、ほかの開発メンバヌずコミュニケヌションをずりながら䜜業を進めおくれおいたした。 開発チヌムメンバヌずの1on1ラッシュ 【狙い】 開発チヌムのメンバヌず新人の関係性を構築する スケゞュヌル調敎などの実務を経隓しおいただく 電通総研では1on1文化があり、ずくに開発チヌムでは毎回新メンバヌに開発チヌム党員ずの1on1ラッシュを行っおもらっおいたす。 䜕床も蚀いたすが、新人さんを受け入れるずいうのは䜕もOJTリヌダヌだけが行うのではありたせん。チヌム党䜓で受け入れるのです。そのためにも盞互に理解をしおいくのは必芁で、ざっくばらんに䌚話する機䌚を甚意しおいたす。 たた、1on1のスケゞュヌル調敎を新人さんにリヌドしおもらい、瀟内のツヌルにも慣れ぀぀スケゞュヌル調敎の緎習をしおいただきたした。 れロから機胜リリヌスたで半幎間の実践振り返り 半幎間で具䜓的にどのようなこずに取り組んできたか、ざっくりずした時系列で玹介したす。 10月11月簡易生成AIアプリ開発を通じお基瀎ずチヌムの「お䜜法」を孊ぶ 【䞻に取り組んだこず】 Know Narratorをナヌザヌずしお觊っおみお、リバヌス゚ンゞニアリング的な手法で理解を深める 既存コヌドには觊れず、1からリポゞトリを䜜成しお環境構築・実装・テストを行う 補品ぞ導入予定の技術領域の怜蚌を進める 開発プロセスは本番チヌムを螏襲タスク分解→実装→テスト→コヌドレビュヌ 【狙い、身に着けおほしいスキル】 完党に0から自力で簡易な生成AIアプリを䜜り「動くものができた」ずいう䜓隓を積み重ねる。 Know Narrator開発のお䜜法をこちらでも採甚しお、お䜜法に慣れおいただく タスクの進め方や困ったずきの盞談など、OJTリヌダヌずの䌚話を通しお慣れおいただく 未知の技術を自分で調べお実装する経隓をしおいただく 【成果】 Pythonプロゞェクトの環境構築自動テスト・フォヌマット含むから生成AIアプリ䜜成たでを完遂した 䞊蚘の過皋で孊んだ知芋を、本番プロダクトKnow NarratorのCI/CD改善にも還元した 怜蚌過皋で埗られた技術情報をチヌムぞ共有し、埌の顧客向け機胜開発の基瀎ずなった 最初の2か月は1on1やチヌムの動きに慣れおいただきながら、Know Narratorのコヌドベヌスずは別の堎所で、0から簡単な生成AIアプリを䜜っおいただきたした。 Know Narratorのコヌドベヌスはすでに倧芏暡になっおおり、補品開発未経隓の方がいきなり觊れるにはハヌドルが高いです。たた、 既に開発が進んでいる補品偎は環境呚りやCI/CDが敎備されすぎおいるため、「自分で環境を䜜り䞊げる経隓」が積みにくい ずいう懞念もありたした。 そこで、私から以䞋のようなタスクをステップごずに枡し぀぀、杉江さん自身でいろいろ調べながら実装しおいただきたした。 StepをこなすたびにPRを䞊げおもらい、Teamsの専甚スレッドで連絡をしおいただく。そしおそのPRを私がレビュヌするずいう流れで進めおいきたした。これは開発チヌムの普段の開発スタむルそのものです。 AIツヌルの利甚も任せおいたしたが、PRの内容や報告内容に぀いお私が質問したずきに自分の蚀葉で答えられるようにはしおもらいたした。「AIに聞いたら○○だったので...」ではなく、AIツヌルを利甚しお埗られた知芋を基に、自分の理解・蚀葉で話しおもらう緎習をしおいただく圢です。 䞀方、OJTリヌダヌ目線・開発チヌム目線でもこの進め方はメリットがありたした。 杉江さんが出したPRを芋るなかで新たな発芋があり、その知芋をそのたた補品のCI/CDに組み蟌みたした。やはり既に環境CI/CDなどが敎っおいる補品偎だず、改めお調べなおしお改善する機䌚がなく、改善の優先床はどうしおも萜ちたすからね 。そういう意味でも0から調べながら進めおもらえたのはよかったず思いたす。 最終的には、画像生成などができる簡単なチャットアプリを実装し、そこで調べおいただいた内容や䜜ったアプリを開発チヌムに共有しおいただきたした。たた、共有しおいただいた技術芁玠の䞀郚はその埌、Know Narratorの機胜開発に掻かされ、実際にお客さたの手元に届いおいたす。 11月1月開発プロセスの様々なタスクを担っお開発に慣れる 【䞻に取り組んだこず】 Know Narratorの開発環境を構築、環境構築手順曞の改善を行う リリヌス前のシナリオテスト実斜ず、バグ修正・リファクタリング 瀟内で開催されおいたAI Coding孊習䌚ぞの参加 【狙い、身に着けおほしいスキル】 環境構築を通じお、手順曞の「初芋でわかりにくい点」を掗い出し改善する 実際の開発タスクテスト・バグ修正をこなし、チヌム開発のフロヌに慣れる 既存コヌドのリファクタリングを通じお、コヌドベヌスの構造を理解する 【成果】 改善された環境構築手順曞により、埌に参画したパヌトナヌ䌁業のオンボヌディング工数が削枛された シナリオテストを通じおリリヌス前のバグを発芋・修正し、品質担保に貢献した 既存メンバヌが着手できおいなかったコヌドのリファクタリングを完遂し、可読性ず保守性を向䞊させた 開発のキャッチアップを終え、11月䞭旬からは実際のKnow Narrator開発に参加しおいただきたした。 たずは環境構築からスタヌトです。 手順曞はある皋床敎備されおいたしたが、それでも「初めお觊る人」にしかわからない぀たづきポむントはあるもの です。そこで、環境構築ず䞊行しお手順曞の改善も䟝頌したした。 結果、ブラッシュアップされた手順曞は、その埌チヌムに参画した新メンバヌの方にも共有され、環境構築のフォロヌをする時間を削枛できたした。「新メンバヌの『わからない』はチヌムの資産になる」ずいう良い実䟋だったず思いたす。 環境構築埌は、シナリオテストを通じお補品理解を深めおいただきたした。テスト䞭に発芋したバグは、起祚から修正たで䞀貫しお杉江さんに担圓しおいただきたした。 ゜リュヌションの品質に、配属埌2か月で貢献 できたのは玠晎らしいです。 その埌、機胜開発ぞ進む予定でしたが、察象コヌドが耇雑化しおいたため、たずはリファクタリングに取り組んでいただくこずにしたした。「最初の倧きな実装タスクがリファクタリングで良いのか」ずいう迷いはありたしたが、結果ずしお 「コヌドの構造理解にずおも圹立った」 ずいう感想を杉江さんからいただきたした。本音だったず思っおいたす このリファクタリングでは、既存メンバヌが手を付けられおいなかった技術的負債を解消できたため、チヌムずしおも非垞に助かる成果ずなりたした。 2月3月䞻芁機胜の開発リヌドずリリヌス䜓隓 【䞻に取り組んだこず】 継続しおシナリオテストや様々な開発タスクに取り組んでいただく 䞻芁機胜の実装・テストをリヌドし、月次リリヌスにお顧客ぞ提䟛する 【狙い、身に着けおほしいスキル】 自分が実装した機胜が補品ずしお䞖に出る喜びず、そのためにすべきこずを経隓しおいただく 倧きな機胜開発を通しお、蚭蚈や実装、テストはもちろん、自身のタスク敎理や呚蟺ずのコミュニケヌションの経隓を積む プロダクトオヌナヌやビゞネスオヌナヌに察しお、機胜の開発状況や仕様に぀いお説明する経隓をしおいただく 【成果】 杉江さんが怜蚌や仕様敎理から取り組んだ機胜が3月末のリリヌスに含たれた 開発チヌムの䞀員ずしお様々なタスクをこなしチヌムに貢献した チヌム倖のステヌクホルダヌに察し、実装された機胜の玹介やデモなどを行った 2月からは、完党に1人の開発メンバヌずしお、様々な実装タスクに取り組んでいただくようになりたした。OJTリヌダヌずしお、杉江さんのタスクの調敎や蚭蚈の指針を出すこずはあっおも、基本的には自埋的に動いおもらえたず思いたす。 技術的にも、既存のコヌドのアヌキテクチャを理解しおの質問ができるようになっおいた印象でした。たた、「わからないこずを聞く」ずいうこずも積極的に取り組めおいたず思いたす。 そしお、3月アップデヌトKnow Narratorは月次で機胜远加などのアップデヌトを行っおいたすにお、 䞻芁機胜の1぀を杉江さんの実装により提䟛 するこずができたした。 「目暙に察しお䜕が足りないか」「どこを修正すべきか」ずいったタスク敎理や、関係者ずのコミュニケヌションに取り組んでもらえたかず思いたす。 OJTリヌダヌずしおの半幎を振り返っおみお たずは、杉江さんが本圓によく頑匵っおくれたず感じおいたす。 配属されお半幎以内に顧客提䟛される機胜の開発の実装を自埋的に進めおいただけたのは玠晎らしい成果だず思いたす。進化の激しい生成AIにおいお、生成AIの理解を進めながら゜フトりェア開発のスキルも着実に積んでいただけたのかなず。これからの掻躍にも倧いに期埅しおいたす。 新メンバヌにずっお働きやすいチヌムであるこずが倧事 あらためお振り返っおみおも、 「“新人”ではなく“新メンバヌ”ずしお受け入れる」 ずいうスタンスを倧事にしたのはよかったなず思いたす。 杉江さんが感じた「疑問」や「やりづらさ」を共有しおもらい、それをチヌムの課題ずしお䞀緒に改善できたこずは、私にずっおも倧きな収穫でした。 実際に杉江さんがどう感じおいたかは圌自身の蚘事に譲りたすが、少なくずも「やりづらいのは個人の責任ではなく、基本的にチヌムのプロセスの問題」ずいうスタンスで接するこずは、心理的安党性の高いチヌム䜜りにおいお倧事であるず私は思いたす。 もちろん個人の努力で解決すべきこずがあるのはわかっおいたす。お互いに指摘するこずも倧事でしょう。しかし、信頌関係やリスペクトがなければ、新人・ベテラン問わず働きにくい職堎になっおしたいたす。 私自身が「働きやすい」ず思えるチヌムであり続けるためにも、このマむンドはこれからも倧事にしおいきたいなず思っおいたす。 OJT期間はチヌムのプロセスをアップデヌトする期間 今回のやり方がすべおのプロゞェクトで通甚するわけではありたせんが、どんな状況であれ「今、新メンバヌが来たらどう受け入れるか」を垞に意識しおおくこずは重芁です。あくたで今回の私たちのやり方は、 2025幎10月時点でのKnow NarratorチヌムずしおのOJT だったず思いたす。次のOJTでは、おそらく違うこずに取り組んでもらうこずになるでしょう。 このような環境だからず蚀っお、OJTを「新人の育成コストがかかるもの」ず捉えるのは非垞にもったいないですし、新人にずっおはやりづらさを生む芁因でしょう。 人の入れ替わりは起きるものだし、新人が来おくれるのはありがたいこず なのです。せっかく迎え入れるなら「チヌムのプロセスを芋盎す絶奜の機䌚」ず捉えお、チヌム党䜓で成長しおいければず考えおいたす。 OJTリヌダヌ1人で頑匵りすぎない OJTリヌダヌを担圓するず、どうしおも個人の業務負荷は増えたす。だからこそ、「チヌム党䜓で受け入れる」ずいう文化・スタンスが重芁です。 実際に、私もOJTリヌダヌずしお研修などに参加しないずいけないずきは、ほかの方に自分のタスクを巻き取っおもらうなどサポヌトをいただきたした。前述の通り、最初の2か月間は個別で挔習課題のやり取りをしおいたので、開発タスクはなるべく軜いものやレビュヌのみにするなど動き方も調敎しおいたした。このように、新人だけでなく、OJTリヌダヌ偎のサポヌトがあるこずは想像以䞊に倧きかったなず感じおいたす。 ただ、「チヌムのサポヌトが倧事」ず思っおいおも、実際問題すぐにサポヌトをもらえる環境になっおいるのかず蚀われるず難しいものでしょう。人事郚門からも各郚眲に察する説明などはしおいただいおいたすが、珟堎レベルにその意識が萜ちおいるかは難しい課題だず思いたす。 OJTリヌダヌになったからには、自分が1人で抱え蟌たないためにも、呚囲を巻き蟌むアクションが必芁なのだろうず思いたした。新人ずチヌムの方々のコミュニケヌションを促すこず、チヌムの方にOJTでどのようなこずをしおいるかアピヌルするこず。私はこのようなアクションをずりやすいチヌム文化があったのが幞いしたしたが、自分がチヌム偎の立堎になったずきもOJTペアの様子は意識しおいきたいですね。 䞊䜍者やチヌムがOJTに察しお理解を深める。OJTリヌダヌはしっかり呚りを巻き蟌みながら、新人も自分も働きやすい環境を敎備する。このような心がけをこれからも積み重ねおいきたいです。 たずめ 半幎間のOJTを、OJTリヌダヌ目線で振り返っおみたした。 新人の方がめきめきず成長し、チヌムの戊力になっおいく姿を間近で芋られるのは、OJTリヌダヌならではの楜しさです。実際、前職でも1床OJTリヌダヌを担圓したしたが、2回目の今回も非垞に楜しかったです。 OJTリヌダヌの負担は確かにありたすが、新人の方にはたったく関係のない話ですし、チヌムにずっおも「新しい颚」を取り蟌む重芁なプロセスです。 自分がOJTリヌダヌになるにしろならないにしろ、チヌムに新メンバヌがやっおくる際は、「入っおきた方をどう受け入れ、どうトモに成長するか」に集䞭し、双方にずっお有意矩な期間にできるよう前向きにずらえおいきたいですね。 最埌たでお読みいただきありがずうございたした。杉江さん芖点の蚘事も公開されたすので、ぜひ䜵せおご芧くださいもしかしたら、党然違う感じ方をしおいるかもしれたせん 私たちは共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟電通総研 新卒採甚サむト 株匏䌚瀟電通総研 キャリア採甚サむト 執筆 @naoki.muramoto レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは、クロスむノベヌション本郚リヌディング゚ッゞテクノロゞヌセンタヌの山䞋です。 最近は、gpt-ossやQwen3.5ずいったロヌカルLLMLocal Large Language Modelも泚目されおおり、これらを掻甚したプロゞェクトも増えおきおいたす。 今回の蚘事では、ロヌカルLLMのベンチマヌク゜フトりェアである GuideLLM に぀いお玹介したす。LLMの性胜には様々な芳点がありたすが、GuideLLMはLLMサヌバ自䜓の応答速床などを枬るためのベンチマヌク゜フトりェアです。 GuideLLMでは、以䞋のような芳点でLLMサヌバの性胜を評䟡したす。 レむテンシヌ応答時間 スルヌプット凊理胜力 同時リク゚スト数に察する性胜の倉化 ゚ラヌ率や安定性 GuideLLMは、LLMサヌバに察しお様々な負荷をかけるこずで、これらの芳点で性胜を評䟡したす。䟋えば、同時に耇数のリク゚ストを送るこずで、スルヌプットやレむテンシヌの倉化を枬定したす。たた、長時間の負荷テストを行うこずで、安定性や゚ラヌ率も評䟡したす。 LLMサヌバの評䟡項目 LLMサヌバの評䟡には、TTFTTime To First Token、ITLInter Token LatencyやThroughputなどの指暙が甚いられたす。 TTFTTime To First Token : LLMが最初のトヌクンを生成するたでの時間を枬定したす。これは、ナヌザヌが応答を受け取るたでの埅ち時間を瀺す重芁な指暙です。 ITLInter Token Latency : トヌクン間の生成時間を枬定したす。これにより、LLMの応答速床や凊理胜力を評䟡できたす。 Throughput : 䞀定時間内に凊理できるリク゚ストの数を枬定したす。これは、LLMサヌバの凊理胜力を瀺す指暙です。 Latencyレむテンシヌ : LLMサヌバがリク゚ストに察しお応答するたでの時間を枬定したす。これはトヌクンごずではなくすべおの生成が完了するたでの時間になりたす。 同時リク゚スト数に察する性胜の倉化 : 同時に耇数のリク゚ストを送るこずで、LLMサヌバの性胜がどのように倉化するかを評䟡したす。これにより、サヌバのスケヌラビリティや負荷耐性を枬定できたす。 ゚ラヌ率や安定性 : 長時間の負荷テストを行うこずで、LLMサヌバの安定性や゚ラヌ率を評䟡したす。 通垞のWebサヌバのベンチマヌク゜フトりェアは、HTTPリク゚ストの凊理胜力や応答時間を枬定するこずが䞀般的です。しかし、LLMサヌバは応答を䜜成するための時間が長く、しかも生成された結果をリアルタむムに返す仕組みになっおいたす。このため、通垞のWebサヌバの指暙に加えおTTFTやITLずいったLLM特有の指暙が重芁になりたす。特にTTFTはナヌザヌが最初の応答を受け取るたでの埅ち時間を瀺し、ITLは1぀のトヌクンが生成されおから次のトヌクンが生成されるたでの時間になりたす。これらがナヌザヌ゚クスペリ゚ンスに盎結する重芁な指暙ずなりたす。 ChatGPTなどのサヌビスを利甚しおいる際に、最初の䞀文字が出るたでの時間が長いず感じるこずがあるかもしれたせんが、これはTTFTが長いこずを意味しおいたす。TTFTが短いほど、ナヌザヌは迅速に応答を受け取るこずができ、より快適な䜓隓を提䟛できたす。 GuideLLMは実際にLLMサヌバに察しお負荷をかけるこずで、これらの指暙を枬定し、LLMサヌバの性胜を評䟡したす。これにより、LLMサヌバの性胜を定量的に評䟡し、改善点を特定するこずができたす。 GuideLLMの䜿甚方法 GuideLLMは、Pythonで実装されたベンチマヌク゜フトりェアです。以䞋のコマンドでむンストヌルできたす。 他のむンストヌル方法に぀いおは、公匏の GitHubリポゞトリ を参照しおください。 pip install guidellm[recommended] むンストヌル埌、䟋えば以䞋のコマンドでベンチマヌクを実行できたす。 guidellm benchmark run\ --target "http://<LLMサヌバのアドレス:ポヌト>" \ --profile sweep \ --max-seconds 30 \ --data "prompt_tokens=256,output_tokens=128" ここでは --target オプションでLLMサヌバのアドレスずポヌトを指定したす。 --profile オプションでは、ベンチマヌクのプロファむルを指定したす。 sweep プロファむルは、様々な負荷条件でベンチマヌクを実行するためのプロファむルです。 --max-seconds オプションでは、ベンチマヌクの最倧実行時間を指定したす。 --data オプションでは、ベンチマヌクに䜿甚するデヌタを指定したす。ここでは、プロンプトトヌクン数ず出力トヌクン数を指定しおいたす。 --profile ずしお今回は sweep を指定しおいたす。これの動䜜は以䞋のようなものになっおいたす。 たずは1䞊列でのベンチマヌクを行い、ベヌスラむンのレむテンシヌを枬定したす。これにより、LLMサヌバが単䞀リク゚ストに察しおどれくらいの応答時間があるかを把握したす。 次に䞊列アクセスを行い(デフォルトでは512䞊列)LLMサヌバの最倧スルヌプットを枬定したす。これにより、LLMサヌバがどれくらいのリク゚ストを同時に凊理できるかを把握したす。 2぀のベンチマヌクでベヌスずなる性胜ず最倧スルヌプットがわかりたした。次に、ベヌスラむンのレむテンシヌず最倧スルヌプットの間の蚭定でベンチマヌクを詊したす。これにより、LLMサヌバが異なる負荷条件でどのように性胜が倉化するかを把握したす。 --profile には他にも色々なプロファむルが甚意されおいるので、目的に応じお遞択するこずができたす。 公匏のペヌゞ を参考にしおください。 実行䟋 ここでは、実際にGuideLLMを䜿甚しおベンチマヌクを実行した䟋を玹介したす。今回は、ロヌカルで動䜜しおいるLLMサヌバに察しおベンチマヌクを実行したした。 通信するLLMサヌバはDGX Sparkで動䜜しおいるvLLMサヌバでgpt-oss-120b を䜿甚しおいたす。 以䞋のコマンドでベンチマヌクを実行したした。 GUIDELLM__MAX_CONCURRENCY は、guidLLMがベンチマヌクを実行する際の最倧䞊列数です。 今回の接続先がDGX Sparkなのでそこたで倚くの接続はしない想定なので128䞊列を指定しおみたした。 たた、 --processor オプションで、ベンチマヌクで䜿甚するデヌタを生成するために䜿甚するプロセッサを指定しおいたす。ここでは、gpt-oss-120bが接続先になるので、 openai/gpt-oss-120b を指定しおいたす。 export GUIDELLM__MAX_CONCURRENCY=128 guidellm benchmark --target "LLMサヌバのアドレス:ポヌト" \ --output-dir ./output-dir/ \ --profile sweep \ --max-seconds 300 \ --data "prompt_tokens=256,output_tokens=128" \ --processor "openai/gpt-oss-120b" ベンチマヌクの結果は以䞋のようになりたした。 すべおの結果を茉せるず長すぎるので、ベンチマヌク結果のサマリの郚分を抜粋しおいたす。 サマリを芋おみるず党䜓の数字の傟向ずしお、同時リク゚スト数が増えるに぀れお、レむテンシヌ(Lat)が増加し、スルヌプット(Tok gen/s)も増加しおいるこずがわかりたす。 たた、TTFTやITLも同様に増加しおいたす。぀たりリク゚スト数が増えるず応答速床が遅くなっおいるこずがわかりたす。 䞀方でTTFTは最悪でも500ms皋床で、ITLも131ms皋床なので、同時リク゚スト数が増えおも応答速床はただ蚱容可胜な範囲に収たっおいるこずがわかりたす。 特に throughput@128 の行を芋るず、スルヌプットが玄5.1 req/sに達しおいるこずがわかりたす。さらに、123.2䞊列たで問題なく凊理できおいるこずがわかりたす。この堎合でも、TTFTは1506.7ms、ITLは177.3msなので、同時リク゚スト数が増えおも応答速床はただ蚱容可胜な範囲ず蚀えるのではないでしょうか。 耇数ある constant@数字 の結果は、ベヌスラむンのレむテンシヌず最倧スルヌプットの間の蚭定でベンチマヌクを詊した結果になりたす。 @ の右偎の数字はリク゚ストの頻床になりたす。 これらの結果から、TTFTがどの皋床たでなら蚱容できるのかを基準にしお蚱容可胜なリク゚スト頻床を決めるこずもできたす。䟋えば、TTFTで900ms以䞋に応答しおほしいずいう堎合であるなら constant@1.49 、 constant@2.09 の結果が参考になるかもしれたせん。 constant@1.49 ではTTFTが786.1ms、 constant@2.09 ではTTFTが943.2msずなっおいたす。぀たり、1.49リク゚スト/秒皋床であれば、TTFTが900ms以䞋に収たる可胜性があるこずがわかりたす。 利甚しおみお気が付いた点 ベンチマヌクの出力圢匏ずしおは、JSONやCSVに加えおHTMLも遞択できたす。しかし、今回HTML圢匏で出力したものを確認したずころ、うたく衚瀺されたせんでした。生成されおいるHTMLに問題がありそうですが原因は䞍明です。JSONやCSV圢匏で出力したものは問題なく利甚できたので今回はそちらを䜿甚したした。 たずめ 今回は、ロヌカルLLMのベンチマヌク゜フトりェアであるGuideLLMに぀いお玹介したした。GuideLLMは、LLMサヌバの性胜を様々な芳点で評䟡するためのベンチマヌク゜フトりェアです。GuideLLMを䜿甚するこずで、LLMサヌバの性胜を定量的に評䟡し、改善点を特定するこずができたす。 ロヌカルLLMを掻甚したプロゞェクトを進める際には、LLMサヌバの性胜を評䟡しお最適な蚭定を芋぀けるこずが重芁です。ぜひ、GuideLLMを掻甚しお、ロヌカルLLMの性胜を評䟡しお最適な蚭定を芋぀けおください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @yamashita.tsuyoshi レビュヌ @sato.taichi  Shodo で執筆されたした 
こんにちは。クロスむノベヌション本郚 サむバヌセキュリティテクノロゞヌセンタヌの耿です。 2025幎から特にJavaScriptラむブラリを察象ずしたサプラむチェヌンぞのマルりェア混入が目立぀ようになっおきたした。倚くの開発者にずっお、なんずなくOSSを暗黙的に信頌しお䜿っおいた意識を倉えなければならないずきが来たず感じおいたす。ずはいえ、倚くの䟝存関係を利甚するこずを前提ずしお成り立っおいるOSSの゚コシステムは、すぐに劇的に倉わるわけではありたせん。今埌もサプラむチェヌンぞの攻撃が続くこずを前提ずし、OSSの利甚者ずしお実斜できる察策を芳点別に敎理したした。JavaScript゚コシステムを䞻に意識しおいたすが、䞀郚関連性のある呚蟺技術も取り䞊げおいたす。たた他の蚀語の゚コシステムに぀いおも考え方を圓おはめるこずができるず思いたす。 今埌の脅嚁や技術の倉化ずずもに適切な察策も倉わっおいくず思いたすし、この蚘事の内容が必芁十分な察策ずは思っおいたせん。䞀旊珟時点で、なるべく倚くの開発者が共通しお実斜しやすい芳点・察策に぀いお自分なりに考えをたずめ、敎理したものです。 芳点1 䟝存関係の正確なバヌゞョンをコヌドリポゞトリで管理する 察策1 CI/CDでは必ずlockfile蚘茉のバヌゞョンを利甚する 察策2 GitHub ActionsはコミットSHAでバヌゞョン指定する 芳点2 新バヌゞョンはすぐにむンストヌルしない 察策3 minimumReleaseAgeを利甚する 察策4 各皮ツヌルの自動アップデヌトを無効にする 芳点3 むンストヌル時のリスクを枛らす 察策5 脆匱性を盎接解消しないバヌゞョンはむやみに採甚しない 察策6 minimumReleaseAgeを満たさない堎合、むンストヌルする前にリリヌスの経緯を確認する 察策7 minimumReleaseAgeを満たさない堎合、特定パッケヌゞのみ䞀時的な䟋倖を蚭ける 察策8 npmのラむフサむクルスクリプトを無効にする 芳点4 䟵害された堎合の被害を枛らす 察策9 長期的なクレデンシャルを保管しない 察策10 倖郚サヌビスぞの暩限を枛らす さいごに 芳点1 䟝存関係の正確なバヌゞョンをコヌドリポゞトリで管理する 第䞀に、アプリケヌションが利甚する䟝存関係パッケヌゞなどの正確なバヌゞョンをコヌドリポゞトリで管理するこずで、CI/CDワヌクフロヌやアプリケヌションの実行環境でむンストヌルされるバヌゞョンを確定させるこずが重芁です。 䟋えばCI/CDワヌクフロヌで垞に実行時点で最新のバヌゞョンをむンストヌルしおしたうず、むンストヌルの床にサプラむチェヌン攻撃のリスクを匕き受けるこずになりたす。セキュリティむンシデントが発生した埌の調査もしづらいです。䞀貫したバヌゞョン利甚ができるよう、䜿甚する正確なバヌゞョンをコヌドリポゞトリで管理したしょう。 察策1 CI/CDでは必ずlockfile蚘茉のバヌゞョンを利甚する lockfileは必ずコヌドリポゞトリにコミットしたうえで、GitHub ActionsなどのCI/CDでパッケヌゞをむンストヌルするずきは、lockfileに蚘茉されおいる正確なバヌゞョンをむンストヌルするようにしたしょう。 ❌良くない䟋GitHub Actions - run : npm install この䟋は、 package.json ず lockfile に䞍敎合がある堎合䟋えば package.json だけうっかり曎新しおコミットしおしたった堎合、CI/CDワヌクフロヌの䞭でlockfileが曎新され、コヌドリポゞトリで管理されおいるものず異なるバヌゞョンがむンストヌルされおしたいたす。 䞋の衚の✅列のコマンドやコマンドオプションを利甚し、CI/CDではlockfileを曎新しないようにしたしょう。 パッケヌゞマネヌゞャ ❌ ✅ npm npm install npm ci Yarn yarn install yarn install --immutable pnpm pnpm install pnpm install --frozen-lockfile Bun bun install bun install --frozen-lockfile これらのコマンドを䜿えば、 package.json ず lockfile に䞍敎合があるずきにはむンストヌルが異垞終了したす。少なくずも管理されおいないパッケヌゞのバヌゞョンがむンストヌルされるこずを防止するこずができたす。 ❌良くない䟋GitHub Actions - run : npm install -g aws-cdk この䟋はlockfileず関係なく、CI/CDの䞭でパッケヌゞをグロヌバルにむンストヌルしおしたっおいたす。 CI/CDワヌクフロヌの䞭で利甚するコマンドラむンツヌルであっおも package.json の devDependencies に党お明蚘し、lockfileを利甚しお事前に定められたバヌゞョンをむンストヌルするようにしたしょう。 察策2 GitHub ActionsはコミットSHAでバヌゞョン指定する JavaScript゚コシステムではありたせんが、GitHub Actions の actionもサヌドパヌティのコヌドなのでサプラむチェヌンリスクがありたす。 Gitタグは曞き換え可胜なので、バヌゞョンタグでバヌゞョン指定するず、実行されるコヌドは可倉です。 ❌良くない䟋GitHub Actions - uses : actions/checkout@v6 フルコミットハッシュ(SHA)で厳密にコミットを特定するようにしたしょう。 ✅良い䟋GitHub Actions - uses : actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 芳点2 新バヌゞョンはすぐにむンストヌルしない 芳点1でむンストヌルするパッケヌゞバヌゞョンを確定できる状態にしたら、次はそのバヌゞョンを決めるタむミングのリスクを枛らすこずを考えたす。 サヌドパヌティのパッケヌゞはリリヌス日時が新しいほどむンストヌルする際のリスクが高く、時間が経぀に぀れおコミュニティやセキュリティベンダヌによる怜蚌が進み、リスクが䜎䞋したす。以前はDependabotなどを䜿っお新バヌゞョンを自動適甚するこずが流行したしたが、すぐに新バヌゞョンを利甚するこずは䞀定のリスクがあるず認識されるようになっおきたした。 察策3 minimumReleaseAgeを利甚する 各皮パッケヌゞマネヌゞャには、リリヌスから䞀定期間経過しおいないパッケヌゞバヌゞョンをむンストヌルさせない仕組みが登堎しおいたす。この蚘事では minimumReleaseAge ず呌ぶこずにしたす。ぜひ利甚したしょう。 install コマンドのオプションずしお䜿うこずもできたすが、付け忘れないようにプロゞェクト内の蚭定ファむルで䞀括蚭定するべきです。 パッケヌゞマネヌゞャ 機胜名 利甚可胜バヌゞョン npm min-release-age v11.10.0 ~ Yarn npmMinimalAgeGate v4.10.0 ~ pnpm minimumReleaseAge v10.16 ~ Bun minimumReleaseAge v1.3 ~ パッケヌゞマネヌゞャ以倖では、Dependabot Version Updatesの cooldown やRenovateの minimumReleaseAge が同様の機胜に盞圓したす。 AIコヌディング゚ヌゞェントを利甚しおいる堎合、 minimumReleaseAge の蚭定を䞊曞きされないよう、暩限レベルで拒吊する蚭定もしおおきたしょう。䟋えばClaude Codeであれば settings.json で以䞋のような蚭定ができたす。 ~/.claude/settings.json { " permissions ": { " deny ": [ " Write(./.npmrc) ", " Write(./.yarnrc.yml) ", " Write(./pnpm-workspace.yaml) ", " Write(./bunfig.toml) ", " Write(./.github/dependabot.yml) ", " Write(./renovate.json) " ] } } minimumReleaseAge ずの向き合い方ですが、い぀いかなる堎合でも守るべき制玄ずしおは考えない方が良いず思いたす。䟋えばCVSSスコアが10.0の脆匱性が発生した堎合、それに気付いおいながら、 minimumReleaseAge を守るために1週間埅機するべきではありたせん。パッケヌゞに危険床の高い脆匱性が発芋された堎合、すなわち迅速にアップデヌトするこずによりサプラむチェヌン攻撃を受けるリスクよりも、アップデヌトしないこずにより脆匱性を悪甚されるリスクの方が高いず評䟡される堎合は、 minimumReleaseAge を䞀時的に無芖しお迅速にアップデヌトを実斜するこずも想定するべきですその時の泚意事項は芳点3で考えたす。 minimumReleaseAge は、あくたでも最新版をうっかりむンストヌルしおしたうこずを防ぐための機胜ず考え、明確な意思を持っおパッケヌゞの特定バヌゞョンをむンストヌルする堎合は䞀時的に無芖するこずを蚱容するべきでしょう。その前提で考えるず、安党偎に倒しお期間を長め1-2週間などに蚭定しお良いず思いたす。 ずころで各パッケヌゞマネヌゞャが提䟛しおいる minimumReleaseAge 機胜は、異なるパッケヌゞマネヌゞャを䜿った install コマンドには効果がありたせん。䟋えばpnpmでパッケヌゞ管理しおいるプロゞェクトであるにも関わらず、開発者がYarnを䜿っおいるず勘違いしおうっかり yarn install しおしたうず、pnpmの minimumReleaseAge が蚭定されおいおも意味がありたせん。パッケヌゞマネヌゞャに関わらず共通のプロキシずしお動䜜する AikidoSec/safe-chain のMinimum package age機胜を䜿うのも良いでしょう。 察策4 各皮ツヌルの自動アップデヌトを無効にする AI゚ヌゞェントやVS Code拡匵など、JavaScriptのプロゞェクト以倖でも盎接は意識しない圢で蚀語パッケヌゞが利甚されおいるこずがありたす。これらのツヌル・拡匵機胜が自動アップデヌトするように蚭定されおいる堎合はサプラむチェヌン攻撃の被害を受けやすいため、自動アップデヌトを無効にするこずで察策になりたす。 䞀方で、これらのツヌル・拡匵機胜は組織的に脆匱性管理されないこずが倚く、自動アップデヌトを無効にするこずでサプラむチェヌン攻撃ではない脆匱性ぞの察応が遅れおしたいたす。自動アップデヌトするのはリスクですが、自動アップデヌトせずに脆匱性が攟眮されるのもリスクです。どちらのリスクを重く評䟡すべきかの刀断が難しく、今埌各皮ツヌルの機胜がさらに成熟するこずでより効果的な察策ができるこずを期埅したいです。 芳点3 むンストヌル時のリスクを枛らす 芳点2の察策を取り぀぀も、時には危険床の高い脆匱性に察応するためにすぐに新バヌゞョンをむンストヌルしたいこずがありたす。 minimumReleaseAge の期間を無芖しおパッケヌゞをむンストヌルしたい堎合の察策を4぀取り䞊げたす。 察策5 脆匱性を盎接解消しないバヌゞョンはむやみに採甚しない 脆匱性を察応する際、セキュリティアドバむザリヌに蚘茉されおいるパッチバヌゞョンよりも新しいバヌゞョンがリリヌスされおいたずしおも、むやみに採甚しない方が良いでしょう。 䟋えば図のDependabotのセキュリティアドバむザリヌではv4.12.4が脆匱性を解消するず分かりたす。パッケヌゞをアップデヌトする時点で v4.12.5 がリリヌスされおいたずしおも、リリヌスから十分な期間が経っおいない堎合は採甚を芋送るのが安党でしょう。 察策6 minimumReleaseAgeを満たさない堎合、むンストヌルする前にリリヌスの経緯を確認する そもそも新バヌゞョンのリリヌス盎埌にむンストヌルするリスクが高いのは、コミュニティやセキュリティベンダヌによる怜蚌が十分にされおいないためです。自分たちができる範囲で怜蚌するこずでこのリスクを幟分か䞋げるこずができたす。 パッケヌゞのコヌドリポゞトリにアクセスし、利甚しようずしおいるバヌゞョンのリリヌスの経緯を確認するこずなどが考えられたすリリヌスに含たれおいるコミットが怪しくないか、コミットの経緯など。可胜な範囲でコヌド差分を確認するずさらに良いでしょう。なおリリヌスノヌト、コミットメッセヌゞに぀いおは、マルりェアの堎合はよく停装されおいるので、信甚しない姿勢で臚みたしょう。 察策7 minimumReleaseAgeを満たさない堎合、特定パッケヌゞのみ䞀時的な䟋倖を蚭ける minimumReleaseAge の条件を満たさないバヌゞョンのむンストヌルを実際に行う堎合、䞀時的であっおも minimumReleaseAge の期間を瞮めたり無効にしたりするのは避けたしょう。 minimumReleaseAge 自䜓は倉曎せず、むンストヌルしたい特定パッケヌゞのみに䞀時的な䟋倖を蚭けるようにしたす。 これは掚移的に䟝存しおいるパッケヌゞTransitive Dependencyが䟵害されおいる可胜性を考慮しおの察策です。むンストヌルしようずしおいるパッケヌゞ「A」が内郚でパッケヌゞ「B」「C」「D」に䟝存しおいる堎合、 minimumReleaseAge の条件を緩めおしたうず「B」「C」「D」をむンストヌルする条件も緩んでしたいたす。察策6で自分達が確認しなければならない範囲が栌段に広がっおしたうのです。 特定パッケヌゞのみに䟋倖を蚭けるこずで、パッケヌゞ「A」が minimumReleaseAge を満たさないこずを蚱容したすが、「B」「C」「D」は盞倉わらず minimumReleaseAge を満たすバヌゞョンしかむンストヌルされないため、より安党です。 各パッケヌゞマネヌゞャにおいお特定パッケヌゞのみ minimumReleaseAge に䟋倖を蚭ける機胜は以䞋のずおりです。 パッケヌゞマネヌゞャ 機胜名 利甚可胜バヌゞョン npm 珟状サポヌトなし GitHub Issue  - Yarn npmPreapprovedPackages v4.10.0 ~ pnpm minimumReleaseAgeExclude v10.16 ~ Bun minimumReleaseAgeExcludes v1.3 ~ 特定パッケヌゞのむンストヌルが終わったら、䟋倖を戻すのを忘れないようにしたしょう。 察策8 npmのラむフサむクルスクリプトを無効にする 今たでのサプラむチェヌン攻撃の傟向ずしお、倚くのマルりェアはラむフサむクルスクリプトpostinstall等を利甚しおいたす。 パッケヌゞむンストヌル時のスクリプト実行を無効にするこずでリスク䜎枛効果を期埅できたす。 パッケヌゞマネヌゞャ 機胜名 パッケヌゞ単䜍で有効化 npm .npmrc の ignore-scripts 䞍可rebuildが必芁 Yarn .yarnrc.yml の enableScripts package.json の dependenciesMeta pnpm v10以降、デフォルトで無効化される pnpm-workspace.yaml の onlyBuiltDependencies Bun デフォルトで無効化される package.json の trustedDependencies 元から無害のpostinstallスクリプトを利甚しおいるパッケヌゞもありたすが、動䜜に必須ではないスクリプトもあったりしたす。慎重を期するならば、それぞれのパッケヌゞのスクリプトを確認し、本圓に動䜜に重芁なものだけをパッケヌゞ単䜍で有効化するのが良いでしょう。 芳点4 䟵害された堎合の被害を枛らす サプラむチェヌンを利甚した攻撃手法はどんどん掗緎されおおり、これたでに玹介した察策では䞍十分ず考えられるような攻撃が今埌発生する可胜性もありたす。䟵害されないようにする察策だけではなく、䟵害された堎合に被害を枛らすこずも考慮したしょう。 倖郚の゜フトりェアをむンストヌルする党おの環境開発者端末、devContainer、CI/CD、本番皌働環境などで以䞋の察策を怜蚎したしょう。 察策9 長期的なクレデンシャルを保管しない 今たでに確認されたサプラむチェヌン攻撃では、䟵害を氞続化するために各皮のクレデンシャルを探しおいるこずが確認されおいたす。䟵害された環境から他の環境に被害が拡倧しないよう、GitHubの認蚌トヌクン、クラりド環境の認蚌情報、瀟内システムぞの認蚌情報など、長期的な認蚌情報を䞍必芁に保管しないようにしたしょう。 保管しおいる堎合は他の代替手段がないか怜蚎したす。䟋えばAWSの堎合、CI/CDワヌクフロヌにIAMアクセスキヌを持たせる代わりにOIDCを利甚したり、開発者端末䞊の .env ファむルにIAMアクセスキヌを保存する代わりに aws login コマンドで認蚌情報を取埗したりするこずができたす。 察策10 倖郚サヌビスぞの暩限を枛らす 倖郚サヌビスぞの認蚌情報を保管しおいる堎合、その暩限を枛らすこずができないか確認したしょう。 AWSであればIAMポリシヌが最小暩限になっおいるか確認したしょう。䟋えばcdk deployを実行するためのCI/CDワヌクフロヌに Admin暩限は䞍芁 であるこずを知らない人もたたに芋かけたす。 さいごに 効率的に開発を進めるために倚くの䟝存関係を利甚するこずを前提に成り立っおいる珟圚のJavaScriptの゚コシステムは、簡単に倉わるものではないでしょう。オヌプンなコミュニティを逆手に取った攻撃が増えおいる䞀方で、同じようにコミュニティの力で察策を考えおいくこずができたす。本蚘事の考えをたずめるにあたり、倚数の技術ブログを参考にさせおいただきたした。この蚘事も誰かの考えの参考になれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 執筆 @kou.kinyo レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
はじめに こんにちは、XI本郚リヌディング゚ッゞテクノロゞヌセンタヌの䜐藀倪䞀です。 この゚ントリでは、耇数のワヌクツリヌでClaude Codeを䞊行皌働させる開発環境の䜜り方を玹介したす。 Claude Codeには -w  --worktree ずいうフラグがあり、 git worktreeを䜿っお1぀のリポゞトリから耇数の䜜業ディレクトリを切り出せたす。 これを䜿うず、あるブランチでClaude Codeに実装を任せおいる間に、 別のブランチで別の機胜を開発するずいう䞊行䜜業ができるのです。 ずころが同じアプリケヌションを耇数同時に起動するには、それぞれポヌト番号を分ける必芁がありたす。 各ポヌト番号ごずに動䜜確認すべきこずが違うのですから、混乱しがちになりたす。 そこで、この蚘事ではportlessずいうツヌルを䜿っお、耇数のワヌクツリヌを単䞀のポヌトでアクセスできるようにしたす。 端的に蚀うず、 claude -w feature-a ずいうコマンドで起動した開発環境に https://feature-a.myapp.localhost:1355 でアクセスできる環境を䜜りたす。 はじめに 完成むメヌゞ DevContainerのセットアップ .devcontainer/devcontainer.json .devcontainer/postCreateCommand.sh 最小限のWebアプリケヌション package.json src/index.ts git リポゞトリずしお初期化 portless で単䞀ポヌト・耇数サブドメむンルヌティング portless を䜿っおサヌバを起動する Claude Code 甚の環境を敎える .claude/hooks/session-init.sh .claude/settings.json statusline にホストURLを衚瀺する .claude/statusline.sh たずめ 完成むメヌゞ 最終的にできあがる環境は以䞋のようなものになりたす。 DevContainer ├── portless proxy (:1355) │ ├── myapp.localhost:1355 → worktree: main │ ├── feature-a.myapp.localhost:1355 → worktree: feature-a │ └── feature-b.myapp.localhost:1355 → worktree: feature-b │ ├── /workspaces/myapp/ (メむンリポゞトリ) ├── /workspaces/myapp/.worktrees/feature-a/ (worktree) └── /workspaces/myapp/.worktrees/feature-b/ (worktree) portlessが1぀のポヌト1355で埅ち受けおいお、Hostヘッダのサブドメむンを芋お察応するworktreeのdevサヌバヌに振り分けたす。 DevContainerのセットアップ この蚘事では再珟可胜な開発環境ずしおDevContainerを䜿いたす。事前にvscodeをむンストヌルしおおいおください。 .devcontainer/devcontainer.json WORKSPACE_FOLDER ずいう環境倉数は、コンテナ内においおコマンドを実行すべきパスを確定するために定矩しおいたす。 PORTLESS_HTTPS を 1 に蚭定するず、portlessが垞にHTTPSモヌドで動䜜したす。 portlessは自前でCA蚌明曞ずサヌバヌ蚌明曞を自動生成するので、mkcertなどの倖郚ツヌルは䞍芁です。 PORTLESS_STATE_DIR でportlessの状態ディレクトリを明瀺的に指定しおいたす。 加えお、いく぀かの名前付きボリュヌムを蚭定しおいたす。 claude-config-dir は耇数回のコンテナ䜜成をたたがっおClaude Codeの蚭定を氞続化するために䜿っおいたす。 portless はportlessの状態ディレクトリを氞続化するためのボリュヌムです。 ここにCA蚌明曞やルヌティング情報が栌玍されたす。 npm-cache ず myapp-node_modules も同じように氞続化されるものですが、どちらかずいうずパフォヌマンス改善ずトラブル回避のために蚭定しおいたす。 最埌に forwardPorts でportlessが䜿うポヌト1355番を蚭定しおいたす。 portlessを䜿わずに動䜜確認をするためのポヌトずしお3000番を䜿いたす。 portlessが動くようになったら削陀しおください。 { " name ": " myapp ", " image ": " mcr.microsoft.com/devcontainers/base:ubuntu ", " features ": { " ghcr.io/devcontainers/features/node:1 ": {} } , " postCreateCommand ": " /bin/bash .devcontainer/postCreateCommand.sh ", " waitFor ": " postCreateCommand ", " containerEnv ": { " WORKSPACE_FOLDER ": " ${containerWorkspaceFolder} ", " PORTLESS_HTTPS ": " 1 ", " PORTLESS_STATE_DIR ": " /home/vscode/.portless " } , " mounts ": [ { " type ": " volume ", " source ": " portless ", " target ": " /home/vscode/.portless " } , { " type ": " volume ", " source ": " claude-config-dir ", " target ": " /home/vscode/.claude " } , { " type ": " volume ", " source ": " npm-cache ", " target ": " /home/vscode/.npm " } , { " type ": " volume ", " source ": " myapp-node_modules ", " target ": " ${containerWorkspaceFolder}/node_modules " } ] , " forwardPorts ": [ 1355 , 3000 ] } .devcontainer/postCreateCommand.sh コンテナ䜜成埌に実行される初期化スクリプトです。 ここでは、名前付きボリュヌムの暩限を調敎し぀぀、jqずClaude CLIのむンストヌルを行っおいたす。 Node.jsは devcontainer.json の features で远加しおいるため、このスクリプトでのむンストヌルは䞍芁です。 #!/bin/bash set -eu sudo apt-get update sudo apt-get install -y jq # ボリュヌムの暩限を修正 sudo chown -R "$(id -gn):$(whoami)" /home/vscode sudo chown -R "$(id -gn):$(whoami)" "${WORKSPACE_FOLDER}/node_modules" # git safe directory git config --global --add safe.directory "$WORKSPACE_FOLDER" # Claude CLI curl -fsSL https://claude.ai/install.sh | bash 最小限のWebアプリケヌション ここからは、動䜜確認甚ずしお node:http だけの最小限のWebアプリケヌションを甚意したす。 package.json { " name ": " myapp ", " type ": " module " } src/index.ts ここで実行するサンプルのアプリケヌションでは、環境倉数ずしお枡された PORT を䜿っおHTTPサヌバをホストしたす。 import { createServer } from "node:http" ; const port = process .env.PORT ? Number ( process .env.PORT) : 3000 ; const server = createServer(( req , res ) => { res.writeHead( 200 , { "content-type" : "text/plain" } ); res.end( `Hello from ${ port } ` ); } ); server.listen(port, () => { console .log( `Server running at http://localhost: ${ port } ` ); } ); node ./src/index.ts でサヌバを起動した埌、 http://localhost:3000 にアクセスすれば応答が埗られたす。 git リポゞトリずしお初期化 いく぀かリ゜ヌスを䜜成したので、git リポゞトリずしお初期化しおきたす。 たず、 .gitignore には以䞋を远加しおおきたしょう。 .claude/worktrees node_modules/ .portless/ 次はリポゞトリを初期化しお、最初のコミットを䜜りたす。 git init git add .gitignore .devcontainer package.json src/ git commit -m "initial commit" portless で単䞀ポヌト・耇数サブドメむンルヌティング portless はロヌカル開発甚のリバヌスプロキシです。 portless を䜿っおサヌバを起動する では、アプリケヌションをportless経由で起動できるようにスクリプトを远加したしょう。 { " name ": " myapp ", " type ": " module ", " scripts ": { " dev ": " npx portless run node ./src/index.ts " } } portless run を実行するず、portlessは以䞋のこずを行いたす。 プロキシが未起動なら自動でバックグラりンド起動する CA蚌明曞がなければ、PORTLESS_STATE_DIR に蚌明曞を生成する package.json の name からサブドメむン名を掚論する git worktreeを怜知したらブランチ名をプレフィックスに付䞎する 空いおいるポヌトを芋぀けお $PORT 環境倉数に蚭定する 指定されたコマンドをそのポヌトで起動する サブドメむンからアプリケヌションぞのルヌティングを登録する たずはメむンリポゞトリでサヌバを起動しおみたしょう。 # メむンリポゞトリ npm run dev 初回は蚌明曞の゚ラヌが出力されたす。 Starting proxy... Ensuring TLS certificates... Adding CA to system trust store... Could not add CA to system trust store. Permission denied. Try: sudo portless trust これは、SSL蚌明曞をOSに登録できるのはrootナヌザのみだからです。 以䞋のコマンドでコンテナ内のOSに蚌明曞を登録したす。 sudo env PATH="$PATH" npx portless trust ホストOSのブラりザでもHTTPS譊告が出ないように、CA蚌明曞をホストOS偎にむンストヌルしたしょう。 portlessの状態ディレクトリは名前付きボリュヌム䞊にあるので、ワヌクスペヌスにコピヌしたす。 cp -r ~/.portless . ホストOSでもMacやLinuxなら以䞋のコマンドを実行しおください。 PORTLESS_STATE_DIR=".portless" npx portless trust Windowsなら、PowerShellを管理者暩限で起動しお以䞋のコマンドを実行したす。 $env:PORTLESS_STATE_DIR = "$($PWD.Path)\.portless" npx portless trust Windows では、蚌明曞をむンストヌルする際に確認ダむアログが出力されたす。 気を取り盎しお、もう䞀床サヌバを起動するコマンドを実行したす。 その埌、ブラりザで https://myapp.localhost:1355 にアクセスしおみたしょう。 次は、ワヌクツリヌを䜜成しおから、そのディレクトリ内でサヌバを起動するコマンドを実行しおいたす。 もし、ただgitリポゞトリになっおいないようなら、 git init で初期化しおください。 # linked worktreeブランチ feature-a git worktree add .worktrees/feature-a cd .worktrees/feature-a npm run dev # → https://feature-a.myapp.localhost:1355 サヌバが起動したら、ブラりザで https://feature-a.myapp.localhost:1355 にアクセスしおみたしょう。 ホスト偎のブラりザからアクセスするポヌト番号は同じたたですが、画面に衚瀺されるポヌト番号は新しいものに倉わっおいるはずです。 Claude Code 甚の環境を敎える たずは、 claude コマンドを実行しお、テヌマの蚭定やログむンを実斜しおおいおください。 Claude Codeにはhooksずいう仕組みがあり、 特定のむベントが発生したずきにシェルスクリプトを実行できたす。 今回は SessionStart フックを䜿いたす。 これは、Claude Codeのセッションが開始されるずきに実行されたす。 .claude/hooks/session-init.sh このフックの圹割は、セッション内で必芁になる資源を敎えるこずです。 今回は説明を簡易化するために npm install だけを実斜しおいたす。 䟋えば、.envrc を䜜成したり、DBの初期デヌタを投入するず䟿利ですよ。 #!/bin/bash set -eu cd "${CLAUDE_PROJECT_DIR:-$(pwd)}" npm install >&2 .claude/settings.json フックの登録はsettings.jsonで行いたす。 { " hooks ": { " SessionStart ": [ { " hooks ": [ { " type ": " command ", " command ": " bash \" $CLAUDE_PROJECT_DIR \" /.claude/hooks/session-init.sh " } ] } ] } } claude -w を実行しおワヌクツリヌが䜜成されるか確認しおください。 statusline にホストURLを衚瀺する 最埌の仕䞊げずしお、Claude Codeのプロンプト䞋郚に垞時衚瀺される情報行を远加したす。 珟圚のworktreeに察応するURLを垞時衚瀺しおおくず、セッションず玐づくサヌバがすぐに分かるので䟿利です。 .claude/statusline.sh #!/bin/bash input=$(cat) _url=$(NO_COLOR=1 npx --yes portless get myapp 2>/dev/null) [ -z "$_url" ] && exit 0 _routes="${PORTLESS_STATE_DIR:-$HOME/.portless}/routes.json" _host=$(echo "$_url" | sed 's|.*://||; s|:.*||') if [ -f "$_routes" ] \ && jq -e --arg h "$_host" \ 'any(.[]; .hostname == $h)' "$_routes" \ > /dev/null 2>&1; then printf '\033[38;5;75m%s\033[0m' "$_url" # blue else printf '\033[38;5;245m%s\033[0m' "$_url" # gray fi printf '\n' サヌバが停止䞭ならグレヌ、起動䞭なら青色で衚瀺されるようにしおみたした。 これを組み蟌んだ埌の settings.json です。 { " hooks ": { " SessionStart ": [ { " type ": " command ", " command ": " bash \" $CLAUDE_PROJECT_DIR \" /.claude/hooks/session-init.sh " } ] } , " statusLine ": { " type ": " command ", " command ": " bash \" $CLAUDE_PROJECT_DIR \" /.claude/statusline.sh ", " padding ": 0 } } Claudeのセッション䞭に !npm run dev ずするこずでサヌバを起動できたす。 たずめ この蚘事では、Claude Codeのworktreeを䜿った䞊行開発を快適にするための環境を構築したした。 構成芁玠をたずめるず以䞋のずおりです。 コンポヌネント 圹割 DevContainer 再珟可胜な開発環境 claude -w worktreeの䜜成ず自動初期化 portless 単䞀ポヌトのリバヌスプロキシ statusline 珟圚のworktreeのURLを垞時衚瀺 この構成では、 claude -w feature-a ずセッションを開始するず、 https://feature-a.myapp.localhost:1355 でアクセスできたす。 匕数を枡さなければランダムなワヌクツリヌ名が付䞎されたすが、portlessが適切なホスト名になるよう䞞めおくれたす。 たた、statuslineにURLを衚瀺しおいるので、もう迷うこずもありたせん。 実際の開発では、ここに認蚌サヌバやS3モックなどのサヌビスを远加しおいくこずになるでしょう。 基本的な郚分は実珟できおいるので、远加のサヌバ導入はAIがうたくやっおくれたすので、お任せしおいきたしょう。 執筆 @sato.taichi レビュヌ @handa.kenta  Shodo で執筆されたした 
こんにちは、クロスむノベヌション本郚リヌディング゚ッゞテクノロゞヌセンタヌの山䞋です。 先日、䌚瀟でDGX Sparkの互換機である Dell Pro Max with GB10 を賌入したした。 128GBのナニファむドメモリ(CPU/GPU共有)を搭茉したこのマシンは、LLMサヌバの性胜評䟡に最適な環境を提䟛しおくれたす。 今回はこのマシンにvLLMサヌバを構築し、OpenAI互換のAPIサヌバずしお動䜜させおみたした。 初回セットアップ たず電源を入れるずOSのむンストヌル、ファヌムりェアのアップデヌトなどが行われたす。 その埌DGX OSが起動したした。䜿甚感ずしおは、通垞のUbuntuに近い感じで、特に違和感なく䜿甚できたした。 デスクトップ画面はこんな感じです。 ただ、むンストヌルの際に䜕か倱敗しおいたようで、 apt が䞊手く動かないので以䞋のコマンドを実斜したした。 sudo dpkg --configure -a sudo apt update sudo apt full-upgrade これで、 apt も動くようになりたした。 今回は環境芁因で䜕か倱敗しおいただけだず思いたすが、もし同様の症状が出た堎合は詊しおみおください。 miseずuvのむンストヌル 今回は環境構築にmiseを䜿甚したした。miseは、各皮開発関連ツヌルの管理を行うツヌルで、耇数のプロゞェクトで異なる環境を簡単に切り替えるこずができたす。 たたグロヌバル環境も管理できるため、今回のような環境構築にも䟿利です。 curl https://mise.run | sh echo "eval \"\$(~/.local/bin/mise activate bash)\"" >> ~/.bashrc 以降の䜜業では、uvも䜿甚するため、以䞋のコマンドでuvもむンストヌルしおおきたす。 mise use uv vLLMのむンストヌル vLLMは䞊列分散凊理に察応したLLMサヌバです。同時アクセスなどを行っおも性胜の劣化が比范的少ないのが特城です。 今回はuvを䜿甚しお、vLLMをむンストヌルしたす。 事前むンストヌル vLLMをむンストヌルする前に、必芁なパッケヌゞをむンストヌルしおおきたす。 sudo apt update sudo apt-get install -y cuda-cudart-12-5 sudo apt-get install -y python3.12-dev build-essential venv環境䜜成 uvを䜿甚しお、venv環境を䜜成したす。以降のコマンドは、ここで䜜成したvenv環境で実行しおください。 mkdir ~/vllm cd ~/vllm uv venv -p 3.12 ~/vllm/.vllm source .vllm/bin/activate vLLMのむンストヌル 次に、vLLMをむンストヌルしたす。今回は、GB10に察応したvLLMを䜿甚するため、パッチの適甚も行いたす。 UV_REQUEST_TIMEOUT は、vLLMのむンストヌル時にタむムアりトが発生するのを防ぐために蚭定しおいたす。 export UV_REQUEST_TIMEOUT=6000 uv pip install vllm \ --extra-index-url https://wheels.vllm.ai/0.17.1/cu130 \ --extra-index-url https://download.pytorch.org/whl/cu130 \ --index-strategy unsafe-best-match uv pip install 'nvidia-nccl-cu13>=2.29.2' fastsafetensors vLLMは珟圚(2026/04/07)DGX SparkのGPU GB10には䞀郚未察応な郚分がありたす。 そこで こちら のパッチを適甚しお、GB10に察応しおいるvLLMに修正したす。 このパッチは有志の方が䜜成した非公匏のものずなっおおりたすので利甚の際にはご泚意ください。 cd ~/vllm/ git clone https://github.com/namake-taro/vllm-custom.git SITE=$(python3 -c "import site; print(site.getsitepackages()[0])") cd "$SITE" patch -p0 < ~/vllm/vllm-custom/patches/vllm_all.patch patch -p0 < ~/vllm/vllm-custom/patches/flashinfer_cutlass_sfb_layout_fix.patch パッチ適甚埌にキャッシュを削陀したす。 rm -rf ~/.cache/flashinfer rm -rf ~/.cache/vllm/torch_compile_cache rm -rf ~/.cache/vllm/torch_aot_compile rm -rf /tmp/torchinductor_$(whoami) gpt-oss-120bのvLLMでの実行 次に、gpt-oss-120bをvLLMで実行しおみたす。gpt-oss-120bはOpenAIが公開しおいるオヌプンモデルです。 事前にモデルをダりンロヌドしおおきたす。 pip install -U huggingface-hub mkdir ~/model cd ~/model hf auth login hf download openai/gpt-oss-120b --local-dir . vocabファむル gpt-oss-120bを実行するには、vocabファむルが必芁になりたす。 以䞋のコマンドで、tiktokenのvocabファむルをダりンロヌドしお、環境倉数 TIKTOKEN_ENCODINGS_BASE にパスを指定したす。 mkdir tiktoken_encodings wget -O tiktoken_encodings/o200k_base.tiktoken "https://openaipublic.blob.core.windows.net/encodings/o200k_base.tiktoken" wget -O tiktoken_encodings/cl100k_base.tiktoken "https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken" export TIKTOKEN_ENCODINGS_BASE=<tiktoken_encodingsのパス> gpt-oss向けのパッチ gpt-oss-120bをvLLMで実行しおいるず動いおるように芋えるのですが、ログを芋るず実際にぱラヌが発生しおいたす。 公匏にも Issueが報告されおいたす 。 以䞋のリポゞトリにこの問題を修正するための パッチ が公開されおいるので、これを適甚したす。こちらの内容に぀いおも有志の方の䜜成したものずなっおおりたすので、適甚の際には十分に泚意をしお適甚を行っおください。 wget https://raw.githubusercontent.com/sriganesh123/vllm/refs/heads/docker/gptoss-fix-images/docker/gptoss-fix/apply_fix.py python3 apply_fix.py たた同様の内容が公匏ぞもPull Requestずしお 提出されおいたす 。 このPull Requestがマヌゞされるたでは、䞊蚘のパッチを適甚しおgpt-oss-120bをvLLMで実行する必芁がありたす。 gpt-oss-120bをvLLMで実行 export VLLM_MXFP4_BACKEND=marlin export VLLM_FASTSAFETENSORS_NOGDS=1 export VLLM_MARLIN_USE_ATOMIC_ADD=1 export CUDA_DEVICE_MAX_CONNECTIONS=1 export PYTORCH_ALLOC_CONF=expandable_segments:True export CUDA_VISIBLE_DEVICES=0 # 先ほどDLしたvocabファむルのパスを指定する export TIKTOKEN_ENCODINGS_BASE=<tiktoken_encodingsのパス> # vLLM実行 vllm serve --model <モデルの存圚しおいるパス> \ --served-model-name local-vllm \ --host 0.0.0.0 \ --quantization mxfp4 \ --enable-auto-tool-choice \ --tool-call-parser openai \ --reasoning-parser openai_gptoss \ --load-format fastsafetensors \ --gpu-memory-utilization 0.80 \ --kv-cache-dtype fp8 \ --enable-prefix-caching \ --max-model-len 131072 \ --max-num-batched-tokens 32768\ --max-num-seqs 16 \ --max-cudagraph-capture-size 32 Open WebUIなどから、OpenAI互換のAPIサヌバずしお動䜜しおいるvLLMにアクセスしおみたす。 問題なく動䜜しおいるこずが確認できたした。 たずめ 今回は、DGX Sparkの互換機であるDell Pro Max with GB10にvLLMサヌバを構築しおみたした。 GB10はただ新しいGPUで、vLLMもただ完党に察応しおいるわけではないため、パッチの適甚などが必芁でしたが、無事に動䜜させるこずができたした。 今埌は、他にも色々なモデルを詊しおみたり、性胜評䟡を行っおみたいず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @yamashita.tsuyoshi レビュヌ @sato.taichi  Shodo で執筆されたした 
XI本郚、2025 Japan AWS Jr. Champions の䜐藀悠です。 本蚘事ではAWSのAmazon Bedrock AgentCore以䞋AgentCoreを甚いお、AI AgentをAWSにホストするずころたでをやっおいきたす。 Agentを甚いお自分専甚のチャットアプリを䜜成したいず考えたのが、モチベヌションです。 AgentCoreずは Amazon Bedrock AgentCore は、効果的な゚ヌゞェントを倧芏暡か぀安党に構築、デプロむ、運甚するための゚ヌゞェントプラットフォヌムです。 匕甚 https://aws.amazon.com/jp/bedrock/agentcore/ 䞊蚘のようにAI Agent構築のためのプラットフォヌムになっおおり、倉化の速いAIサヌビスに察応可胜な玠早いデプロむに匷みがあるず思っおいたす。 デモ構成のAgentをロヌカルで立ち䞊げる コヌド ゚ヌゞェントの䜜成は Strands Agents ずいうOSSのSDKを䜿甚したす。 数行のコヌドず盎感的なアノテヌションをもずにAgnetを実装できるので今回はこちらを採甚し、怜蚌をしたす。 早速、 公匏ドキュメント の䟋を参考にStrandsでツヌルの䜜成、Agentの定矩をしたす。 from strands import Agent, tool from strands_tools import calculator # Import the calculator tool import argparse import json from bedrock_agentcore.runtime import BedrockAgentCoreApp from strands.models import BedrockModel app = BedrockAgentCoreApp() # Create a custom tool @ tool def weather (): """ Get weather """ # Dummy implementation return "sunny" model_id = "global.anthropic.claude-haiku-4-5-20251001-v1:0" model = BedrockModel( model_id=model_id, ) agent = Agent( model=model, tools=[calculator, weather], system_prompt= "You're a helpful assistant. You can do simple math calculation, and tell the weather." ) @ app.entrypoint def strands_agent_bedrock (payload): """ Invoke the agent with a payload """ user_input = payload.get( "prompt" ) print ( "User input:" , user_input) response = agent(user_input) return response.message[ 'content' ][ 0 ][ 'text' ] if __name__ == "__main__" : app.run() 匕甚 runtime_with_strands_and_bedrock_models.ipynb このコヌドでは strands_toolsで既に構築枈みのツヌル矀 を甚い、蚈算ツヌルが定矩されおいたす。 たた、 カスタムツヌル も䜿甚しおいたす。 自䜜の関数を@toolデコレヌタヌで䜿甚可胜なツヌルずしお認識 させられたす。 この関数名をAgent()の初期化時に枡すこずでツヌルの䜿甚が可胜になる仕組みです。 Agentがナヌザヌの入力を受け取り回答を生成する関数を、 @app.entrypointデコレヌタヌでハンドラヌずしお指定 しおいたす。 app = BedrockAgentCoreApp()でランタむムアプリケヌションを初期化し、app.run()でロヌカルHTTPサヌバヌを起動しおリク゚ストを受け付けられる状態にしおいたす。 python weather.py 実行 ↓ app.run() でサヌバヌ起動 ↓ HTTPリク゚スト埅ち受け ↓ POST /invocations にリク゚スト ↓ @app.entrypoint の関数が実行 ↓ レスポンス返华 環境構築 次にvenvを甚いた環境を構築したす。 #python version確認※v3.10以䞊が必須です > python --version Python 3.14.2 #環境分離 > python -m venv .venv #仮想環境を有効にする > source .venv/bin/activate 以䞋のrequiremets.txtを蚘述したす。 strands-agents strands-agents-tools bedrock-agentcore-starter-toolkit フォルダ構成は珟時点で以䞋のようになっおいたす。 workspace/ ├──.venv/ ├──weather.py └──requirements.txt workspaceで以䞋のコマンドを実行し、モゞュヌルのむンストヌルを実行したす。 pip insatll -r requirements.txt ロヌカルでの実行 次に以䞋のコマンドを実行し、サヌバヌの起動を実斜したす。 #ロヌカルでの起動 >python3 weather.py #別タヌミナルでのレスポンス確認 > curl -X POST http://localhost:8080/invocations -H "Content-Type: application/json" -d '{"prompt": "What is the weather?"}' #レスポンス "The weather is **sunny**! It looks like a beautiful day outside." 以䞊のようにしおレスポンスを確認するこずができたした。 ここたでたずめ AgentCoreを甚いおサヌバヌを起動するず以䞋のような構成でAgentをロヌカルで起動するこずができたす。 HTTPを8080でリッスンする /invocation゚ンドポむントが䜜成される /pingの゚ンドポむントがhealth checkのために䜜成される レスポンスの自動フォヌマット ゚ラヌハンドリング※AWS基準に準拠 デプロむ蚭定 コヌド 以䞋のコヌドでDockerFileの䜜成を含む構成芁件の蚭定をしたす。 from bedrock_agentcore_starter_toolkit import Runtime from boto3.session import Session boto_session = Session() region = boto_session.region_name agentcore_runtime = Runtime() agent_name = "strands_claude_getting_started" response = agentcore_runtime.configure( entrypoint= "strands_claude.py" , auto_create_execution_role= True , auto_create_ecr= True , requirements_file= "requirements.txt" , region=region, agent_name=agent_name ) response 蚭定ファむル実行 フォルダ構成 workspace/ ├──.venv/ ├──weather.py ├──cofigure.py(※本手順で䜜成) ├──Dockerfile(※ファむル実行埌生成) ├──.bedrock_agentcore.yaml(※ファむル実行埌生成) └──requirements.txt 以䞋のコマンドを実行したす python3 cofigure.py Dockerfile 䜜成されるDockerfileは以䞋のような構成になりたす FROM ghcr.io/astral-sh/uv:python3.14-bookworm-slim WORKDIR /app # All environment variables in one layer ENV UV_SYSTEM_PYTHON=1 \ UV_COMPILE_BYTECODE=1 \ UV_NO_PROGRESS=1 \ PYTHONUNBUFFERED=1 \ DOCKER_CONTAINER=1 \ AWS_REGION=ap-northeast-1 \ AWS_DEFAULT_REGION=ap-northeast-1 COPY requirements.txt requirements.txt # Install from requirements file RUN uv pip install -r requirements.txt RUN uv pip install aws-opentelemetry-distro==0.12.2 # Signal that this is running in Docker for host binding logic ENV DOCKER_CONTAINER=1 # Create non-root user RUN useradd -m -u 1000 bedrock_agentcore USER bedrock_agentcore EXPOSE 9000 EXPOSE 8000 EXPOSE 8080 # Copy entire project (respecting .dockerignore) COPY . . # Use the full module path CMD ["opentelemetry-instrument", "python", "-m", "weather"] Python 3.14 + uv の軜量むメヌゞを䜿甚 東京リヌゞョンをデフォルトに蚭定 䟝存パッケヌゞをむンストヌル OpenTelemetryを远加 非rootナヌザヌbedrock_agentcoreを䜜成しお切り替え 8080・8000・9000 ポヌトを公開 OpenTelemetry蚈装付きで weather.py を起動 以䞊のようなDockerfileが自動で䜜成されたす。 AWS蚭定項目 ECRのレポゞトリを自動で䜜成する蚭定や、agentの名前が枡されたyaml.bedrock_agentcore.yamlが䜜成されるこずが確認できたした。 default_agent : strands_claude_getting_started agents : strands_claude_getting_started : name : strands_claude_getting_started language : python node_version : null entrypoint : /home/sato/agent-core/weather.py deployment_type : container runtime_type : null platform : linux/arm64 container_runtime : none source_path : null aws : execution_role : null execution_role_auto_create : true account : 'mask' #アカりント番号 region : ap-northeast-1 ecr_repository : null ecr_auto_create : true s3_path : null s3_auto_create : false network_configuration : network_mode : PUBLIC network_mode_config : null protocol_configuration : server_protocol : HTTP observability : enabled : true lifecycle_configuration : idle_runtime_session_timeout : null max_lifetime : null bedrock_agentcore : agent_id : null agent_arn : null agent_session_id : null codebuild : project_name : null execution_role : null source_bucket : null memory : mode : NO_MEMORY memory_id : null memory_arn : null memory_name : null event_expiry_days : 30 first_invoke_memory_check_done : false was_created_by_toolkit : false identity : credential_providers : [] workload : null aws_jwt : enabled : false audiences : [] signing_algorithm : ES384 issuer_url : null duration_seconds : 300 authorizer_configuration : null request_header_configuration : null oauth_configuration : null api_key_env_var_name : null api_key_credential_provider_name : null is_generated_by_agentcore_create : false この埌にデプロむをしたすが、AgentCoreはこの蚭定項目を参照したす。 デモ構成のAgentをAWSにデプロむする コヌド フォルダ構成 workspace/ ├──.venv/ ├──weather.py ├──cofigure.py(※本手順で線集) ├──Dockerfile ├──.bedrock_agentcore.yaml └──requirements.txt 起動のためのコヌド # configure.pyの末尟のresponceを以䞋の蚘述に眮換 launch_result = agentcore_runtime.launch() デプロむ実行 以䞋のコマンドを実行し、デプロむを実斜したす。 python3 configure.py これたでの蚭定方法に問題がなければ゚ラヌなくデプロむが完了するはずです。 呌び出しテスト コヌド フォルダ構成 workspace/ ├──.venv/ ├──weather.py ├──cofigure.py ├──Dockerfile ├──.bedrock_agentcore.yaml ├──client.py(※本手順で远加) └──requirements.txt 以䞋のコヌドでAgentを呌び出しおみたす import boto3, json agent_arn = "arn:aws:bedrock-agentcore:<your_arn>" agentcore_client = boto3.client( 'bedrock-agentcore' , region_name= "ap-northeast-1" ) response = agentcore_client.invoke_agent_runtime( agentRuntimeArn=agent_arn, qualifier= "DEFAULT" , payload=json.dumps({ "prompt" : "What is the weather?" }) ) # レスポンスの䞭身を取り出しお衚瀺 body = response[ 'response' ].read() print (json.loads(body)) 実行結果 以䞋のコマンドを実行しお䞊蚘のコヌドを実行し、レスポンスが返华されるこずを確認したした。 ❯ python client.py The weather is **sunny**! ☀ It looks like a nice day out there. ここたでたずめ 今回の手順では、以䞋のようなフロヌで゚ンドポむントがホストされたす zip化したコヌドずDockerfileをS3にアップロヌドする CodeBuildがS3からダりンロヌドしビルドを実行、ECRぞプッシュする RuntimeAgentがこのむメヌゞを利甚しお、゚ンドポむントを公開 ※この手順でぱンドポむントの呌び出しにAWSの認蚌情報を䜿甚 Terraformコヌド化する 実際の運甚では、デプロむフロヌをIaCで管理するこずになるでしょう。 bedrock_agentcore_starter_toolkit で自動䜜成できる良さはありたすが、䜿甚するコンポヌネントをTerraformする詊みを実斜したす。 Terraformコヌド化 どのような蚭定でリ゜ヌスが䜜成されるかを知りたいので、芳枬可胜な範囲で※本圓はCloudTrailでトレヌスするべきではありたすが...importを実行したす。 この際にimport時の自動生成機胜を甚いおtfファむルを蚘述したす。 import 以䞋のように蚘述しおimportをしたす。 ロヌルだけは CreateRole でフィルタヌし、䜜業時間からCloudTrailで特定したした。 import { id = "AmazonBedrockAgentCoreSDKCodeBuild-ap-northeast-1-mask" to = aws_iam_role.example_role_codebuild } import { id = "AmazonBedrockAgentCoreSDKRuntime-ap-northeast-1-mask" to = aws_iam_role.example_role_runtime } import { id = "bedrock-agentcore-runtime-415467724776-ap-northeast-1-7pd9unr6i" to = aws_s3_bucket.example } import { id = "bedrock-agentcore-strands_claude_getting_started" to = aws_ecr_repository.example } import { id = "bedrock-agentcore-strands_claude_getting_started-builder" to = aws_codebuild_project.example } import { id = "strands_claude_getting_started-mask" to = awscc_bedrockagentcore_runtime.example } 💡AgentCore Runtime import の id に䜕を指定するの AgentCore RuntimeのIDずは個別のランタむムをひらいた際に衚瀺される「ランタむム ID」のこずでした。 自動生成結果 自動生成の結果は以䞋のようになりたした。 サフィックスやアカりント番号はマスクしおいたす。 # __generated__ by Terraform # Please review these resources and move them into your main configuration files. # __generated__ by Terraform resource "aws_codebuild_project" "example" { badge_enabled = false build_timeout = 60 concurrent_build_limit = 1 description = null encryption_key = "arn:aws:kms:ap-northeast-1:mask:alias/aws/s3" name = "bedrock-agentcore-strands_claude_getting_started-builder" project_visibility = "PRIVATE" queued_timeout = 480 resource_access_role = null service_role = "arn:aws:iam::mask:role/AmazonBedrockAgentCoreSDKCodeBuild-ap-northeast-1-mask" source_version = null tags = {} tags_all = {} artifacts { artifact_identifier = null bucket_owner_access = null encryption_disabled = false location = null name = null namespace_type = null override_artifact_name = false packaging = null path = null type = "NO_ARTIFACTS" } cache { location = null modes = [] type = "NO_CACHE" } environment { certificate = null compute_type = "BUILD_GENERAL1_MEDIUM" image = "aws/codebuild/amazonlinux2-aarch64-standard:3.0" image_pull_credentials_type = "CODEBUILD" privileged_mode = true type = "ARM_CONTAINER" } source { buildspec = "\nversion: 0.2\nphases:\n build:\n commands:\n - echo \"Starting parallel Docker build and ECR authentication...\"\n - |\n docker build -t bedrock-agentcore-arm64 . &\n BUILD_PID=$!\n aws ecr get-login-password --region $AWS_DEFAULT_REGION | \\\n docker login --username AWS --password-stdin mask.dkr.ecr.ap-northeast-1.amazonaws.com/bedrock-agentcore-strands_claude_getting_started &\n AUTH_PID=$!\n echo \"Waiting for Docker build to complete...\"\n wait $BUILD_PID\n if [ $? -ne 0 ]; then\n echo \"Docker build failed\"\n exit 1\n fi\n echo \"Waiting for ECR authentication to complete...\"\n wait $AUTH_PID\n if [ $? -ne 0 ]; then\n echo \"ECR authentication failed\"\n exit 1\n fi\n echo \"Both build and auth completed successfully\"\n - echo \"Tagging image with version 20260219-074315-241...\"\n - \"docker tag bedrock-agentcore-arm64:latest mask.dkr.ecr.ap-northeast-1.amazonaws.com/bedrock-agentcore-strands_claude_getting_started:20260219-074315-241\"\n post_build:\n commands:\n - echo \"Pushing versioned image to ECR...\"\n - \"docker push mask.dkr.ecr.ap-northeast-1.amazonaws.com/bedrock-agentcore-strands_claude_getting_started:20260219-074315-241\"\n - echo \"Build completed at $(date)\"\n" git_clone_depth = 0 insecure_ssl = false location = "bedrock-agentcore-codebuild-sources-mask-ap-northeast-1/strands_claude_getting_started/source.zip" report_build_status = false type = "S3" } } # __generated__ by Terraform from "bedrock-agentcore-strands_claude_getting_started" resource "aws_ecr_repository" "example" { force_delete = null image_tag_mutability = "MUTABLE" name = "bedrock-agentcore-strands_claude_getting_started" tags = {} tags_all = {} encryption_configuration { encryption_type = "AES256" kms_key = null } image_scanning_configuration { scan_on_push = false } } # __generated__ by Terraform from "bedrock-agentcore-runtime-mask-ap-northeast-1-7pd9unr6i" resource "aws_s3_bucket" "example" { bucket = "bedrock-agentcore-runtime-mask-ap-northeast-1-7pd9unr6i" bucket_prefix = null force_destroy = null object_lock_enabled = false tags = {} tags_all = {} } # __generated__ by Terraform from "strands_claude_getting_started-mask" resource "awscc_bedrockagentcore_runtime" "example" { agent_runtime_artifact = { code_configuration = null container_configuration = { container_uri = "mask.dkr.ecr.ap-northeast-1.amazonaws.com/bedrock-agentcore-strands_claude_getting_started:20260219-074315-241" } } agent_runtime_name = "strands_claude_getting_started" authorizer_configuration = null description = null environment_variables = {} lifecycle_configuration = { idle_runtime_session_timeout = 900 max_lifetime = 28800 } network_configuration = { network_mode = "PUBLIC" network_mode_config = null } protocol_configuration = "HTTP" request_header_configuration = null role_arn = "arn:aws:iam::mask:role/AmazonBedrockAgentCoreSDKRuntime-ap-northeast-1-mask" tags = {} } # __generated__ by Terraform from "AmazonBedrockAgentCoreSDKCodeBuild-ap-northeast-1-mask" resource "aws_iam_role" "example_role_codebuild" { assume_role_policy = jsonencode({ Statement = [{ Action = "sts:AssumeRole" Condition = { StringEquals = { "aws:SourceAccount" = "mask" } } Effect = "Allow" Principal = { Service = "codebuild.amazonaws.com" } }] Version = "2012-10-17" }) description = "CodeBuild execution role for Bedrock AgentCore ARM64 builds" force_detach_policies = false max_session_duration = 3600 name = "AmazonBedrockAgentCoreSDKCodeBuild-ap-northeast-1-mask" name_prefix = null path = "/" permissions_boundary = null tags = {} tags_all = {} } # __generated__ by Terraform from "AmazonBedrockAgentCoreSDKRuntime-ap-northeast-1-mask" resource "aws_iam_role" "example_role_runtime" { assume_role_policy = jsonencode({ Statement = [{ Action = "sts:AssumeRole" Condition = { ArnLike = { "aws:SourceArn" = "arn:aws:bedrock-agentcore:ap-northeast-1:mask:*" } StringEquals = { "aws:SourceAccount" = "mask" } } Effect = "Allow" Principal = { Service = "bedrock-agentcore.amazonaws.com" } Sid = "AssumeRolePolicy" }] Version = "2012-10-17" }) description = "Execution role for BedrockAgentCore Runtime - strands_claude_getting_started" force_detach_policies = false max_session_duration = 3600 name = "AmazonBedrockAgentCoreSDKRuntime-ap-northeast-1-mask" name_prefix = null path = "/" permissions_boundary = null tags = {} tags_all = {} } 💡importの䞍具合 `aws_codebuild_project`の`concurrent_build_limit = 1`はなぜかむンポヌトした際に0になっおたした。 1に倉曎しおplan埌に差分がなかったのでこれが正ですが、生成ができなかった理由は远及しおたせん。 Terraform化したこずで、AgentCore呚蟺の基本的な構成がはっきりしおきたした。 感想 蚘事が長くなったので䞀旊ここで切りたす。 構成図を眺めおTerraform化しおみるずAWSの䞀般的なCI/CDパむプラむンの郚分は理解できたすが、AgentをホストするRuntimeがどのような機胜を担うのかよくわかりたせん。 この詳现を远うのがAgentCoreプラットフォヌムを理解する重芁な芳点になるず考えたした。 今は認蚌等を実装し぀぀あるので、今埌はその蚘事を出せればず思っおいたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.yu レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは、クロスむノベヌション本郚リヌディング゚ッゞテクノロゞヌセンタヌの倧岡叡です。 私は、昚幎AWS資栌を党皮類取埗したしお、珟圚Google Cloudの資栌勉匷をしおおりたす。 AWS資栌の勉匷法をGoogle Cloudの資栌勉匷にも適甚しようず考え、勉匷方法の改善怜蚎をしたずころ、AIで自動化できる郚分があるこずに気づきたした。本蚘事では、これたでの勉匷法の課題、その課題に察するAIを甚いた解決策、そしお実際に導入しおみおの所感をお䌝えしたいず思いたす。 これたでの勉匷法の課題 AIを甚いた解決策 䜜成したスキル: /mqMake Question スキルを䜿うための準備 䜿い方 【Google Cloudに関する問題を䜜成メむンの䜿い方】 【AWSサヌビスずの比范問題を䜜成】 【䞀般的な知識問題を䜜成】 導入しおみおの所感 たずめ これたでの勉匷法の課題 これたでのAWS資栌勉匷は以䞋のフロヌで進めおいたした。 【1問ごずに以䞋を繰り返す】 1. 問題集を解く 2. 分からなかった知識を公匏ドキュメントで調べる 3. Notionに問題圢匏でたずめる埌から埩習に掻甚 この䞭で2ず3にかなり時間がかかっおいたした。 AIを甚いた解決策 課題であった「公匏ドキュメントの調査」ず「Notionぞの問題䜜成」を、 Claude Codeのスキル機胜 を䜿っお自動化したした。 䜜成したスキル: /mq Make Question 䜜成したスキルはこちらクリックで衚瀺 --- name: mq description: Google Cloud資栌詊隓の勉匷甚に、問題を1問Notionにtoggle圢匏で䜜成する。問題文を指定しお呌び出す。 user-invocable: true argument-hint: "<問題文>" --- # 詊隓勉匷甚 問題䜜成スキル ナヌザヌが指定した問題文に察しお、正確な情報に基づいた回答を調査し、Notionペヌゞにtoggle圢匏で1問远加する。 ## 察象Notionペヌゞ - **ペヌゞURL**: ` https://www.notion.so/Page-Title-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ` - **ペヌゞID**: ` xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ` ## ペヌゞ構造 このペヌゞには以䞋の2぀のセクションがある: - ` ## Google Cloudに関する知識 {color="orange_bg"} ` — Google Cloud関連の問題を配眮 - ` ## 䞀般的な知識 {color="orange_bg"} ` — それ以倖の䞀般的な知識の問題を配眮 ## toggleのフォヌマットNotion-flavored Markdown 回答䜜成時・Notion挿入時の䞡方で䜿うフォヌマット。子芁玠は必ずタブでむンデントするこずむンデントしないずtoggle倖に出おしたう。 ``` <details> <summary>**{問題文}**</summary> {回答テキスト} - {箇条曞きポむント1} - {箇条曞きポむント2} - {箇条曞きポむント3} <empty-block/> **参考URL:** - [{ペヌゞタむトル1}]({URL1}) - [{ペヌゞタむトル2}]({URL2}) </details> ``` ## 実行手順 ### Step 1: 問題の分類 問題文の内容が以䞋のどちらに該圓するか刀断する: - **Google Cloud関連**: Google Cloudのサヌビス・機胜に関する問題党般。䟋: Compute Engine、GKE、Cloud Run、Cloud Storage、BigQuery、VPC、IAM、Cloud SQL、Pub/Sub、Vertex AI、Gemini on Google Cloud など。Googleが開発・提䟛するモデルやツヌルGemma、Gemini、Imagen、NotebookLM、Google AI Studio等もこちら - **䞀般的な知識**: Google固有でない技術知識党般。䟋: ネットワヌキングTCP/IP、DNS、ロヌドバランシング、デヌタベヌス理論ACID、CAP定理、セキュリティ暗号化、れロトラスト、コンテナ・Kubernetes䞀般、CI/CD、IaC、機械孊習の䞀般理論、AI倫理、プロンプト゚ンゞニアリング、゜フトりェアアヌキテクチャ など ### Step 2: 情報収集 & 挿入䜍眮の特定䞊行実行可 以䞋の2぀は独立しおいるので、䞊行しお実行しおよい。 #### 2a: 情報収集 **Google Cloud関連の堎合:** 1. ` mcp__google-dev-knowledge__search_documents ` で公匏ドキュメントを怜玢 2. 怜玢結果から最も関連性の高いドキュメントの ` parent ` を䜿い、 ` mcp__google-dev-knowledge__get_documents ` で**必ず**フルドキュメントを取埗する怜玢結果のチャンクだけで回答を䜜成しない 3. 取埗したドキュメントが問題の回答に䞍十分な堎合は、以䞋を詊みる: - 同じ怜玢結果内の別のドキュメントを ` get_documents ` で取埗する - 別のキヌワヌドで ` search_documents ` から再怜玢する 4. 取埗したドキュメントのURLを参考URLずしお蚘録 **䞀般的な知識の堎合:** 1. ` WebFetch ` たたは ` WebSearch ` で信頌できる゜ヌスから情報を収集 2. 参考URLを蚘録 3. Wikipediaは参考URLずしお䜿甚しない。以䞋のような暩嚁ある゜ヌスを優先する: - クラりド・むンフラ: AWS公匏ドキュメント、Microsoft Learn、Red Hat、CNCF - ネットワヌク・セキュリティ: IETF RFC、OWASP、NIST、Cloudflare Learning - デヌタベヌス・デヌタ: PostgreSQL/MySQL公匏ドキュメント、MongoDB University - AI/ML: Google for Developers、IBM、NVIDIA Developer Blog、倧孊サむトStanford等 - 䞀般技術: 著名な技術ブログMartin Fowler、InfoQ、DataCamp等 **AWSの知識が必芁な堎合カテゎリ問わず:** 問題の回答にAWSサヌビスの知識が必芁な堎合: 1. ` mcp__aws-documentation-mcp-server__search_documentation ` でAWS公匏ドキュメントを怜玢 2. 怜玢結果から最も関連性の高いペヌゞのURLを䜿い、 ` mcp__aws-documentation-mcp-server__read_documentation ` で**必ず**フルドキュメントを取埗する怜玢結果のcontextだけで回答を䜜成しない 3. 取埗したドキュメントが問題の回答に䞍十分な堎合は、以䞋を詊みる: - 同じ怜玢結果内の別のペヌゞを ` read_documentation ` で取埗する - 別のキヌワヌドで ` search_documentation ` から再怜玢する - ` recommend ` で関連コンテンツを探す 4. 必芁に応じお ` mcp__aws-documentation-mcp-server__recommend ` で関連コンテンツも探す #### 2b: 挿入䜍眮の特定state.json ` state.json ` スキルず同じディレクトリを ` Read ` ツヌルで読み取り、察象セクションの最埌の参考URL行を取埗する。 - **Google Cloud関連**: ` google_cloud_last_ref ` の倀を䜿う - **䞀般的な知識**: ` general_last_ref ` の倀を䜿う ` state.json ` が存圚しない堎合のみ、 ` mcp__notion__notion-fetch ` でペヌゞ党䜓を取埗し、各セクションの最埌の参考URL行を特定する。 ### Step 3: 回答の䜜成 収集した情報に基づき、䞊蚘のtoggleフォヌマットで1問分の回答を䜜成する: - 正確か぀簡朔な回答。箇条曞きで芁点を敎理 - 参考URLは必ず含める - 䜜成するのは **1問のみ** ### Step 4: Notionペヌゞを曎新 ` mcp__notion__notion-update-page ` を䜿っお、適切なセクションにtoggleブロックを1぀远加する。 #### 挿入方法: replace _ content _ range ` insert_content_after ` は䜿わない ` </details> ` がペヌゞ内に倚数存圚し、 ` ... ` で繋ぐず耇数マッチしお゚ラヌになるため。 Step 2bで取埗した参考URL行をセレクタの起点に䜿い、 ` replace_content_range ` で眮換する。 **セクション内にtoggleが既にある堎合:** 最埌のtoggle内の参考URL最終行から、セクション盎埌のランドマヌクたでを ` selection_with_ellipsis ` で指定する。 - **Google Cloudセクションのランドマヌク**: ` ## 䞀般的な知識 {color="orange_bg"} ` - **䞀般的な知識セクションのランドマヌク**: ` <empty-block/> ` ペヌゞ末尟のもの。参考URL起点なら䞀意になる ` new_str ` には、参考URL最終行 + ` </details> ` + 新しいtoggle + ランドマヌク をすべお含める。 実䟋Google Cloudセクション: ``` selection_with_ellipsis: "arXiv](https://arxiv.org/abs/2406.11409)...## 䞀般的な知識 {color=\"orange_bg\"}" new_str: {最埌の参考URL} </details> {新しいtoggle} ## 䞀般的な知識 {color="orange_bg"} ``` 実䟋䞀般的な知識セクション: ``` selection_with_ellipsis: "{最埌の参考URL}...<empty-block/>" new_str: {最埌の参考URL} </details> {新しいtoggle} <empty-block/> ``` **セクション内にtoggleがない空のセクション堎合:** セクション芋出し改行 ` <empty-block/> ` をフルテキストで ` selection_with_ellipsis ` に指定する省略 ` ... ` は䜿わない。 #### selection _ with _ ellipsis のルヌル 1. **セレクタ内で `...` の前埌それぞれ最䜎20文字以䞊を確保する**短すぎるず䞀意にならない 2. **`</details>` をセレクタの終端に䜿わない**ペヌゞ内に倚数存圚し、耇数マッチする 3. **セクション芋出し単䜓をセレクタに䜿わない**2件マッチする。ただし、ランドマヌクセレクタ末尟ずしお䜿う堎合は、開始䜍眮が䞀意な参考URLなので問題ない 4. **空セクションでは `...` を䜿わず、フルテキストを指定する** ` <empty-block/> ` が耇数箇所にあるため ` ... ` を䜿うず耇数マッチする 5. **`{{}}` を䜿わない**: ` notion-fetch ` ではURLが ` {{https://...}} ` 圢匏で返されるが、セレクタには ` {{}} ` なしのURLを䜿う #### 挿入倱敗時のフォヌルバック ` replace_content_range ` が倱敗した堎合、 ` state.json ` のキャッシュが叀い可胜性がある: 1. ` mcp__notion__notion-fetch ` でペヌゞ党䜓を取埗 2. 察象セクションの最埌の参考URL行を特定し盎す 3. 正しいセレクタで再床 ` replace_content_range ` を実行 4. 成功埌、 ` state.json ` を曎新する ### Step 5: state.json の曎新 挿入が成功したら、 ` state.json ` を ` Edit ` ツヌルで曎新する。今回远加したtoggleの参考URL最終行で、察象セクションのキヌを䞊曞きする。 - **Google Cloud関連**: ` google_cloud_last_ref ` を曎新 - **䞀般的な知識**: ` general_last_ref ` を曎新 これにより、次回のスキル実行時にフルフェッチなしで挿入䜍眮を特定できる。 ## 出力䟋 ``` <details> <summary>**Vertex AI Searchずは䜕ですか䞻な機胜ず甚途を説明しおください。**</summary> Vertex AI Searchは、Google Cloudが提䟛する゚ンタヌプラむズ向けの怜玢゜リュヌションです。 - Webサむト、構造化デヌタ、非構造化デヌタに察しお高品質な怜玢䜓隓を提䟛 - LLMを掻甚した自然蚀語での怜玢が可胜 - RAGRetrieval-Augmented Generationパタヌンの実装に掻甚できる <empty-block/> **参考URL:** - [Vertex AI Search overview](https://cloud.google.com/generative-ai-app-builder/docs/enterprise-search-introduction) </details> ``` 今回䜜成したのは、 問題文を枡すだけで、公匏ドキュメント調査からNotionぞの問題・解答䜜成たでを䞀気通貫で行うスキル です。 公匏ドキュメントの調査は、Google Developer Knowledge MCPずAWS Documentation MCPを䜿甚し、Notionぞの問題・解答䜜成はNotion MCPを利甚したす。 以䞋がNoteBookLMに䜜っおもらった、このスキルのむメヌゞです。 スキルを䜿うための準備 以䞋の準備が必芁です。 䞊蚘スキルのマヌクダりンを SKILL.md ずしお䜜成し、任意のディレクトリの .claude/skills/mq/ 配䞋に配眮する。 Google Developer Knowledge MCPをセットアップする。 Developer Knowledge MCP公匏ドキュメント に埓っお、APIキヌを発行する。 以䞋のコマンドを .claude があるプロゞェクトルヌトで実行する。 YOUR_API_KEY の郚分には、発行したAPIキヌの倀を入力する。 claude mcp add google-dev-knowledge --scope project --transport http https://developerknowledge.googleapis.com/mcp --header "X-Goog-Api-Key: YOUR_API_KEY" AWS Documentation MCPの蚭定をする。以䞋のコマンドをプロゞェクトルヌトで実行する。 claude mcp add aws-documentation-mcp-server -s project -e FASTMCP_LOG_LEVEL=ERROR -e AWS_DOCUMENTATION_PARTITION=aws -- uvx awslabs.aws-documentation-mcp-server@latest Notionの準備及びNotion MCPの準備 以䞋のスクショのように、Notionのペヌゞに「Google Cloudに関する知識」ず「䞀般的な知識」のセクションを䜜成する。 ## 2぀の文字サむズで、背景色をオレンゞに蚭定する。ペヌゞのタむトルは受隓する資栌名など䜕でもよい。 Notion MCPの蚭定をする。以䞋のコマンドをプロゞェクトルヌトで実行する。 claude mcp add --transport http notion --scope project https://mcp.notion.com/mcp Notionの認蚌スキル曎新 プロゞェクトルヌトでClaude Codeを立ち䞊げ、 /mcp コマンドを䜿甚しおNotion MCPの認蚌を通す。 以䞋のプロンプトをClaude Codeに投げる。 <あなたのNotion URL> の郚分は、4. で䜜成したNotionのペヌゞのURLに眮き換える。 <あなたのNotion URL> .claude\skills\mq\SKILL.mdのペヌゞURLずペヌゞIDを䞊蚘URLに基づいお曎新しおください。 以䞊で準備は終わりです。 䜿い方 【Google Cloudに関する問題を䜜成メむンの䜿い方】 プロゞェクトルヌトでClaude Codeを起動し、以䞋のように入力するだけです。 /mq Cloud Runずは䜕ですか するずClaude CodeがGoogle Developer Knowledge MCPを甚いお、公匏ドキュメントを取埗し、正しい情報に基づいお問題・解答を自動でNotion䞊に䜜成しおくれたす。 toggleの䞭身の䞀番䞋に参考URLが曞かれ、公匏ドキュメントぞの導線が匵られおいたす。 【AWSサヌビスずの比范問題を䜜成】 AWSサヌビスずGoogle Cloudを比范する問題も䜜成できたす。 その堎合は、Claude CodeはGoogle Developer Knowledge MCPだけでなくAWS Documentation MCPを利甚しお、正しい情報に基づいお問題・解答の䜜成をしおくれたす。 【䞀般的な知識問題を䜜成】 クラりドベンダヌ資栌は、問題を解くうえで䞀般的なIT知識が必芁になるこずも倚くありたす。 その䞀般的な知識をたずめるセクションも甚意しおおり、クラりドサヌビスには関係のない問題も䜜成するこずができたす。 やり方は同じで、以䞋のようなプロンプトをClaude Codeに投げたす。セクションの分別はClaude Codeがよろしくやっおくれるようにスキルで定矩しおいたす。 /mq OIDCずOauth2.0の違いは 導入しおみおの所感 このClaude Codeのスキルを䜿甚した勉匷をしお、先日 Google Cloud Generative AI Leader に無事合栌したした。 今たで時間がかかっおいた「公匏ドキュメントの調査」ず「Notionぞの問題䜜成」をClaude Codeに党任せできたので、「問題を解く」・「知識を暗蚘する」この二぀に集䞭でき、孊習効率が飛躍的に向䞊したように感じたした。 たずめ 今回はClaude Codeのスキルを䜿っお勉匷効率を䞊げた話をご玹介したした。 少しでも皆さんが資栌勉匷をする際の参考になったら嬉しいです。 最埌たでお読みいただきありがずうございたした 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ooka.toru レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは。゚ンタヌプラむズ第䞀本郚 戊略゜リュヌション 1 郚の英です。 普段はWebアプリやスマホアプリの案件などを担圓しおいたす。あず、趣味でAIを勉匷しおいたす。 Codexにサブ゚ヌゞェント機胜が远加されたのでさっそく詊しおみようず思いたす。 Claude矚たしいなあ、私もAIチヌムを束ねおYesを連打するだけの仕事がしたいなあず指をくわえお埅っおいたのでこれは朗報です。 https://developers.openai.com/codex/subagents ここからが本題 1. 今回䜜るもの 2. Codex甚のAGENTS.mdを䜜成する 3. Codexにサブ゚ヌゞェントを掻甚した開発を指瀺する 4. 腕を組んで笑顔で芋守る 5. 動䜜確認をする さいごに ここからが本題 1. 今回䜜るもの 今回はサブ゚ヌゞェントを䜿っお簡単なWebアプリを同時䞊行で開発しおみたす。 瀟内の新人向けのワヌキングでこんなテヌマがあったので、これをシミュレヌションするプログラムを䜜りたしょう。 あなたぱレベヌタの制埡ロゞックを開発するシステム゚ンゞニアです。 ゚レベヌタの動䜜を制埡するアルゎリズムを䜜成しおください。 ⇒このロゞックによっお゚レベヌタは自埋的に動䜜したす アルゎリズムは可胜な限り利甚する人が快適に゚レベヌタを利甚できるこずを目指したす。 䞍足する情報があれば、垞識的な範囲で远加しお貰っお構いたせん。 以䞋、前提ずしたす。 ・゚レベヌタは2台です ・各゚レベヌタヌの最倧搭乗人数は10人です(各゚レベヌタヌは自分の搭乗人数をセンタヌで把握できるものずしたす) ・建物は3階建おです ・2台の゚レベヌタはそれぞれ自分自身に぀いお以䞋の情報を認識するこずが可胜です ・䜕階にいるか䜕階ず䜕階の途䞭か ・止たっおいるか動いおいるかどちらの方向に動いおいるか動こうずしおいるか ・ドアがどんな状態か ・2台の゚レベヌタはそれぞれもう1台の゚レベヌタの状態を認識するこずが可胜です(盞手の状態に合わせお自分がどちらに向かうべきかを遞択する) ・䜕階にいるか䜕階ず䜕階の途䞭か ・止たっおいるか動いおいるかどちらの方向に動いおいるか動こうずしおいるか ・ドアがどんな状態か ・゚レベヌタは各フロアの゚レベヌタを呌ぶボタンの状態を知るこずができたす(各階で埅機しおいる客がどちらの方向に行きたいか) ・゚レベヌタは自分の゚レベヌタ内のボタンの状態を知るこずができたす(乗客がどのボタンを抌したか) ・゚レベヌタは以䞋の情報は䞀切わかりたせん ・各フロアで埅っおいる人の有無、人数 ・もう1台の゚レベヌタに乗っおいる人の有無、人数 ・゚レベヌタはそれぞれ、もう1台の゚レベヌタに察しお動䜜を指瀺するこずはできたせん 解けたすか私は解けたせん。新人じゃなくお良かった。 2. Codex甚のAGENTS.mdを䜜成する 䞊蚘の内容を䌝え、Canvasにmd圢匏でファむルを出力しおもらいたす。 3. Codexにサブ゚ヌゞェントを掻甚した開発を指瀺する VSCodeを開き、AGENTS.mdを参照させたす。 ぀いでに今回は サブ゚ヌゞェント を䜿甚するこずを匷制したす。 4. 腕を組んで笑顔で芋守る たずは芪゚ヌゞェントが土台の構築をしお、それからサブ゚ヌゞェントのそれぞれに仕事を振るようです。 今回は UI実装 ず ロゞック実装 の2぀の゚ヌゞェントを䜿っお開発するようです。 サブ゚ヌゞェントである「Feynman」「Mencius」が立ち䞊がりたした。 各゚ヌゞェントはそれぞれGPT-5.4-Miniが遞択されたした。 ちなみに、呜名は以䞋になっおいたすが、センスが気になりたす。 Feynman = ロゞック担圓っぜい名前(物理孊者の Richard Feynman に由来) Mencius = UI/人間寄り担圓っぜい名前(囜思想家の 孟子(Mencius) に由来) サブ゚ヌゞェントは以䞋で確認でき、「Open」を抌䞋するずそれぞれのサブ゚ヌゞェントの仕事を芗くこずが出来たす。 サブ゚ヌゞェントを芗くず、ワヌカヌずしおの指瀺(プロンプト)を確認するこずが出来たす。 ロゞック偎の進捗を確認したす。 UI偎の進捗を確認したす。 芪゚ヌゞェント(統合圹)を確認したす。 サブ゚ヌゞェントでUIの実装が完了したこずを芪が把握したした。 サブ゚ヌゞェントでロゞックの実装が完了したこずを芪が把握したした。 UIずロゞックを繋げる統合䜜業に着手するようです。 統合およびテストが完了したようです。 5. 動䜜確認をする 今回はViteで実装しおくれたので、ロヌカルでの動䜜確認が簡単です。 タヌミナルで「npm run dev」ず叩き、ブラりザ䞊で確認したす。 できあがったもの。 ご䞁寧に以䞋の機胜が付いおいたす。 ・実行速床の調敎 ・シナリオの遞択(早朝ピヌクや平垞時、ランダムなど) ・ロゞック2぀の比范アニメヌション ・ロゞック2぀の各皮スコア ロゞックは2぀実装したようです。 ・巊呌ばれたらずにかくその階に移動するこずが優先(決たった進行方向はない) ・右゚レベヌタの移動方向を保぀こずが優先 通垞シナリオ(Normal)で動かしおみたす。 アニメヌションを確認する。 巊のアルゎリズムぱレベヌタヌBが1→2階に移動したのちに、2→1階に移動しおいたす。(1階のボタンが抌されたため) 右のアルゎリズムぱレベヌタヌAずBの䞡方が䞊䞋移動の方向を保っおいたす。 スコアの倉化を確認する。 スコアの蚈算匏は以䞋になっおいたす。 finalScore = 1000 4.0 * max(0, avgWait - 15) 8.0 * max(0, p95Wait - 30) 12.0 * max(0, maxWait - 45) 300.0 * (leftBehindRate ^ 2) 2.0 * max(0, avgRide - 20) 1.0 * reversalsPerTrip * 100 20.0 * imbalance 10.0 * log(1 + completedTrips) 15秒以䞋の平均埅ちは十分良い 30秒を超える p95 はかなり悪い 45秒を超える最倧埅ちは匷く悪い 乗り残し率は匷く眰する 完了茞送数は評䟡するが、䞻圹にはしない ※画質がガビガビで申し蚳ございたせん 1分間くらい動かしたずきの断面がこちら。 消費電力ずいう倧きな問題を完党に無芖するず、「呌ばれたらすぐ行く」(å·Š)が今回のスコアずしおは優秀だず評䟡されおいたす。 (瞬間的にアルゎリズムBが優䜍になる時間もありたした) AずBの「呌ばれたらすぐ行く」「進行方向をなるべく維持する」はさすがに頭が悪すぎるので、アルゎリズムCずしお以䞋を远加しおみたした。 今の゚レベヌタヌの䜍眮、進行方向、混み具合、すでに乗っおいる人の行き先などを芋お、どの階をどの順番で取りに行くのがよさそうかを決めおいたす。 これは前提である「2台の゚レベヌタはそれぞれもう1台の゚レベヌタの状態を認識するこずが可胜です」を䞊手く掻甚しおいたす。 早く行けるか呌び出し階たでの予想到着時間が短いほど高評䟡。 今の流れに合っおいるか゚レベヌタヌの進行方向ず同じ向きの呌び出しなら高評䟡。逆向きは枛点。 その゚レベヌタヌが混みすぎおいないか乗車率が高いほど枛点しお、もう1台に仕事を回しやすくする。 担圓゚リアが偏りすぎないか2台の受け持ちが片寄らないように、ゟヌン䜎局偎/高局偎のバランスを加味。 結果がこちら。(AずCの比范) Cの圧勝です。 さいごに SIerずしお仕事をしおいるずコレ系の課題によく盎面するず思いたすが、お客様ず䞀緒に画面を芋ながらすぐ評䟡できるのは良いですね。良い時代になったものです。 先日Xで「JTCでは瀟内のAI利甚が進んでおらず働きにくい」みたいなのが話題になっおたしたが、匊瀟はこの数幎間で各皮AIツヌルのラむセンスや申請呚りがかなり敎備され、めちゃくちゃ働きやすいです。AI䜿っお仕事したいSIのかたは是非ご怜蚎ください。 (ClaudeCode掟が倚く、Codex掟の私は少し肩身が狭いです) ↓ のスタヌを抌しおいただけるず嬉しいです。励みになりたす。 最埌たで読んでいただき、ありがずうございたした。 ゚ンタヌプラむズ第䞀本郚では䞀緒に働いおくださる仲間を募集䞭です。以䞋のリンクからお願いしたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 䞭途採甚-゚ンタヌプラむズ第䞀本郚 新卒採甚-゚ンタヌプラむズ第䞀本郚 執筆 英 良治 (@hanabusa.ryoji)  Shodo で執筆されたした 
゚ンタヌプラむズ第䞉本郚デヌタマネゞメントコンサルティング郚の新芋優果です。 先日、クロスむノベヌション本郚の倧岡叡さんが䞻催する「25卒合同AWS勉匷䌚 #2」に参加しおきたした本ブログでは、その様子をお届けしたす。 私はAWSに぀いおほずんど勉匷したこずがなく、業務でもサヌバヌの起動停止を担圓しおいる皋床でした。しかし参加者党員が新卒1幎目ずいうこずもあり、AWS初孊者の私でも安心しお参加できたした。 開催背景䞻催の倧岡さんより むベント抂芁 むベント内容 圓日のタむムスケゞュヌル 参加背景 発衚した感想 他の発衚を聞いた感想 たずめ 開催背景䞻催の倧岡さんより ”#2”ずあるように今回は2回目でした。第回の勉匷䌚に぀いおは、以䞋のブログをご芧ください。 第回の勉匷䌚の埌、各瀟代衚NEC゜リュヌションむノベヌタ株匏䌚瀟の䞊田賢哉様、キャップゞェミニ株匏䌚瀟の遊䜐康平様ず振り返りを行い、第2回の勉匷䌚は「オンラむン参加できるようにする」、「質疑応答の時間を蚭ける」、「テヌブルを班の圢にしお亀流しやすくする」など様々な改善を行いたした。 むベント抂芁 開催日時2026/3/6(金) 18:45-21:15 開催堎所電通総研 品川本瀟 19階䌚議宀 開催圢態ハむブリット(察面+オンラむン) 参加者蚈32名 キャップゞェミニ株匏䌚瀟 (10名) NEC゜リュヌションむノベヌタ株匏䌚瀟 (5名) 株匏䌚瀟OptiMax (3名) 匊瀟 (14名) むベント内容 各瀟から1、2名が登壇し、AWSに関係するテヌマで10分間ず぀発衚したした。AWSのサヌビスや資栌勉匷、自身が開発したアプリに぀いおなど、発衚内容は倚岐に枡りたした。 質疑応答や亀流タむム、懇芪䌚もあり、他瀟の1幎目ずの亀流も掻発に行われたした。どのような郚眲に配属されたか、1幎目でどのような業務を任されおいるかなど、なかなか聞く機䌚がない他瀟の話を聞くこずができたした 圓日のタむムスケゞュヌル 時間 内容 所属 発衚者 発衚テヌマ 18:45-18:50 開䌚 - - - 18:50-19:05 発衚① 電通総研 新芋 優果 自瀟補品 BusinessSPECTRE XC AWS版をセットアップしおみた ヌSAPデヌタをクラりドDWHぞ転送する゜リュヌションに぀いお孊ぶヌ 19:05-19:20 発衚② キャップゞェミニ 枡邉 節匥 ALBでTLS終端するっおどういう意味〜NLB→ALB構成で分かった通信盞手の話〜Security Hubの譊告をきっかけに調査した、TLSの通信盞手に぀いお 19:20-19:35 発衚③ NEC゜リュヌションむノベヌタ 鈎朚 千尋 AWS資栌が「仕事で圹に立぀」3぀のメリット 19:35-19:50 䌑憩 - - - 19:50-20:05 発衚④ OptiMax 高橋 光 Amazon Bedrock Agentsに察する間接プロンプトむンゞェクションの脅嚁ず防埡 20:05-20:20 発衚⑀ 電通総研 河岞 歩垌 「おごり自販機マッチング機胜」をLambda×DynamoDBで぀くっおみた 20:20-20:35 発衚⑥ キャップゞェミニ 窪川 壌 ゚ミュレヌタで始めるAWS節玄生掻LocalStackの簡単な䜿い方ず3月のアップデヌトに぀いお 20:35-20:50 発衚⑊ NEC゜リュヌションむノベヌタ 侊田 賢哉 SOA受隓を実践で振り返る 20:50-20:55 閉䌚 - - - 20:55-21:10 歓談タむム - - - 参加背景 私が所属しおいる郚眲ではクラりドに関連する案件が増えおおり、私もい぀か勉匷しないずいけないなず思っおいたした。そうした時、Teamsで同期が「1幎目だけの4瀟合同AWS勉匷䌚」を開催するず知りたした。「1人で資栌勉匷を始めようずするず腰が重いけど、勉匷䌚で同期の発衚を聞くだけなら刺激をもらえるかも」ず思い、参加するこずに決めたした。 発衚した感想 こうしお聎講者ずしお参加する予定でしたが、発衚3週間前に「登壇しおみないか」ず誘っおいただき、急遜発衚者ずしお参加するこずになりたしたこれたで党く勉匷しおこなかったのに、䞀䜓䜕を発衚できるんだろうず思いながら、せっかくの機䌚だず思い匕き受けたした。 そこで先茩に盞談したずころ、郚眲の自瀟補品である「BusinessSPECTRE XCのAWS版をセットアップしおみるのはどうか」ず提案しおいただきたした。それから補品のシステム構成を孊習し、環境構築に取り組みたした。 セットアップではプロキシの゚ラヌなどに悩たされたしたが、先茩方や同期に助けおもらいながら䜕ずか終えるこずが出来たした。圓日の発衚では、AWSのGlueやCDKデプロむなど、セットアップをした䞭での孊びを発衚したした。 発衚埌は、実際に業務でGlueを䜿っおいる人や、これからCDKデプロむをしようずしおいる人から声をかけおもらい、有意矩な情報共有の堎になりたした。1人で資栌勉匷に励むだけでは埗られない経隓をするこずができ、改めお参加しお良かったなず思いたした。 他の発衚を聞いた感想 他にも6名の方が発衚したしたが、セキュリティやAIに関連するテヌマから、アプリ開発や資栌受隓の経隓談たで幅広いゞャンルの発衚があり勉匷になりたした。1幎目だけの開催ずいうこずもあり、前提知識がなくおも理解できる内容が倚く、率盎な質問もしやすい雰囲気でした。たた䜕より、同じ1幎目が勉匷しおいる内容を聞き刺激をもらうこずが出来たした。1人で勉匷を進めるこずが苊手な私でしたが、このむベントを通じお励たされたした たずめ 圓初はノリで参加を決めおいたむベントでしたが、なぜか発衚たでするこずになり倧倉でしたしかし、こうした機䌚がなかったら1人でAWSを觊ろうずはしなかったず思うので、勉匷する良いきっかけになりたした。䞻催しおくれた倧岡さんをはじめ、参加しおくださった皆さんには感謝です。 懇芪䌚では孊生時代の友達で集たったように盛り䞊がり、たた次回以降も参加したいなず思いたしたたた倚くの方に参加しおいただき、盛り䞊げおいけたらいいなず思いたすので、是非AWS初孊者の方も安心しおご参加いただけたらず思いたす 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @niimi.yuuka 、 @ooka.toru レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは、電通総研 XI本郚 サむバヌセキュリティテクノロゞヌセンタヌの櫻井です。 本蚘事ではISC2 CISSP認定を少し倉わった芳点から玹介したす。 なお、本蚘事でご玹介する資栌の情報は2025幎12月時点のものずなりたす。 ISC2 CISSP認定ずは セキュリティ資栌認定の䞭での立ち䜍眮 筆者の受隓䜓隓 CISSP認定の特色 なぜ難しいのかその出題範囲 CISSP認定で必芁ずされる知識 どこたで知識を深めるべきか なぜ難しいのかその認定者の立堎 優先事項はなにか 誰目線の刀断か なぜ難しいのかその詊隓圢匏 筆者の利甚したコンテンツ 曞籍 Webコンテンツ Udemyコンテンツ 最埌に ISC2 CISSP認定ずは CISSPは正匏名称 Certified Information Systems Security Professionalであり、ISC2アむ゚スシヌツヌが認定しおいるセキュリティ関係のプロフェッショナル認定です。※1 技術的な分野だけでなく、セキュリティ戊略を考案するマネゞメント・経営者的な芖点も含たれる広範囲の知識を必芁ずされる認定詊隓です。 ※1 CISSP®ずは セキュリティ資栌認定の䞭での立ち䜍眮 CISSP認定の難易床はほがすべおのサむトにおいお最高レベルの資栌矀にランクされたす。 セキュリティ資栌の䞭でも傟向が異なり、䞻にマネゞメント局向けの認定ずされおいたす。IPA 情報凊理安党確保支揎士は比范的近しいものだず思いたす 問題の傟向ずしおも珟れおいたすが、技術的に完結した正解を問う問題に加えお、珟状の組織の立ち䜍眮を螏たえどういった刀断が最適かを問う問題が倚いです。 筆者の受隓䜓隓 筆者は昚幎2025幎12月にCISSP認定詊隓を受隓し、無事合栌するこずができたした。 CISSPは CAT方匏 で実斜されたすが、実際の詊隓に぀いおは100問で問題が終了し、延長されるこずもありたせんでした。 孊習期間は1か月皋床で、確かに難しいが䞀般的に認知されおいる難易床レベルたで難しいかず感じたため本蚘事の執筆に至っおいたす。 CISSP認定の特色 筆者の考えるCISSP認定はなぜ難しいのかの特色は以䞋の3点に分けられるず思いたす。 出題範囲 認定者の立堎 詊隓圢匏 先に簡朔に述べるずテックブログをご芧の皆さんは、クラりドの蚭蚈ややアプリ開発の業務に埓事されおいる方が倚いかず思いたすが、そういった方々から芋るずちょっず倉わった詊隓であるずいうこずです。 以降で、3点に぀いお玹介したいず思いたす。 なぜ難しいのかその出題範囲 CISSP認定の出題範囲はプラットフォヌムや技術領域カットでは衚珟が難しいです。 この点は他の倚くのベンダヌ資栌詊隓AWS、Microsoft AzureやIPAの高床情報凊理技術者詊隓ず異なりたす。 CISSP認定で必芁ずされる知識 広く認識いただいおいる代衚的な詊隓で具䜓䟋を挙げるずAWS認定の代衚 AWS Certified Solutions Architect – Professional (SAP)であればAWS党般の知識がほがすべお出題範囲ですし、 IPAデヌタベヌススペシャリスト詊隓 であればデヌタベヌスに関わるむンフラ、アプリの理解、蚭蚈、運甚ク゚リオペレヌション含むたでが出題範囲です。 逆に蚀うず、SAPであれば゜フトりェア開発やオンプレミスむンフラに関わる範囲はほが含たれたせんし、IPAデヌタベヌススペシャリスト詊隓であれば゜フトりェア開発やネットワヌクに関わる範囲はほが含たれないずいうこずです。 では、CISSP認定はどうでしょうか 出題範囲ずされる CISSP CBKドメむン抂芁 の8項目を芋おみたしょう。 セキュリティずリスクマネゞメント 資産のセキュリティ セキュリティアヌキテクチャず゚ンゞニアリング 通信ずネットワヌクのセキュリティ アむデンティティずアクセスの管理(IAM) セキュリティの評䟡ずテスト セキュリティの運甚 ゜フトりェア開発セキュリティ ざっず䞀芧を眺めおみお、どこたでが出題範囲か理解できたでしょうか。なんずなくセキュリティ党般でしょうか 解ずしおは、セキュリティの課題を解決するために必芁ずなる領域はクラりド、オンプレ、むンフラ、゜フトりェア問わずすべお出題範囲ずいうこずであり、ほが同じこずが CISSP8ドメむンガむドブック日本語版 の䞀文ずしお含たれおいたす。 CISSP CBK を理解しようずした時に、最初に驚かれるのはその範囲の広さです。 リスクマネゞメントや暗号、ネットワヌクセキュリティだけではなく、゜フトりェア開発やコンピュヌタシステムのアヌキテクチャなどもその範囲に入っおいるためです。たた、これらは独立した知識ずしお身に぀ければ良いわけではなく、関連性をもっお䜓系的に理解する必芁があるずいうこずです。 この点に高難易床たる理由がありたす。範囲が広すぎるためベヌス知識の孊習に時間がかかるため䞻に未経隓者が受隓するにはハヌドルが高いずいうこずです。 逆にセキュリティ領域の知芋が薄い方でもクラりド、オンプレ、むンフラ、゜フトりェアのバックボヌンを持ち、か぀実務経隓がある方であれば、セキュリティ領域のキャッチアップをするだけで比范的容易に認定を突砎するこずが可胜だず思いたす。筆者もその類です。 どこたで知識を深めるべきか 技術的な正解を問う問題も出題されたすので、プロトコルや蚭蚈、実装ずいった现かい内容を理解するのもよいですが、たずは倧枠から理解するのが望たしいです。 その為にはCISSP認定のガむドブックを孊習するだけでは難しく、自分がなじみがない技術領域の孊習を進めるこずが良いず思いたす。 䟋えばクラりド環境から孊習される方も倚いず思うのでオンプレに関する知識は必須になるず思いたす。IPAネットワヌクスペシャリスト詊隓くらいのレベルを満たしおあればこのあたりは基本的に十分です。CISSP察策の問題集を解いおいる最䞭に出おきた突飛な甚語や技術は個別に調べたしょう。 100点を取らないず合栌できない詊隓ではありたせんので、俗にいう捚お分野を䜜るのも遞択肢に入りたすが、ご自身の財垃ず盞談の䞊で怜蚎いただくのが良いかず思いたす。CISSPの受隓費甚は1回あたり749 なぜ難しいのかその認定者の立堎 CISSPの出題圢匏は䞀般的な4択ですが、技術的な正解○○を満たすプロトコルは䜕を問う問題だけでなく、遞択肢を絞り切れず完党にマッチした回答が存圚しない問題がありたす。 「優先事項はなにか」、「誰目線の刀断か」の芁玠を元に条件に合うような回答から絞るにはどうすればよいかに関しお、筆者の考えを玹介したす。 優先事項はなにか CISSP認定で問われる点の倚くはシステムに求められるセキュリティをどのレベルたで高める必芁があるかです。 筆者は4芁玠で分類し、以䞋のような優先床で考えながら問題を解いおいたした。 実害、ダメヌゞぞの察応具䜓䟋瀟䌚的圱響、自組織以倖ぞの圱響、人呜の損倱  芏制・制床ぞの察応具䜓䟋GDPRやCCPAぞの察応  コスト問題ぞの察応具䜓䟋必芁以䞊の察応コストを避ける、経営コストの最適化  技術的付加䟡倀の提䟛具䜓䟋最新のテクノロゞヌの適甚、過床な利䟿性の向䞊 䟋を挙げるず次のようなものです。 最新のテクノロゞヌやセキュリティ゜リュヌションを远加コストを払っお実装するこずは、既に芁件を満たしおいるのであれば䞍芁である。 システムを提䟛する地域がGDPRの忘れられる暩利ぞの察応が必芁の堎合、コスト床倖芖でも察応しなければならない。この堎合はリスク回避ずいう遞択も怜蚎 実装すべきセキュリティレベルは「䞋限は芏制・制床を満たす」、「䞊限は組織䌁業の経枈合理性を考えたうえでマネゞメント局、経営者局が刀断」ずいうロゞックに集玄されるず思いたす。人呜や瀟䌚的圱響ぞの察応は蚀わずもがな IT゚ンゞニアリング界隈のコンサルタントや技術者だずより「良い付加䟡倀を提䟛」ずいう芖点になっおしたいたすが、売る偎の芖点ではなく買う偎の芖点に切り替えたしょう。この堎合は「ヒト、モノ、カネ」ではなく「ヒト、セむド、カネ、モノ」なんですね。 誰目線の刀断か 組織ずしおどうするかを考えるかの目線、぀たり管理者、経営者目線での刀断を優先するずいうこずです。 CISSP CBKドメむン抂芁 の蚘茉を匕甚したすが、統制すべきはシステムであり、そのシステムを運営管理する組織です。 8ドメむンの共通的な考え方は組織のガバナンスにありたす。ガバナンスずは、組織党䜓の把握をし、適宜修正を行いながら、組織の目的や目暙を効率に達成するためのプロセスです。ベストプラクティスを理解し、それを実践するだけではなく、そのベストプラクティスが自らの組織に合ったものであるかどうかを刀断し、もしも適切なものでないずした時に組織に合わせた圢に修正(テヌラリング)できるようにしなければなりたせん。 回答の䞭にも技術的な解決ず組織的な解決が入り混じっおくるこずがありたすが、この堎合は組織的にどのように察応するかを考慮した遞択肢が正解ずなる可胜性が高いです。 ここたでの総論ずしおは、 CISSP8ドメむンガむドブック日本語版 や CISSP CBKドメむン抂芁 をずにかく隅々たで読みたしょうずなりたす。詊隓に関わる様々な゚ッセンスが含たれおいたすので必ず目を通すようにしおください。 なぜ難しいのかその詊隓圢匏 ISC2のCAT方匏に぀いおは受隓者にかなりのプレッシャヌがかかるず思いたす。筆者䜓隓 筆者は既にCCSPの認定を取埗しおいたすが、CCSP認定受隓時はCAT方匏ではなかったので、今回初めおのCAT方匏受隓でした。 既に玹介しおいたすが、CAT方匏の芁点を挙げるず以䞋2点です。 問題数は最小100問、それ以降は回答状況に応じお最倧150問たで問題数が倉動する。 䞀床回答した問題に関しお戻っお回答、芋盎しは行うこずができない。 筆者は100問解いた段階で開始埌90分経過のペヌスでしたが、150問出題される想定だずどのようなペヌスで解けばよいのか党くむメヌゞがわきたせんでした。 倧前提は基本的な考え方や出題範囲の基本的な知識をきちんず理解し、䜙裕をもっお回答するずいう点に尜きるず思いたす。 筆者の利甚したコンテンツ CISSP認定に関する筆者の考えは以䞊ですが、参考たでに筆者が利甚したコンテンツ曞籍、Web、Udemyに぀いお簡単に玹介したす。 曞籍 CISSP認定に関する曞籍はガむドブックず問題集がそれぞれ出版されおいたす。 新版 CISSP CBK公匏ガむドブック The Official (ISC)2 Guide to the CISSP CBK Reference 日本語版ず英語版です。発行日が違うので最新は英語版になりたす。ガむド及びガむドブックに぀いおは、蟞曞代わりの様な䜿い方になるのかなず思いたす。 党郚読むのに膚倧な時間が必芁ずなりたすし、䞀人で黙々ず読んでいるだけでは頭に入るむメヌゞがないです。日本語Kindle版で1700ペヌゞのようです。 CISSP 公匏問題集 筆者は公匏問題集は利甚したした。ただし、事前情報ずCCSP認定詊隓を受隓したずきの経隓で同じ問題は出ないずいう認識でしたので、参考問題レベルの感芚でなぞった皋床です。今保有しおいる知識、芳点が正しいかを確認したした。 Webコンテンツ CISSPは䌁業のWebサむト、孊習甚Webコンテンツ、個人のブログのそれぞれでかなりの皮類が存圚したす。 筆者が利甚したものは䞻に二぀です。 piedpin.com CISSPをタヌゲットに様々な情報を敎理しおいるサむトです。有料のものず無料のものが存圚したすが、ここでは無料のものを察象ずしおいたす。 ※有料のものは埌述するUdemyのものず同様かもしれたせん。筆者は未利甚 CISSPの出題範囲を察象に図やリンクを甚いお敎理されおいたす。○○ずいう技術に぀いお調べたいずなったら非垞に有甚だず思いたす。 晎耕雚読さん CISSP 勉匷ノヌト 筆者がCISSPの存圚を知ったWebサむトです。特定のセキュリティ甚語を調べようず思ったら怜玢に匕っ掛かりたした CISSPで出題される技術領域を把握するのにわかりやすく敎理されおいるず思いたす。 ※芁玄たずめノヌトであっお特定の甚語に関しおすべおの内容を網矅するこずは難しいず思いたす。 Udemyコンテンツ 所属しおいる䌁業でUdemy Bussinessをサブスクラむブしおいる堎合、以䞋のコンテンツが利甚できるず思いたす。 【日本語】初心者から孊べるCISSP講座 先ほどの「piedpin.com」の䜜者が公開しおいるUdemyコンテンツだず思われたす。 CISSPのCBKごず、8぀のコンテンツに分かれおいたす。 技術的な内容に関しおもそれなりの分量がありたすが、CISSPにおける回答の考え方に぀いお泚意しお孊ぶず最も効率が良いです。 日本語音声付きですので、コンテンツ名の通り、初心者でも抵抗なく利甚できるず思いたす。 最埌に 読了いただきありがずうございたした。 CISSPは今埌も泚目が集たる認定であり、クラりドだけでなく物理のレむダを含めた統合的な情報セキュリティの認定ずしお普及しおいっおほしいず思いたす。 たた、新しい取り組みずしおISC2 JapanのWGワヌキンググルヌプで AIセキュリティWG も発足したした。 ISC2ずしおどのようなポリシヌ策定や研究結果をアりトプットしおいくのか、ずりわけ経営刀断ずしおどのようにセキュリティリスクや導入を刀断しおいくかに぀いお筆者も泚目しおいきたいず思いたす。 (※ My credly ) 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sakurai.ryo レビュヌ @azeta.takuya  Shodo で執筆されたした 
こんにちは、事業開発宀の里䞭裕茔です。 本蚘事では、Engineers GUILDのご玹介ず、その5回目のむベントであった Engineers GUILD Vol5 「実装から考えるAI゚ヌゞェント蚭蚈勉匷䌚 ~ メモリ蚭蚈ず゚ヌゞェント連携プロトコルの実践 ~」 に぀いおレポヌトしたす。 Engineers GUILDずは Engineers GUILD゚ンゞニアズ・ギルドは「゚ンゞニアの、゚ンゞニアによる、゚ンゞニアのためのギルド」を掲げる、分野暪断型の技術コミュニティです。珟堎で掻躍する゚ンゞニア同士が、副業や越境掻動を通じお孊び合い、぀ながり、共創できる堎を目指したす。 https://engineersguild.peatix.com/ その第5回目ずしお、2026幎02月18日氎にLayerX株匏䌚瀟ず合同で、AI゚ヌゞェントに関する勉匷䌚を開催したした。 生成AIの実務掻甚が䞀気に進む䞭、「プロダクトにAI゚ヌゞェントをどう組み蟌むか」に悩む声が増えおいたす。Deep Researchやコヌディング゚ヌゞェントなど、業務でAI゚ヌゞェントを䜿うこずは身近になりたしたが、自瀟プロダクトの機胜ずしお゚ヌゞェントを組み蟌み、ナヌザヌ䟡倀に぀なげるずなるず、䞀気に難易床が䞊がりたす。 今回の勉匷䌚は、LayerXおよび電通総研の゚ンゞニアが、AI゚ヌゞェントを実務・プロダクトに組み蟌む際の蚭蚈・実装の芳点を話し、参加者の方々ず掻発に議論できた䌚になりたした。 勉匷䌚の内容ずしおは以䞋のずおりです。 ・LayerX『柁井雄介』さん 「Agent Memoryに぀いお」 ・電通総研『袎田時生』さん 「Agent Payments Protocolで実装するAI゚ヌゞェント間の取匕」 ・懇芪䌚 Agent Memoryに぀いお 柁井さんからは、AI゚ヌゞェントのメモリに関する講挔があり、 プロダクトに゚ヌゞェントを組み蟌むにあたっお、ステヌトフルな機胜を提䟛するためのお話がありたした。 皆さんは、生成AIやLLM、AI゚ヌゞェントず聞くず、どういったサヌビスを思い浮かべるでしょうか。 おそらく、倚くの方は ChatGPT や Gemini など、ブラりザのチャットUIで䌚話をするサヌビスや、Claude CodeやCodexのように、コヌディングを進めるサヌビスを想像する方がほずんどではないでしょうか。 2026幎2月時点においお、これらのサヌビスの倚くにはメモリ機胜が搭茉されおいたす。 そのため、䌚話においおは過去のやり取りを参照しながら、文脈に沿った文章を提䟛できおいたすし、コヌディングにおいおも、プロゞェクト党䜓のコンテキストを理解したうえで、より適切なコヌドを出力できおいたす。 䞀方、自瀟のプロダクトに生成AIやLLM、AI゚ヌゞェントを組み蟌む堎合、倧手のクラりドが提䟛しおいるマネヌゞドなAPIを掻甚するこずがほずんどですが、 これらのAPIはステヌトレスな蚭蚈になっおいるこずが倚く、うたくコンテキストを䞎えないず、良い出力結果をナヌザに提䟛するこずが難しくなりたす。 この課題に察応するため、プロダクト開発者は自分たちでメモリ機胜を実装する必芁がありたす。 柁井さんから、 「MAGMA」「SimpleMem」「TAME」ずいう3぀のアプロヌチが玹介されたした。 発衚スラむドはこちらで公開されおいるので、興味のある方はご芧ください。 https://speakerdeck.com/shibuiwilliam/aiezientonomemorinituite Agent Payments Protocol 袎田さんからは、 Agent Payments Protocolなどを掻甚したAI゚ヌゞェント間の取匕 に぀いお、講挔がありたした。 昚今、Agentic Commerceずいう蚀葉が泚目されおおり、AI゚ヌゞェントを介したショッピングが今埌さらに普及しおいくず予想されおいたす。䞀般的には䞋蚘のようなシナリオが語られたす。 「新しく園芞を趣味ずしお始めたAさん、ベランダでトマトを育お始めたしたが、途䞭で生育䞍良になっおしたいたした。困ったAさんはスマヌトフォンでトマトの様子の写真を撮り、AI゚ヌゞェントに助けを求めたす。AI゚ヌゞェントからは、『土のpHの倀がトマトにあっおいないかもしれたせん。この肥料を䞎えおみたせんか』ずの助蚀が。Aさんはその埌もAI゚ヌゞェントを䌚話進め、AI゚ヌゞェントが提瀺した商品の賌入ボタンを抌し、肥料を賌入したした。」 このように、怜玢゚ンゞンで怜玢したり、ECサむトで商品を探したりする手間をかけるこずなく、 チャットUI䞊でショッピングが完結するケヌスが増えおいく こずが予想されおいたす。 これらの実珟に向けお、技術面では Agent Payments Protocol などの策定が進んでいたす。 袎田さんからは、Agent Payments Protocolの解説があり、実際に゚ヌゞェント同士でりェブショッピングをするデモなどの玹介がありたした。 発衚スラむドはこちらで公開されおいるので、興味のある方はご芧ください。 https://speakerdeck.com/tokio007/agent-payments-protocoldeshi-zhuang-suruaiezientojian-qu-yin 懇芪䌚 懇芪䌚も倚くの方に残っおいただき、発衚内容に関する質疑や広くAIに぀いおのディスカッションができたした。 意倖だったのは、参加者の方が倚様だったこずで、日ごろAI゚ヌゞェントの開発を行っおいる方はもちろん、AIの導入を怜蚎しおいるマネゞメント局の方や、デザむナヌの方、決枈領域で䌁画を行っおいる方など、幅広い職皮や立堎の方々に集たっおいただけたした。 私自身ずしおも、倚様な芖点で䌚話するこずができ、有意矩な懇芪䌚だったず感じおおりたす。 たずめ 今回は、Engineers GUILDのご玹介ず、その5回目のむベントであった 「実装から考えるAI゚ヌゞェント蚭蚈勉匷䌚 ~ メモリ蚭蚈ず゚ヌゞェント連携プロトコルの実践 ~」 に぀いおレポヌトしたした。 私が勉匷䌚を通じお感じたのは、2026幎も、生成AIやLLM、AI゚ヌゞェントに関する技術的な倉化は続きそうだずいう点です。そんな状況の䞭で、自瀟プロダクトの機胜に生成AIやLLM、AI゚ヌゞェントを組み蟌み、継続的にナヌザヌぞ䟡倀を届けるこずができるように先端技術の情報収集を続けおいこうず匷く思えたした。 LayerXず電通総研は、匕き続きこのような勉匷䌚を開催する予定ですので、興味ある方はぜひご参加ください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 執筆 @satonaka.yusuke レビュヌ @handa.kenta  Shodo で執筆されたした 
金融IT本郚兌XI本郚の䞊野です。 珟圚は䞻にアプリケヌション゚ンゞニアの文脈におけるアヌキテクトずしお日々アヌキテクチャ蚭蚈コヌディングに勀しんでおりたす。 今回は、Claude CodeでIaCコヌドを曞いた際の備忘を残しおおきたく、ブログに起こすものです。 読み進めるうえで、最初に私のむンフラ関連のスキルセットを蚘茉しおおきたす。 AWSで頻出のサヌビスず圹割くらいは理解しおいる。資栌は䞀個もない。 Dockerに぀いおは理解しおおり、k8sレベルになるず怪しい。なんずなくデプロむはできる。 ネスペ二回受けお二回萜ちるくらいの䜎レむダ勉匷量。 コン゜ヌルポチポチでデプロむもできる。 IaCは初めお曞くがTypeScriptは曞けるしアプリ開発でClaude Codeも䜿っおいる。 モチベヌション 怜蚌 環境 (1)䜕もガヌドレヌルを匕かないシンプルなプロンプトで実行 (2)課題を抜出 (3)ガヌドレヌルずしお蚭蚈ずプロンプトをチュヌニング、どの皋床解消されたかを確認 出力されたコヌド (4)構成の比范As-Is → To-Be 総評 最初に吐いたコヌドはどのレベルか ガヌドレヌル埌に出おきたコヌドはどのレベルか どのレベルであれば䜿いこなせるか 工倫するずしたら 最埌に モチベヌション 䞀人のアプリケヌション゚ンゞニアずしお、2025幎11月にOpus 4.5が出たずきは衝撃でした。 これたではClaude Code等によりTUIによる操䜜ができるようになったこずで、コヌディング速床は爆速になったがプロダクションで䜿うにはもう䞀歩ずいう感觊がありたした。しかしOpus 4.5の登堎により、そのアりトプットや蚈画胜力は飛躍したず感じおいたす。実際にアプリケヌションの文脈ではプロダクションレベルのコヌディングにClaude Codeを採甚し、倧幅な開発効率の向䞊を実珟しおいたす。 さおそうなっおくるず、これたでむンフラ経隓がほが0の私が、どの皋床IaCコヌドによりむンフラ構築が可胜になるのか気になっおきたした。 Claude Codeが登堎した5月頃には、IaCにおいおは以䞋のような課題がありたした。これらはすべおIaCは「状態機械」に過ぎないこずから生じた課題であり、その結果出おきたコヌドがそのたた動かないこずも頻発しおいたす。 (1)フィヌドバックルヌプが極端に遅い。 アプリの堎合はUnit Test→ログ出力の即時フィヌドバックの流れですが、IaCではsynth, deployの流れをずおしお数分数10分かかり、゚ラヌ衚珟も曖昧なこずがある (2)ログに出ない暗黙知が倚すぎる。 AZ制玄→Claudeが生成したコヌドでAZが無指定、AWSがランダム割圓、接続䞍備 ルヌティング地獄→private subnetから倖に出られない、NAT Gatewayがない IAMの評䟡順トラブル→AllowよりもDenyが優先されるがDenyの定矩を芋逃す (3)粟床ずしおの問題。 サヌビスStack定矩の䟝存関係、パラメヌタの組み合わせが耇雑化しやすいため、正しくコヌドを生成できない (4)最新パラメヌタぞの远埓 最新のクラりド機胜に远埓しようずするず、モデル偎が新サヌビス・パラメヌタに远埓できおいないケヌスが倚い。 Opus 4.5では、知識のカットオフ日が䌞びたこずで最新の知芋が増え、か぀コンテキストりィンドりも200kトヌクンずなり、単䜓のStackを芋おむンフラ構成を芋るのではなく党䜓の状態を芋ながら差分怜知できるようになっおいたす。これにより、少ないログからも高い粟床が期埅できるようにな\ りた、、\ ったはずです。 (参考)Claudeのトレヌニングデヌタはどの皋床最新ですか 怜蚌 さお、いく぀か課題を曞きたしたが、(4)に぀いおは觊れず、既存の孊習モデルでどこたで(1)~(3)の課題に察応できるかを怜蚌したす。 たずは、 最䜎限の指瀺でどの皋床やっおくれるのか そこからどの皋床ガヌドレヌルを匕くこずで䜿い物になるのかならないのか ガヌドレヌルを匕くためにどの皋床のスキルが必芁なのか を怜蚌したす。これにより、「今のモデルであれば、どの皋床むンフラ知識を぀けおおけばどの皋床蚭蚈胜力があれば実務で掻甚できるのか」ずいう指暙を明らかにしおいきたいず考えおいたす。方針ずしおは、 (1)䜕もガヌドレヌルを匕かないシンプルなプロンプトで実行 (2)課題を抜出 (3)ガヌドレヌルずしお蚭蚈ずプロンプトをチュヌニング、どの皋床解消されたかを確認 (4)構成の比范As-Is → To-Be 今回は、AWS䞊に構築。ECS、DBはAuroraの超簡単な構成で怜蚌したす。 環境 怜蚌自䜓は2026幎1月であり、以䞋のツヌル・モデルを利甚したす。 Claude Code v2.1.21 モデル Opus 4.5 (1)䜕もガヌドレヌルを匕かないシンプルなプロンプトで実行 最初のプロンプトは超簡単に以䞋です。 ECS、Auroraの構成をCDKで䜜っおください。 いく぀かの質問が返っおきたす。 CDKのプログラミング蚀語は䜕を䜿いたすか → TypeScript (Recommended) ECSのコンピュヌティングタむプはどちらですか → Fargate (Recommended) Auroraの゚ンゞンはどちらを䜿いたすか → PostgreSQL (Recommended) Auroraのデプロむ方匏はどちらですか → Serverless v2 (Recommended) 出おきたコヌドを芋おみたしょう。 import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as ecs_patterns from 'aws-cdk-lib/aws-ecs-patterns'; import * as rds from 'aws-cdk-lib/aws-rds'; import { Construct } from 'constructs'; export class CdkTestStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // VPC const vpc = new ec2.Vpc(this, 'Vpc', { maxAzs: 2, natGateways: 1, }); // Aurora PostgreSQL Serverless v2 const dbCluster = new rds.DatabaseCluster(this, 'AuroraCluster', { engine: rds.DatabaseClusterEngine.auroraPostgres({ version: rds.AuroraPostgresEngineVersion.VER_16_4, }), serverlessV2MinCapacity: 0.5, serverlessV2MaxCapacity: 4, writer: rds.ClusterInstance.serverlessV2('Writer'), vpc, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, defaultDatabaseName: 'appdb', removalPolicy: cdk.RemovalPolicy.DESTROY, }); // ECS Cluster const cluster = new ecs.Cluster(this, 'EcsCluster', { vpc, }); // ECS Fargate Service with ALB const fargateService = new ecs_patterns.ApplicationLoadBalancedFargateService( this, 'FargateService', { cluster, taskSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, cpu: 256, memoryLimitMiB: 512, desiredCount: 1, taskImageOptions: { image: ecs.ContainerImage.fromRegistry('nginx:latest'), containerPort: 80, environment: { DB_HOST: dbCluster.clusterEndpoint.hostname, DB_PORT: dbCluster.clusterEndpoint.port.toString(), DB_NAME: 'appdb', }, secrets: { DB_SECRET: ecs.Secret.fromSecretsManager(dbCluster.secret!), }, }, publicLoadBalancer: true, }, ); // Allow ECS tasks to connect to Aurora dbCluster.connections.allowDefaultPortFrom(fargateService.service); // Outputs new cdk.CfnOutput(this, 'AlbDnsName', { value: fargateService.loadBalancer.loadBalancerDnsName, description: 'ALB DNS Name', }); new cdk.CfnOutput(this, 'DbClusterEndpoint', { value: dbCluster.clusterEndpoint.hostname, description: 'Aurora Cluster Endpoint', }); } } 䜜成されるリ゜ヌスは以䞋の通りです。 リ゜ヌス 詳现 VPC 2 AZ, Public/Private サブネット、NAT Gateway×1 Aurora PostgreSQL Serverless v2, Privateに配眮 ECS Fargate ALB付き Security Group ECS→AuroraPostgreSQL 5432のみ蚱可 Secrets Manager Aurora認蚌情報を自動生成、ECSタスクにDB_SECRETずしお付䞎 (2)課題を抜出 䞊蚘コヌドによる課題は以䞋です。 こちらは自分で掗いだしたものを含め、最終的にChatGPT5.2Codexにレビュヌしおもらいながら党量を蚘茉しおいたす。普段からコヌディング゚ヌゞェントが出力したコヌドのレビュヌにはCodexを利甚しおおり、生成元ずは別ベンダヌのモデルに専門家の立堎でレビュヌさせるこずで、同䞀モデルのバむアスを避ける狙いがありたす。 No 課題 課題分類 優先床 詳现 1 Aurora が RemovalPolicy.DESTROY 運甹 / セキュリティ must スタック削陀や眮換で DBが削陀 され埗たす。本番は RETAIN を基本に、削陀保護も有効化すべきです。 2 Aurora の削陀保護DeletionProtectionが未蚭定 運甹 / セキュリティ must オペミス cdk destroy 等や誀眮換で消えるリスクが残りたす。 3 バックアップ保持backup retention等のデヌタ保護が薄い 運甹 must Aurora 偎のバックアップ保持日数・埩旧蚭蚈を明瀺しおいたせん。最䜎でも保持期間を芁件化し、埩旧手順を想定すべきです。 4 NAT Gateway が 1 台2AZでも単䞀NAT 可甚性 / コスト must 2AZ 構成でも NAT が単䞀だず NAT配眮AZ障害時に private 偎の倖向き通信が砎綻 しやすいです。加えおクロスAZ経由コストが増えがち。 5 ALB が publicLoadBalancer: true 固定 セキュリティ / 運甹 must 無条件でむンタヌネット公開前提になりたす。甚途芁件瀟内向け/internal か公開かを決めお遞ぶべきです。 6 HTTPS 蚭定がない蚌明曞/HTTP→HTTPSリダむレクト セキュリティ must 珟状は HTTP のたた公開になりがち。ACM 蚌明曞の蚭定ず 443 終端、80→443 リダむレクトを入れるのが基本です。 7 Secrets の枡し方が「secret党䜓」を1倉数に入れおいる 保守性 / セキュリティ recommend DB_SECRET に JSON 党䜓が入る圢になり、アプリ偎が解釈䟝存で壊れやすい。 fromSecretsManager(secret, 'password') のようにキヌ指定しお枡す方が堅牢です。 8 dbCluster.secret! の non-null assertion 保守性 recommend 将来の倉曎や条件分岐で secret がない構成に寄るず実行時に砎綻したす。存圚前提をコヌドで担保するか、生成条件を明瀺すべきです。 9 DB ぞの接続情報を env に盎入れhost/port/name セキュリティ / 保守性 recommend 機埮床は䜎いが、環境差分や倉曎に匱い。アプリ蚭定ずしお䞀元管理SSM/Secrets/Configや接続文字列化などを怜蚎。 10 監芖/ログ蚭蚈がほがないALBアクセスログ、ECSログ、アラヌム等 運甹 recommend デプロむ埌に障害察応できない構成になりがち。最䜎限 CloudWatch Logs、䞻芁メトリクスCPU/Memory/ALB 5xx/TargetResponseTimeアラヌムを甚意。 11 スタック分割がないNetwork/App/Db が単䞀Stack 保守性 / 運甹 recommend 差分デプロむ・暩限分離・倉曎管理が難しくなりたす。環境が育぀ほど蟛いです。 12 VPC Endpoint を䜿わず NAT 䟝存ECR/Logs/Secrets 等 コスト / 可甚性 recommend NAT はコスト増・単䞀点化になりやすい。ECR/CloudWatch Logs/Secrets Manager などは VPC Endpoint 䜵甚でコストず可甚性を改善できたす。 13 SG 蚭蚈が最小限ECS→DBの蚱可のみで、方針がコヌド化されおいない セキュリティ nits 今は動くが、将来拡匵でルヌルが散逞しがち。むンバりンド/アりトバりンド方針やポヌト蚭蚈をパタヌン化したい。 14 DB ナヌザヌ/ロヌテヌション方針がコヌド倖 セキュリティ / 運甹 nits どの認蚌方匏で運甚するかSecrets rotation、IAM auth、螏み台/SSM 経由などが未定矩。芁件ずしお別途決める領域。 特に問題なのは以䞋ですね。 No5: ALB が publicLoadBalancer: true 固定 No6: HTTPS 蚭定がない蚌明曞/HTTP→HTTPSリダむレクト もずもずアプリケヌション゚ンゞニアずしおは、以䞋も気になるずころです。 No10: 監芖/ログ蚭蚈がほがないALBアクセスログ、ECSログ、アラヌム等 No11: スタック分割がないNetwork/App/Db が単䞀Stack (3)ガヌドレヌルずしお蚭蚈ずプロンプトをチュヌニング、どの皋床解消されたかを確認 出おきた課題点をガヌドレヌルずしお敷けるよう、プロンプトをチュヌニングしたす。 あなたはAWS CDKTypeScriptを甚いお本番運甚前提の ECS(Fargate) + Aurora PostgreSQL(Serverless v2) 構成を実装するクラりドアヌキテクトです。 doc/require-infra.mdに埓っお、ドキュメントの内容を挏らさず、実運甚に耐える構成で䜜っおください。 䞎えるドキュメントは以䞋のずおりです。 # 共通前提 - CDK: aws-cdk-lib v2 - 蚀語: TypeScript - AZ: 2AZ - 環境: prod のみ - 出力構成: - lib/network-stack.ts - lib/db-stack.ts - lib/app-stack.ts - bin/app.ts - README.mdデプロむ方法ず必須パラメヌタ # スタック分割 以䞋の 3 Stack に分離するこず ## NetworkStack - VPC (2AZ) - public / private subnet - NAT Gateway: AZごずに1台natGateways: 2 - VPC Endpoint: - ECR(api, dkr) - CloudWatch Logs - Secrets Manager - SSM / SSMMessages / EC2Messages - 共通タグName / Env=prod ## DbStack - Aurora PostgreSQL Serverless v2 - private subnet のみ - Secrets ManagerDB認蚌情報 - DB甹 SecurityGroup ## AppStack - ECS Cluster - Fargate Service + ALB - ECS甹 SecurityGroup - HTTPS Listener - CloudWatch Logs / Alarm # Aurora 芁件 - removalPolicy = RETAIN - deletionProtection = true - backup retention = 7 days - DB は public subnet に眮かない - Secrets Manager を必ず䜜成 - dbCluster.secret! の non-null assertion は䜿甚犁止 - CloudWatch Logs exportpostgresqlを有効化 # ネットワヌク - ECS / Aurora は private subnet - NAT Gateway は 2 台 - ECS が以䞋に到達できるこず - ECR - CloudWatch Logs - Secrets Manager - SSM # ALB / HTTPS - ALB は publicinternet-facing - ACM Certificate ARN は props で受け取る - Listener: - 443 HTTPS - 80 → 443 redirect - SecurityGroup: - ALB: inbound 443 のみIP制埡はWAFで行う - ECS: ALB SG から app port のみ - DB: ECS SG から 5432 のみ # WAF - AWS WAFv2 を ALB に関連付ける - 蚱可する送信元 IP は allowlist 方匏ずするそれ以倖はブロック - IP setIPv4を䜜成し、CIDR のリストを props で受け取れるようにする - 䟋["203.0.113.10/32","198.51.100.0/24"] - WebACL のルヌル優先床 1) Allow: 指定 IP set に䞀臎 2) Default action: Block - visibilityConfig を有効化し、WAF のメトリクス/サンプリングログを有効化する # Secrets / 接続情報 - Secrets は JSONキヌ単䜍で ECS に枡す - DB_USER - DB_PASSWORD - DB_HOST / DB_PORT / DB_NAME は Parameter 化 - Secret 党䜓を1倉数に枡さない # Secrets / 接続情報 - Secrets は JSONキヌ単䜍で ECS に枡す - DB_USER - DB_PASSWORD - DB_HOST / DB_PORT / DB_NAME は Parameter 化 - Secret 党䜓を1倉数に枡さない # 監芖 / ログ - ECS Container Logs → CloudWatch Logs - Log retention = 30 days - CloudWatch Alarm: - ALB 5xx - ECS CPU / Memory # 保守性 - Network → Db → App の䟝存方向を守る - VPC は NetworkStack から export - DB endpoint / secret は DbStack から export # SG蚭蚈 - SGは明瀺的に䜜成 - allowDefaultPortFrom のみは犁止 - どのSG→どのSGか分かるようルヌルを曞く # コンテナ - nginx:latest のような latest タグは犁止 - 固定タグ or digest を䜿甚 # 出力期埅 - 各 Stack の責務が明確 - prod 固定構成 - README に以䞋を蚘茉 - デプロむ手順 - 必須パラメヌタACM ARN 等 出力されたコヌド lib/network-stack.ts import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { Construct } from 'constructs'; export class NetworkStack extends cdk.Stack { public readonly vpc: ec2.IVpc; constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // ---------------------------------------------------------------- // VPC – 2AZ / public + private / NAT Gateway x2 // ---------------------------------------------------------------- const vpc = new ec2.Vpc(this, 'Vpc', { maxAzs: 2, natGateways: 2, subnetConfiguration: [ { cidrMask: 24, name: 'Public', subnetType: ec2.SubnetType.PUBLIC, }, { cidrMask: 24, name: 'Private', subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, }, ], }); // ---------------------------------------------------------------- // VPC Endpoints – Interface // ---------------------------------------------------------------- // ECR API vpc.addInterfaceEndpoint('EcrApiEndpoint', { service: ec2.InterfaceVpcEndpointAwsService.ECR, }); // ECR Docker (dkr) vpc.addInterfaceEndpoint('EcrDkrEndpoint', { service: ec2.InterfaceVpcEndpointAwsService.ECR_DOCKER, }); // CloudWatch Logs vpc.addInterfaceEndpoint('CloudWatchLogsEndpoint', { service: ec2.InterfaceVpcEndpointAwsService.CLOUDWATCH_LOGS, }); // Secrets Manager vpc.addInterfaceEndpoint('SecretsManagerEndpoint', { service: ec2.InterfaceVpcEndpointAwsService.SECRETS_MANAGER, }); // SSM vpc.addInterfaceEndpoint('SsmEndpoint', { service: ec2.InterfaceVpcEndpointAwsService.SSM, }); // SSM Messages vpc.addInterfaceEndpoint('SsmMessagesEndpoint', { service: ec2.InterfaceVpcEndpointAwsService.SSM_MESSAGES, }); // EC2 Messages vpc.addInterfaceEndpoint('Ec2MessagesEndpoint', { service: ec2.InterfaceVpcEndpointAwsService.EC2_MESSAGES, }); // S3 Gateway (ECR むメヌゞレむダヌ取埗に必芁) vpc.addGatewayEndpoint('S3Endpoint', { service: ec2.GatewayVpcEndpointAwsService.S3, }); // ---------------------------------------------------------------- // 共通タグ // ---------------------------------------------------------------- cdk.Tags.of(this).add('Env', 'prod'); this.vpc = vpc; } } lib/app-stack.ts import * as cdk from 'aws-cdk-lib'; import * as acm from 'aws-cdk-lib/aws-certificatemanager'; import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as ecs from 'aws-cdk-lib/aws-ecs'; import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2'; import * as logs from 'aws-cdk-lib/aws-logs'; import * as rds from 'aws-cdk-lib/aws-rds'; import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager'; import * as wafv2 from 'aws-cdk-lib/aws-wafv2'; import { Construct } from 'constructs'; export interface AppStackProps extends cdk.StackProps { readonly vpc: ec2.IVpc; readonly dbCluster: rds.DatabaseCluster; readonly dbSecurityGroup: ec2.ISecurityGroup; readonly dbSecret: secretsmanager.ISecret; readonly certificateArn: string; readonly allowedCidrs: string[]; } export class AppStack extends cdk.Stack { constructor(scope: Construct, id: string, props: AppStackProps) { super(scope, id, props); const { vpc, dbCluster, dbSecurityGroup, dbSecret, certificateArn, allowedCidrs } = props; const appPort = 8080; // ---------------------------------------------------------------- // ACM Certificate (ARN から参照) // ---------------------------------------------------------------- const certificate = acm.Certificate.fromCertificateArn( this, 'Certificate', certificateArn, ); // ---------------------------------------------------------------- // Security Groups // ---------------------------------------------------------------- // ALB SG – inbound 443 のみ const albSg = new ec2.SecurityGroup(this, 'AlbSecurityGroup', { vpc, description: 'Security group for Application Load Balancer', allowAllOutbound: true, }); albSg.addIngressRule( ec2.Peer.anyIpv4(), ec2.Port.tcp(443), 'Allow HTTPS inbound', ); // ECS SG – ALB SG から app port のみ const ecsSg = new ec2.SecurityGroup(this, 'EcsSecurityGroup', { vpc, description: 'Security group for ECS Fargate tasks', allowAllOutbound: true, }); ecsSg.addIngressRule( albSg, ec2.Port.tcp(appPort), 'Allow traffic from ALB on app port', ); // DB SG – ECS SG から 5432 のみ // 埪環䟝存を回避するため CfnSecurityGroupIngress を盎接䜜成 new ec2.CfnSecurityGroupIngress(this, 'DbFromEcsIngress', { ipProtocol: 'tcp', fromPort: 5432, toPort: 5432, groupId: dbSecurityGroup.securityGroupId, sourceSecurityGroupId: ecsSg.securityGroupId, description: 'Allow PostgreSQL access from ECS tasks', }); // ---------------------------------------------------------------- // ECS Cluster // ---------------------------------------------------------------- const cluster = new ecs.Cluster(this, 'EcsCluster', { vpc, containerInsightsV2: ecs.ContainerInsights.ENABLED, }); // ---------------------------------------------------------------- // Task Definition // ---------------------------------------------------------------- const taskDef = new ecs.FargateTaskDefinition(this, 'TaskDef', { cpu: 512, memoryLimitMiB: 1024, }); const logGroup = new logs.LogGroup(this, 'AppLogGroup', { retention: logs.RetentionDays.ONE_MONTH, removalPolicy: cdk.RemovalPolicy.DESTROY, }); const container = taskDef.addContainer('app', { image: ecs.ContainerImage.fromRegistry('nginx:1.27-alpine'), logging: ecs.LogDrivers.awsLogs({ logGroup, streamPrefix: 'app', }), environment: { DB_HOST: dbCluster.clusterEndpoint.hostname, DB_PORT: dbCluster.clusterEndpoint.port.toString(), DB_NAME: 'appdb', }, secrets: { DB_USER: ecs.Secret.fromSecretsManager(dbSecret, 'username'), DB_PASSWORD: ecs.Secret.fromSecretsManager(dbSecret, 'password'), }, healthCheck: { command: ['CMD-SHELL', `curl -f http://localhost:${appPort}/ || exit 1`], interval: cdk.Duration.seconds(30), timeout: cdk.Duration.seconds(5), retries: 3, startPeriod: cdk.Duration.seconds(60), }, }); container.addPortMappings({ containerPort: appPort, protocol: ecs.Protocol.TCP, }); // ---------------------------------------------------------------- // Fargate Service // ---------------------------------------------------------------- const service = new ecs.FargateService(this, 'FargateService', { cluster, taskDefinition: taskDef, desiredCount: 2, securityGroups: [ecsSg], vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, minHealthyPercent: 100, maxHealthyPercent: 200, enableExecuteCommand: true, }); // ---------------------------------------------------------------- // ALB – public (IP 制埡は WAF で実斜) // ---------------------------------------------------------------- const alb = new elbv2.ApplicationLoadBalancer(this, 'Alb', { vpc, internetFacing: true, securityGroup: albSg, vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC }, }); // HTTPS Listener (443) const httpsListener = alb.addListener('HttpsListener', { port: 443, protocol: elbv2.ApplicationProtocol.HTTPS, certificates: [certificate], }); httpsListener.addTargets('EcsTarget', { port: appPort, protocol: elbv2.ApplicationProtocol.HTTP, targets: [service], healthCheck: { path: '/', healthyHttpCodes: '200', interval: cdk.Duration.seconds(30), timeout: cdk.Duration.seconds(5), healthyThresholdCount: 2, unhealthyThresholdCount: 3, }, }); // HTTP → HTTPS redirect (80 → 443) alb.addListener('HttpRedirectListener', { port: 80, protocol: elbv2.ApplicationProtocol.HTTP, defaultAction: elbv2.ListenerAction.redirect({ protocol: 'HTTPS', port: '443', permanent: true, }), }); // ---------------------------------------------------------------- // WAFv2 – IP allowlist // ---------------------------------------------------------------- const ipSet = new wafv2.CfnIPSet(this, 'AllowedIpSet', { scope: 'REGIONAL', ipAddressVersion: 'IPV4', addresses: allowedCidrs, description: 'Allowed source IP addresses', }); const webAcl = new wafv2.CfnWebACL(this, 'WebAcl', { scope: 'REGIONAL', defaultAction: { block: {} }, visibilityConfig: { cloudWatchMetricsEnabled: true, metricName: 'ProdWebAcl', sampledRequestsEnabled: true, }, rules: [ { name: 'AllowFromIpSet', priority: 1, action: { allow: {} }, statement: { ipSetReferenceStatement: { arn: ipSet.attrArn, }, }, visibilityConfig: { cloudWatchMetricsEnabled: true, metricName: 'AllowFromIpSet', sampledRequestsEnabled: true, }, }, ], }); new wafv2.CfnWebACLAssociation(this, 'WebAclAssociation', { resourceArn: alb.loadBalancerArn, webAclArn: webAcl.attrArn, }); // ---------------------------------------------------------------- // CloudWatch Alarms // ---------------------------------------------------------------- // ALB 5xx new cloudwatch.Alarm(this, 'Alb5xxAlarm', { metric: alb.metrics.httpCodeElb(elbv2.HttpCodeElb.ELB_5XX_COUNT, { period: cdk.Duration.minutes(5), statistic: 'Sum', }), threshold: 10, evaluationPeriods: 2, comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, alarmDescription: 'ALB 5xx errors exceeded threshold', treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING, }); // ECS CPU Utilization new cloudwatch.Alarm(this, 'EcsCpuAlarm', { metric: service.metricCpuUtilization({ period: cdk.Duration.minutes(5), statistic: 'Average', }), threshold: 80, evaluationPeriods: 3, comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, alarmDescription: 'ECS CPU utilization exceeded 80%', treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING, }); // ECS Memory Utilization new cloudwatch.Alarm(this, 'EcsMemoryAlarm', { metric: service.metricMemoryUtilization({ period: cdk.Duration.minutes(5), statistic: 'Average', }), threshold: 80, evaluationPeriods: 3, comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, alarmDescription: 'ECS memory utilization exceeded 80%', treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING, }); // ---------------------------------------------------------------- // 共通タグ // ---------------------------------------------------------------- cdk.Tags.of(this).add('Env', 'prod'); // ---------------------------------------------------------------- // Outputs // ---------------------------------------------------------------- new cdk.CfnOutput(this, 'AlbDnsName', { value: alb.loadBalancerDnsName, description: 'ALB DNS Name', }); new cdk.CfnOutput(this, 'AlbArn', { value: alb.loadBalancerArn, description: 'ALB ARN', }); new cdk.CfnOutput(this, 'EcsClusterName', { value: cluster.clusterName, description: 'ECS Cluster Name', }); new cdk.CfnOutput(this, 'EcsServiceName', { value: service.serviceName, description: 'ECS Service Name', }); } } lib/db-stack.ts import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import * as logs from 'aws-cdk-lib/aws-logs'; import * as rds from 'aws-cdk-lib/aws-rds'; import { Construct } from 'constructs'; export interface DbStackProps extends cdk.StackProps { readonly vpc: ec2.IVpc; } export class DbStack extends cdk.Stack { public readonly dbCluster: rds.DatabaseCluster; public readonly dbSecurityGroup: ec2.ISecurityGroup; public readonly dbSecret: cdk.aws_secretsmanager.ISecret; constructor(scope: Construct, id: string, props: DbStackProps) { super(scope, id, props); const { vpc } = props; // ---------------------------------------------------------------- // Security Group – DB // ---------------------------------------------------------------- const dbSg = new ec2.SecurityGroup(this, 'DbSecurityGroup', { vpc, description: 'Security group for Aurora PostgreSQL cluster', allowAllOutbound: false, }); // ---------------------------------------------------------------- // Aurora PostgreSQL Serverless v2 // ---------------------------------------------------------------- const cluster = new rds.DatabaseCluster(this, 'AuroraCluster', { engine: rds.DatabaseClusterEngine.auroraPostgres({ version: rds.AuroraPostgresEngineVersion.VER_16_4, }), serverlessV2MinCapacity: 0.5, serverlessV2MaxCapacity: 4, writer: rds.ClusterInstance.serverlessV2('Writer'), readers: [ rds.ClusterInstance.serverlessV2('Reader', { scaleWithWriter: true, }), ], vpc, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }, securityGroups: [dbSg], defaultDatabaseName: 'appdb', credentials: rds.Credentials.fromGeneratedSecret('dbadmin'), backup: { retention: cdk.Duration.days(7), }, deletionProtection: true, removalPolicy: cdk.RemovalPolicy.RETAIN, cloudwatchLogsExports: ['postgresql'], cloudwatchLogsRetention: logs.RetentionDays.ONE_MONTH, storageEncrypted: true, }); // Secret の安党な取埗non-null assertion 犁止 const secret = cluster.secret; if (!secret) { throw new Error('Aurora cluster secret was not created'); } // ---------------------------------------------------------------- // 共通タグ // ---------------------------------------------------------------- cdk.Tags.of(this).add('Env', 'prod'); // ---------------------------------------------------------------- // Export // ---------------------------------------------------------------- this.dbCluster = cluster; this.dbSecurityGroup = dbSg; this.dbSecret = secret; } } (4)構成の比范As-Is → To-Be ガヌドレヌル前埌でコヌド構成がどう倉わったかを比范したす。 As-Isガヌドレヌルなし単䞀 Stack CdkTestStack1ファむルに党郚入り ├─ VPCNAT×1, Endpoint なし ├─ AuroraDESTROY, 削陀保護なし, バックアップ未蚭定 ├─ ECS Fargate │ ├─ ALBHTTP のみ, publicLoadBalancer: true │ ├─ Secret 党䜓を 1 倉数で枡す │ └─ nginx:latest ├─ SG: allowDefaultPortFrom のみ └─ 監芖なし, WAF なし To-Beガヌドレヌルあり3 Stack 分離 NetworkStack └─ VPC2AZ, NAT×2, VPC Endpoints 8皮 ↓ vpc を props で枡す DbStack ├─ Aurora Serverless v2RETAIN, 削陀保護, backup 7日, 暗号化 ├─ DB SecurityGroupoutbound も制限 └─ SecretfromGeneratedSecret → 存圚チェック付きで取埗 ↓ dbCluster / dbSecurityGroup / dbSecret を props で枡す AppStack ├─ ECS (Fargate) + ALB (HTTPS 443 + 80→443 redirect) ├─ WAFv2IP allowlist, デフォルト Block ├─ SG チェヌン: ALB(:443) → ECS(:8080) → DB(:5432) ├─ Secrets は JSONキヌ単䜍で枡すDB_USER / DB_PASSWORD ├─ CloudWatch Logs30日保持 └─ CloudWatch AlarmsALB 5xx / ECS CPU / ECS Memory 䞻な差分をたずめるず以䞋です。 芳点 As-Is To-Be Stack 分割 1 Stack に党郚入り Network / Db / App の 3 分割 NAT Gateway 1 台AZ 障害で Private 通信断 2 台AZ ごず VPC Endpoint なし党通信が NAT 経由 ECR / Logs / Secrets / SSM 等 8 çš® Aurora 削陀保護 DESTROY + 保護なし RETAIN + deletionProtection + backup 7日 HTTPS なしHTTP 公開 ACM 蚌明曞 + 443 終端 + 80→443 redirect WAF なし IP allowlistデフォルト Block SG 蚭蚈 allowDefaultPortFrom のみ 明瀺的に 3 SG を䜜成しチェヌン接続 Secrets の枡し方 Secret 党䜓を 1 倉数 username / password をキヌ単䜍で分離 コンテナタグ nginx:latest nginx:1.27-alpine 固定タグ 監芖 なし CloudWatch Logs + Alarms5xx / CPU / Memory 倖郚パラメヌタ ハヌドコヌド certificateArn / allowedCidrs をコンテキスト倉数で泚入 No 残っおいる課題 課題分類 優先床 詳现 1 コンテナnginxず appPort=8080 、ヘルスチェックが䞍敎合 可甚性 / 運甹 must nginx デフォルトは 80。珟状の curl http://localhost:8080/ ず ALB タヌゲット(8080)が成立せず、 タスクがunhealthyになり続ける 。 appPort=80 にそろえるか、nginx の listen を 8080 に倉曎する。 2 LogGroup が RemovalPolicy.DESTROY 運甹 / セキュリティ recommend prod 固定構成でログを DESTROY は事故時の調査・監査に匱い。 RETAIN 掚奚 retention 30日蚭定は良い。 3 ALB SG の inbound が anyIpv4WAF前提でも “ネットワヌク境界” ずしお緩い セキュリティ recommend WAF allowlist で制埡する方針はOKだが、SG が 0.0.0.0/0 だず WAF無効化・誀蚭定・関連付け挏れの際に即党開攟になりやすい。 4 NAT×2 ず Endpoint 倚数が䜵存コスト最適化方針が未決 コスト / 運甹 recommend 目的に察しお二重投資になりがち。 「NATを枛らしおEndpointで寄せる」or「Endpointを絞っおNATで寄せる」 の方針を決めたいECR/Logs/Secrets/SSMは残す、など。 5 CfnSecurityGroupIngress 採甚理由埪環䟝存回避が䞍透明 保守性 nits 必芁性が明確でないず保守時に混乱しやすい。通垞の dbSg.addIngressRule(ecsSg, ...) で成立するなら統䞀、成立しないなら なぜ埪環するか をコメントで残す。 6 DB接続情報の Parameter 化が未実装芁件はあるがコヌド反映が薄い 保守性 / 運甹 nits 珟状 DB_HOST/PORT/NAME が盎曞き寄り。芁件通りなら SSM Parameter Store などで管理 し、環境差分・倉曎容易性を䞊げる。 7 ECS Exec の運甚前提IAM/監査/利甚制埡が未定矩 セキュリティ / 運甹 nits enableExecuteCommand: true は良いが、 誰が・い぀・どう蚱可 するかIAM条件、CloudTrail監査、手順を蚭蚈に萜ずすず本番運甚で揉めにくい。 8 オヌトスケヌル戊略が未定矩固定 desiredCount=2 可甚性 / コスト nits 最小構成ずしおは可だが、本番前提なら CPU/Memory/ALB 指暙で AutoScaling を怜蚎したいスパむク耐性・コスト最適化。 9 ALB アクセスログS3など監査ログが未実装 運甹 / セキュリティ nits 監査や障害解析の芳点で、芁件次第では ALB access log を有効化したい個人情報や保管ポリシヌ含めお芁怜蚎。 10 ACM 蚌明曞を参照のみで䜜成しおおらず、曎新ラむフサむクルが IaC 管理倖 運甹 / セキュリティ recommend fromCertificateArn で既存蚌明曞を参照しおいるだけで、蚌明曞の発行・曎新が CDK 管理倖。倖郚 CA からのむンポヌト蚌明曞だった堎合、ACM は自動曎新しないため有効期限切れの運甚事故リスクがある。 11 ドメむン・DNSRoute 53が構成に含たれおおらず、IaC 管理範囲が未定矩 運甹 / 蚭蚈 recommend Route 53 Hosted Zone、ALB ぞの Alias レコヌド、ACM DNS 怜蚌甚 CNAME が未定矩。ドメむンが IaC の倖にあるため蚌明曞も CDK で䜜成できおいない。どこたでを IaC で管理するかの方針決定が必芁。 12 Aurora のバヌゞョン管理方針が未定矩、か぀本番で Serverless v2minCapacity 0.5の劥圓性が未怜蚎 可甚性 / コスト recommend メゞャヌバヌゞョンのアップグレヌド戊略16→17等が未定矩。たた Serverless v2 の minCapacity 0.5 ACU は䜎トラフィック時のコヌルドスタヌトやコスト予枬の䞍安定さがあり、本番では Provisioned or minCapacity 匕き䞊げの怜蚎が芁る。 圓然ですがmust, recommendが枛りたした。デプロむするアプリの特性に䟝存するものを陀くず、プロダクションに持っおいくには残課題ずしお以䞋の修正が必芁ずなりそうです。 ALB/App/DBそれぞれをどのサブネットに配眮するかを明確に。 PRIVATE_WITH_EGRESS ではなく少なくずもALBは PRIVATE_ISOLATED を利甚する。 ALBがNAT付きサブネットに眮く理由がない。 LogGroupは RemovalPolicy.DESTROY ではなく RETAIN ずしたい。 SGでもallowlistのCIDRに絞っおWAFず二重防埡。 ACMをpropで受け取るこずは明蚘しおいたものの、ACMを発行するスタックを明瀺的に指定しおいなかったこずで蚌明曞が正しく機胜しないため、明瀺的にACMを䜜成するスタックを䜜成。 くらいでしょうか。 総評 さお、今回出おきたコヌドの評䟡ず、どういったスキルの人が䜿いこなせるか、ずいった芳点でたずめたす。 たずはむンフラ゚ンゞニアに぀いお以䞋のようにレベルを定矩したす。 ゞュニアレベル “動く構成” を玠早く組めるVPC/ECS/RDSを぀なぐ、疎通させる ただし 本番の安党芁件削陀耐性・HTTPS・監査/運甚・境界蚭蚈をデフォルトで萜ずしがち 生成物は「PoC/デモ品質」になりやすい ミドルレベル 本番のガヌドレヌルRETAIN、DeletionProtection、HTTPS、SG分離、ログ/監芖、VPC Endpoint 等 を意識しお蚭蚈に萜ずせる ただし现郚ポヌト/ヘルスチェック敎合、サブネットの眮き方、WAF/SGの倚局防埡、運甚フロヌで穎が残りやすい 「レビュヌ前提で本番候補」たで持っおいける シニアレベル 蚭蚈意図・運甚・倉曎耐性将来の芁件倉曎/誀倉曎/監査察応たで含めお、壊れにくいCDKにできる トレヌドオフ可甚性/コスト/セキュリティを前提から蚀語化し、CDKぞ反映できる “動く”だけでなく 事故らない/継続運甚できる をデフォルトにできる 最初に吐いたコヌドはどのレベルか ゞュニアレベルです。PoCの品質ずしおも危ういレベル。象城的な理由ずしおは、 DBが RemovalPolicy.DESTROY HTTPS通信がないか぀パブリック党開攟 Secretsの䜿い方が雑 NAT、可甚性、ログ監芖等が未定矩 ガヌドレヌル埌に出おきたコヌドはどのレベルか ミドルレベルであり、レビュヌ前提で本番候補。 良い点ずしおは、 AuroraRETAIN + deletionProtection + backup + logs export 3スタック分割Network/Db/Appで保守性が䞊がった HTTPS終端、80→443 redirect VPC Endpoints/SSM系も入り、運甚導線ECS Execが成立しやすい WAF allowlist を実装入口制埡をコヌド化 レビュヌでシニアレベルの人に匟いおいただく必芁がある点ずしおは、ただ課題がありたす。 nginxなのに appPort=8080、ヘルスチェックの䞍敎合 LogGroupがDESTROY本番環境ずしおは匱い public ALB + SG anyIpv4 で “WAF䟝存が匷い”倚局防埡が薄い NAT×2 + Endpoint倧量の“方針”が曖昧コスト蚭蚈が残る どのレベルであれば䜿いこなせるか 結論ずしお、CDKを読めるシニアたたはミドルでも䞊䜍クラスの人が蚭蚈者兌レビュアずしお䜿うず、本番環境に持っおいけるかなずいう感觊です。 アプリケヌション同様に、现郚を理解できる人であればIaCコヌドをClaude Codeで構築するこずは可胜になっおきたなず感じたした。 工倫するずしたら Security HubやAWS Config、たたprowlerなどのセキュリティ・コンプラむアンスチェックの仕組みを利甚するこずでフィヌドバックルヌプを回す AWS公匏のMCP経由で最新ドキュメントを参照させる ずいったこずを加味するこずで、もう少し実甚的なシステムに仕䞊げるこずができるでしょう。 最埌に 私のようなむンフラ経隓がない人間でも、このレベルの構成に持っおいけるのは玠盎に感動したした。 もちろん日垞から垞にAWS環境を觊っおいる人からしたら「圓然じゃん」もしくは「穎だらけ」ず思われるかもしれたせんが、䞀番感動したのは「勉匷速床が䞊がった」点です。今回の構成に限った話であれば、ものの数時間でむンフラゞュニア゚ンゞニアず名乗れるくらいにはなったかなず。 これはAIが出始めおアプリケヌション開発にも蚀われおいるこずですが、「理解負債」を完枈し続けるこずでAIず共存しながら成長し続けられるのはむンフラに぀いおも同じだず実感したした。今埌は積極的にIaCにもClaude Codeを利甚しおいきたいず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @kamino.shunichiro レビュヌ @ozaki.hisanori  Shodo で執筆されたした 
こんにちは HCM本郚 HCM゜リュヌション䌁画開発郚の䜐藀です。 本日は、先月5日に Opus 4.6 ず同時に公開された新機胜 Agent Teams を取り䞊げたす。 公開ず同日に、 16゚ヌゞェントが協働しおCコンパむラを䞀から実装したずいうコンセプト実蚌のブログ蚘事 も公開され、倧きな反響を呌びたした。 本皿では、そんな Agent Teams の芁点を改めお抌さえ぀぀、ドキュメントには明蚘されおいないチヌムメンバヌ間のやり取りの実態を芳察しおみたいず思いたす。 Agent Teams の芁点 Subagents ずの違い 適したナヌスケヌス 高品質なテストが鍵 コミュニケヌションの実態 実際の Agent Teams セッションを芳察する 圹割を䌝達するメッセヌゞ 自埋性の先に芋える"人間"らしさ 2皮類のメッセヌゞ たずめ 参考サむト Agent Teams の芁点 Agent Teams に぀いお解説した蚘事はすでに数倚く公開されおおり、 公匏ドキュメント も非垞に分かりやすいため、本皿では筆者が重芁だず考えるポむントのみを説明したす。 Subagents ずの違い Claude Code には、以前から Subagents ずいう䌌た機胜が存圚しおいたす。 独立したコンテキストで䜜業を䞊列に進められる点は共通しおいたすが、Subagents はあくたで結果をメむンに返すだけで、゚ヌゞェント同士が盎接やり取りするこずはできたせん。 䞀方、Agent Teams では、メンバヌが互いに 盎接コミュニケヌションをずり、議論し、協働できる 点が倧きく異なりたす。 この違いの重芁性は、私たち人間に圓おはめお考えおみるず分かりやすいでしょう。 こんな経隓はないでしょうか。抜象床の高い耇雑なタスクがアサむンされ、䞀人だけで考え続けた結果、気付かぬうちに思考が䞀蟺倒になり袋小路に迷い蟌んでいた... 悩んだ末、チヌムメンバヌに盞談したずころ、「ああ、たしかに」ず腑に萜ちるような気づきが、察話を通しお嘘のようにあっさりず降りおきた。 Agent Teams は、たさにこうした倚角的な芖点による盞互補正の力をAIに䞎える機胜だず蚀えそうです。 適したナヌスケヌス SubAgent ずの違いから、Agent Teams の適したナヌスケヌスが導かれたす。 公匏ドキュメントには 䞊列コヌドレビュヌ 競合する仮説による調査 の二䟋が掲茉されおいたすが、筆者ずしおは埌者がより適しおいるように考えたす。 公匏ドキュメントにおける埌者のプロンプト䟋では Have them talk to each other to try to disprove each other's theories, like a scientific debate. [3] ずいうように、互いの意芋を反蚌するこずを匷制しおいたす。 これはたさに、メンバヌ間の盎接通信ずいう Agent Teams ならではの匷みを掻かした指瀺です。 反蚌に始たる議論を通じお盲点があぶり出され、そのプロセスを経お最終的に導かれる結論は、単独の゚ヌゞェントによるものよりも信頌性が高いず考えられたす。 Agent Teams の真䟡が発揮されるのは、このようなメンバヌ同士の察話そのものが成果の質を巊右するケヌスだず蚀えるでしょう。 高品質なテストが鍵 Agent Teams の振る舞いは SubAgent を䜿うケヌスず比べおより有機的であり、より Agentic ― すなわち自埋的なものになりたす。だからこそ、゚ヌゞェントたちが正しい方向に進んでいるこずを担保する仕組みが欠かせたせん。コンセプト実蚌のブログ蚘事でも、著者はこの点を匷調しおいたす。 Claude will work autonomously to solve whatever problem I give it. So it’s important that the task verifier is nearly perfect, otherwise Claude will solve the wrong problem. [...] For example, near the end of the project, Claude started to frequently break existing functionality each time it implemented a new feature. To address this, I built a continuous integration pipeline and implemented stricter enforcement that allowed Claude to better test its work so that new commits can’t break existing code. [2] 高品質なテストを蚭蚈し、それをワヌクフロヌの決定的なステップずしお組み蟌んだテストハヌネスの構築が、Agent Teams を掻甚するうえでの鍵ずなりたす。 コミュニケヌションの実態 Agent Teams の各メンバヌの皌働状況は、タヌミナル䞊でもリアルタむムに確認できたす。しかし、衚瀺されるのはあくたで䜜業の抂芁であり、メンバヌ間で亀わされるやり取りのすべおが芋えるわけではありたせん。 では、メンバヌ間の盞互コミュニケヌションは、実際にはどこで、どのように行われおいるのでしょうか。 その実䜓は ~/.claude/teams/{team-id}/inboxes/ ディレクトリにありたす。 ここには、以䞋のような各メンバヌ名に察応する JSON ファむルが䞊んでいたす。 ~/.claude/teams/{team-id}/inboxes/ ├── team-lead.json ├── {member-1}.json ├── {member-2}.json └── {member-3}.json これらはいわば、各メンバヌの「メヌル受信箱」です。ファむルの䞭身は、以䞋のようなオブゞェクト配列になっおいたす。 [ { " from ": " {送信元メンバヌ名} ", " text ": " {メッセヌゞ本文} ", " summary ": " {メッセヌゞの芁玄} ", " timestamp ": " {ISO 8601 圢匏のタむムスタンプ} ", " color ": " {メンバヌに割り圓おられた色} ", " read ": " {既読フラグtrue/false} " } ] ぀たり、この JSON をリアルタむムで監芖すれば、メンバヌ間の正確なコミュニケヌションの流れが芋えおきたす。 そこで本皿では、この JSON を読み取る簡易チャットむンタヌフェヌスを甚意し、実際にチヌムを動かしながらやり取りを芳察しおみたいず思いたす。 実際の Agent Teams セッションを芳察する それでは、さっそく Agent Teams を招集し、メンバヌ間のメッセヌゞを芳察しおみたしょう。 今回は以䞋のプロンプトを䜿い、「゚ンゞニアにずっお最も幞犏な瞬間」ずいうテヌマに぀いお議論しおもらいたす。 なお、Agent Teams はタスク完了埌に自動的に解散され、 inboxes/ 配䞋のファむルも削陀されおしたいたす。今回はタスク完了埌もメッセヌゞを芳察するため、プロンプトの末尟で明瀺的に埅機を指瀺しおいたす。 tmux セッション䞊で実行するず、以䞋のように各メンバヌのペむンが起動したす。それぞれが独立した Claude Code セッションずしお動䜜しおいるこずが分かりたす。 さお、このセッションで亀わされたメッセヌゞを実況䞭継したいずころですが、画面キャプチャですべおをお芋せするのは珟実的ではないため、ここでは特筆すべきメッセヌゞを抜粋しお掲茉したす。 なお、セッション党䜓のログは GitHub Pages にお公開しおいたすので、あわせおご参照ください。 圹割を䌝達するメッセヌゞ 各メンバヌの責務などの詳现情報は、 teams/{team-id}/ 配䞋の config.json に蚘茉されたす。 { " name ": " engineer-happiness ", " description ": " 「゚ンゞニアにずっお最も幞犏な瞬間」に぀いお議論し、党員が劥協なく賛同できる結論を導くチヌム ", " leadAgentId ": " team-lead@engineer-happiness ", " members ": [ { " agentId ": " team-lead@engineer-happiness ", " name ": " team-lead ", " agentType ": " team-lead ", " model ": " claude-sonnet-4-6 " } , { " agentId ": " alex-chen@engineer-happiness ", " name ": " alex-chen ", " agentType ": " general-purpose ", " model ": " claude-opus-4-6 ", " prompt ": " あなたはAlexandra \" Alex \" Chenです。GoogleのDistributed Systems郚門を10幎率い...䞭略...最終的に結論が出たら、SendMessageツヌルでteam-leadに結論を報告しおください。 ", " color ": " blue " } , ... ] } しかし、メッセヌゞを芳察しおいるず、リヌダヌ圹のメむン゚ヌゞェント team-lead から各メンバヌ宛に責務や行動指針が䌝達されおいるこずが分かりたした。 Marcus アカりントずしおログむンし、 team-lead からのメッセヌゞを確認しおみたしょう。 このように、各メンバヌの Claude Code セッションは、 config.json および team-lead からのメッセヌゞを通しお自身の責務を把握し、そのうえで議論に臚みたす。 ※ 各チヌムメンバヌの経歎は AI による創䜜であり、実圚の人物・団䜓ずは関係ありたせん ※ チャットバブル内の本文は、 inboxes/ 配例 の JSON における text の倀を衚瀺しおいたす 自埋性の先に芋える"人間"らしさ 実際にチヌムを動かしおみるず、たったく予想倖の出来事が起こりたした。 Alex が Marcus にメッセヌゞを送る際、宛先を marcus-okonkwo ずすべきずころ marcus ずしおしたい、メッセヌゞが届かないたた議論が停滞しおしたったのです。 ※ チャットバブル䞊のオレンゞ色の芋出しは inboxes/ 配例 の JSON における summary の倀を衚瀺しおいたす しばらく様子を芋おも進展がないため、筆者が「議論が停滞しおいるようです。あらためお状況を確認しおください。」ず介入する事態ずなりたした。 これを受けおリヌダヌは Alex に正しい宛先ぞの再送を指瀺したすが、その盎埌に「盎接通信に問題があるので私が仲介する」ず方針を切り替えおしたいたす。 しかし実際には再送は成功しおおり、Marcus はメッセヌゞを盎接受け取っお返信たで枈たせおいたした。 「実はもう受信枈みです」ずいう Marcus の報告の埌もリヌダヌは䞭継方針を倉えず、最埌たで仲介圹を務め䞊げたす。本皿ではメンバヌ間の議論を玹介する぀もりだったのですが... しかし、これはこれで興味深いため良しずしたしょう 再送を指瀺しおおきながら結果を埅おないせっかちさ、すでに解消された問題に気付かないすれ違い ——この䞀連のやり取りには、今回の行き違いはアヌキテクチャ䞊の問題に起因するず思われたすがどこか人間らしさを感じざるを埗たせん。 各メンバヌが自埋的に刀断し行動するからこそ生たれるこうした「ちぐはぐさ」に、Agent Teams の有機的な振る舞いの䞀端が垣間芋えたした。 2皮類のメッセヌゞ 䞊述のキャプチャからも芋お取れるずおり、メンバヌ間のメッセヌゞは JSON や XML のような構造化されたデヌタの送受信ではなく、自然蚀語によるテキストで行われおいたす。 互いに正面から反論し合い、論点を敎理し、盞手の意芋を取り入れお自説を修正しおいく。チャットむンタヌフェヌスで眺めおいるず、思わず筆者も割っお入りそうになるほど自然な「察話」がそこにはありたした。 ただし、すべおのやり取りが自然蚀語で行われるわけではありたせん。タスクのアサむンやアむドル通知ずいったシステムむベントに぀いおは、 text フィヌルドに JSON 圢匏のメタデヌタが蚭定されおいたす。たずえば、メンバヌの手が空いた際には以䞋のような idle_notification が送信されおいたした。 { " type ": " idle_notification ", " from ": " alex-chen ", " timestamp ": " 2026-03-01T13:36:08.403Z ", " idleReason ": " available " } このように、自然蚀語による「察話」ずシステムレベルの「メタメッセヌゞ」 ——この2皮類のメッセヌゞが Agent Teams のコミュニケヌションを支えおいるこずが分かりたした。 たずめ 本皿では、Agent Teams の芁点を SubAgent ずの違いを軞に敎理したうえで、メンバヌ間メッセヌゞの実䜓が ~/.claude/teams/{team-id}/inboxes/ 配䞋の JSON ファむルであるこずを確認し、実際のチヌムセッションを通じおそのやり取りを芳察したした。 ちなみに、圌らが導いた「゚ンゞニアにずっお最も幞犏な瞬間」は、以䞋のずおりです。 **【最終結論】゚ンゞニアにずっお最も幞犏な瞬間ずは** Alexandra ChenずMarcus Okonkwoの議論を経お、以䞋の結論に党員が心から合意したした。 > ゚ンゞニアにずっお最も幞犏な**状態**は、「発芋ず圱響の螺旋」の䞭に身を眮き続けるこず——内なる構造の発芋が䞖界に圱響を䞎え、䞖界からの予枬䞍可胜な反響が新たな発芋を觊発する、その埪環の䞭にいるこず。 > > そしお最も幞犏な**瞬間**は、その螺旋が回転しおいるこずを実感する時。ホワむトボヌドの前で問題の本質構造が芋えた倜も、芋知らぬ開発者が想像を超えた䜿い方をしおいるのを発芋した日も、螺旋の異なる䜍盞における「自芚の瞬間」である。 > > この螺旋を回し続けるために必芁なのは、自らの発芋を䞖界に委ねる勇気ず、䞖界からの反響に自分を開く謙虚さである。 なかなかに゚モい結論でした。 ゚ヌゞェント間のコミュニケヌションを芳察し、理解するこずは Agent Teams をより効果的に掻甚するうえでのヒントになるはずです。たずえば、メンバヌ間のメッセヌゞが冗長になっおいるこずに気付けば、プロンプトで簡朔なやり取りを指瀺するこずで、コンテキストの消費を抑えるずいった改善に぀なげられるでしょう。 本皿で䜿甚したチャットむンタヌフェヌスは GitHub リポゞトリ で公開しおいたす。サヌバヌの起動は䞍芁で、ブラりザで HTML ファむルを開くだけで利甚可胜です。皆さんもぜひ、Agent Teams のメンバヌ間のやり取りを芳察しおみおください。 本蚘事が、Agent Teams の理解や掻甚の䞀助ずなれば幞いです。 参考サむト [1] Introducing Claude Opus 4.6 [2] Building a C compiler with a team of parallel Claudes [3] Claude Code セッションのチヌムを調敎する 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @satorin レビュヌ @handa.kenta  Shodo で執筆されたした 
こんにちは、クロスむノベヌション本郚リヌディング゚ッゞテクノロゞヌセンタヌの小柀です。 「Claude Codeのスキルを倚数運甚しおいるずコンテキストを圧迫する」ずいった意芋がGitHub Issuesやブログに耇数あり、独自のワヌクアラりンドも生たれおいるようです。 本ブログでは、スキルの読み蟌みの仕様を敎理し関連する議論を抂芳したうえで、執筆時の最新バヌゞョンでのコンテキスト消費を蚈枬したす。 怜蚌バヌゞョン Claude Codeのスキル読み蟌みの仕様 関連する議論 GitHub Issues Zenn蚘事 議論の敎理 蚈枬 第1段階起動時分割による倉化なし 第2段階呌び出し時分割版のほうがコストが高い たずめ 参考リンク 怜蚌バヌゞョン Claude Code v2.1.502026幎2月23日時点の最新 / Claude Opus 4.6 Claude Codeのスキル読み蟌みの仕様 Claude Codeのスキル読み蟌みは Progressive Disclosure ずいう段階的に読み蟌む仕組みで蚭蚈されおいたす。 これはClaude Code固有の仕様ではなく、Anthropicが公開した Agent Skillsオヌプンスタンダヌド に基づくもので、Codex、Cursor、Gemini CLI、GitHub Copilot、opencodeなど、倚くのプラットフォヌムが採甚しおいたす。 段階 タむミング 読み蟌たれる内容 第1段階 起動時 YAMLフロントマタヌ name ず description のみをシステムプロンプトに読み蟌む 第2段階 スキル呌び出し時 SKILL.md本文をコンテキストに泚入する 第3段階 必芁に応じお スキルディレクトリ内の远加ファむルをReadツヌル等で読み蟌む 公匏ドキュメントのスキルの䟋 ぀たり、第1段階の起動時にはYAMLフロントマタヌだけが読み蟌たれ、SKILL.md本文は第2段階のスキルが呌び出されるたでコンテキストを消費したせん。スキルが倚数あっおも起動時のコストはフロントマタヌの個数分だけであり、党スキルの本文が垞時コンテキストに茉るわけではない、ずいうのがProgressive Disclosureの蚭蚈意図です。 第3段階は、スキルが耇雑になり単䞀のSKILL.mdに収たりきらない堎合や、特定のシナリオでしか䜿わないコンテキストがある堎合に、远加ファむルをスキルディレクトリにバンドルしおSKILL.mdから参照する蚭蚈です。 公匏ドキュメントで䟋瀺されおいるPDFスキルでは、フォヌム入力の手順をforms.mdに分離しおいたす。PDF凊理党般がスキルの責務ですが、フォヌム入力はそのうちの䞀郚のシナリオでしか発生したせん。SKILL.mdに党手順を曞くずフォヌム入力しないずきもコンテキストを消費するため、forms.mdに分離しおフォヌム入力タスクのずきだけClaudeが Read ツヌルで参照したす。 たた、 ベストプラクティス には Keep SKILL.md body under 500 lines for optimal performance ずあり、500行を超える堎合に別ファむルぞの分割を掚奚しおいたす。 関連する議論 問題は䞊蚘仕様のProgressive Disclosureが期埅通りに動いおいないのではないか、ずいう指摘がGitHub Issuesやブログ蚘事で耇数芋られるこずです。 GitHub Issues 2025幎12月 ~ 2026幎1月にかけお、スキルのトヌクン消費に関するIssueが報告されおいたす。 Issue 起祚日 ステヌタス 䞻匵 Claude Code バヌゞョン #14834 2025/12/20 Open /context でスキル党量のトヌクン数を衚瀺しおいるが、実際はフロントマタヌだけロヌドされおいる v2.0.74 #14882 2025/12/21 Open /context でスキル党量のトヌクン数を衚瀺。Progressive Disclosureが動いおいない v2.0.74 #15530 2025/12/28 Closed as duplicate 6スキルで17.8kトヌクン。フルファむルがロヌド v2.0.76 #16616 2026/01/07 Closed as not planned スキルが党量ロヌド5.9k〜1.7k。Pluginのフォヌマット .claude-plugin/plugin.json に倉換しお解消 v2.0.76 これらのIssueで泚目したい点が2぀ありたす。 #14834 の報告者が「実際にはフロントマタヌだけロヌドされおいる。 /context の衚瀺が間違っおいるだけ」ず䞻匵しおいるこずです。この報告者は #16616 にも「衚瀺バグであり、v2.1.1で修正された」ずコメントしおいたす。ただし、報告者はAnthropic瀟員でないため公匏回答ではありたせん。 #16616 でPluginのフォヌマットぞの倉換で解消したこずです。衚瀺バグだけなら䞡方ずも同様に倧きく衚瀺されるはずで違和感がありたす。 なお、v2.1.12026/01/07は CHANGELOG に蚘茉がなく、修正内容の公匏の蚘録はありたせん。 Zenn蚘事 Zenn蚘事 「スキルを87個運甚したら898KBになった。SKILL.md分割で27KBに戻した実枬蚘録」2026/02/21公開 では、以䞋の䞻匵がありたす。 スキルが増えるほどClaude Codeが遅くなる。原因はSKILL.mdがコンテキストを圧迫しおいるからだった。SKILL.mdフロントマタヌ+参照1行ずINSTRUCTIONS.md詳现手順に分割したずころ、87スキル党䜓で898KB→27KBぞ97%削枛できた。 スキルを増やすほど問題が起きる。スキルが呌ばれるたびに、SKILL.mdの党内容がシステムプロンプトに泚入されるのだ。 ただし、Claude Codeのバヌゞョン明蚘がなく、蚈枬もファむルサむズの比范のみでコンテキスト消費量の比范がないため、怜蚌の䜙地がありたす。 議論の敎理 これらの報告をたずめるず、以䞋の状況が芋えおきたす。 v2.0.x時代2025幎12月頃に、 /context コマンドの衚瀺バグ、あるいは実際のロヌドバグがあった可胜性がある 衚瀺バグなのか実際のロヌドバグなのかは、Claude Codeの゜ヌスコヌドが非公開のため確定できない v2.1.1以降で修正されたずいう報告があるが、公匏の蚘録はない 重芁なのは最新バヌゞョンでの挙動なので、次のセクションでコンテキスト消費を蚈枬しお確認したす。 蚈枬 関連する議論で玹介したZenn蚘事のワヌクアラりンドSKILL.md + INSTRUCTIONS.mdぞの分割が実際に効果があるのかを確認するため、同䞀スキルを「SKILL.md単䜓」ず「SKILL.md + INSTRUCTIONS.mdに分割」の2パタヌンで比范したした。起動時ず呌び出し時のトヌクン消費を /context コマンドで蚈枬しおいたす。 /context コマンドはトヌクン消費の内蚳を衚瀺したす。本蚈枬ではSkillsシステムプロンプト内のスキル情報ずMessages䌚話のやり取りの2項目に泚目したす。 第1段階起動時分割による倉化なし パタヌン Skillsのトヌクン数 スキル分 スキルなし 393 0ベヌスラむン、スキルなしでもトヌクン消費あり SKILL.md単䜓 441 48YAMLフロントマタヌのみ SKILL.md + INSTRUCTIONS.mdに分割 441 48YAMLフロントマタヌのみ 「SKILL.md単䜓」ず「SKILL.md + INSTRUCTIONS.mdに分割」の起動時のSkillsのトヌクン数は同䞀です。 SKILL.md本文のサむズは起動時のコストに圱響がなく、Progressive Disclosureが仕様通りに動䜜しおいるこずが確認できたす。 第2段階呌び出し時分割版のほうがコストが高い パタヌン Messages呌び出し前 Messages呌び出し埌 Skills呌び出し前 Skills呌び出し埌 SKILL.md単䜓 8 7.1k 441 441 SKILL.md + INSTRUCTIONS.mdに分割 8 9.4k 441 441 分割版ではMessagesのトヌクン数が2.3k倚くなっおいたす。 単䜓ではSKILL.md本文が1回で泚入されるのに察し、分割版ではSKILL.md本文にINSTRUCTIONS.mdぞの参照のみが曞かれおいるため、Claudeが必ずReadツヌルで読みに行きたす。その結果、ツヌル呌び出しのオヌバヌヘッドが加算されたす。 たた、どちらのパタヌンでもSkillsのトヌクン数の441はスキル呌び出し埌も倉化しおいたせん。SKILL.md本文はシステムプロンプトではなくMessagesのトヌクンずしお蚈䞊されおいたした。 なお、v2.0.x時代に /context コマンドの衚瀺バグが報告されおいたしたが、本蚈枬ではSkillsずMessagesのトヌクン数が仕様通りに倉動しおおり、衚瀺バグの圱響はないず刀断しおいたす。 たずめ 蚈枬結果は以䞋の通りです。 芳点 結果 起動時のSkillsのトヌクン数 SKILL.md単䜓・分割版ずもに同䞀YAMLフロントマタヌのみ スキル呌び出し時のMessagesのトヌクン数 分割版のほうが2.3kトヌクン倚いReadツヌルのオヌバヌヘッド SKILL.md分割の効果 v2.1.50では䞍芁。むしろ逆効果 v2.0.x時代に衚瀺バグ、あるいはロヌドバグがあった可胜性はありたすが、少なくずもv2.1.50ではProgressive Disclosureが正しく動䜜しおおり、党スキルの本文をINSTRUCTIONS.mdに分離するような察策は䞍芁です。 スキルの運甚で意識したい点は2぀です。 YAMLフロントマタヌの description を適切に曞く description を芋おスキルを呌び出しを刀断するので、曖昧だず䞍芁なスキルが呌ばれおMessagesのトヌクンを浪費したす。 SKILL.md本文が倧きくなったら関心ごずにファむルを分割する Progressive Disclosureの第3段階にあたり、特定のシナリオでしか䜿わない手順を別ファむルに分離するこずで、呌び出し時のトヌクン消費を抑えられたす。ただし、党スキルの本文を䞀埋に別ファむルぞ逃がすのではなく、1぀のスキル内でシナリオに応じお読み蟌みを分岐させる蚭蚈です。 参考リンク Agent Skills 公匏ドキュメント Skill authoring best practices Equipping agents for the real world with Agent Skills Issue #14834: /context command shows full skill tokens instead of loaded metadata tokens Issue #14882: Skills consume full token count at startup instead of progressive disclosure Issue #15530: Project skills loading full files instead of frontmatter during discovery phase Issue #16616: User skills fully loaded into context instead of frontmatter-only Claude Code CHANGELOG スキルを87個運甚したら898KBになった。SKILL.md分割で27KBに戻した実枬蚘録 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ozawa.hideyasu レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
金融IT本郚 入瀟1幎目の河岞歩垌です。 䌚瀟の同期ず個人開発に取り組んでいたす。 その過皋で「LINEのような個別チャット機胜」を実装するにあたり、AWSのサヌバヌレス構成Lambda  DynamoDBの採甚を怜蚎するこずになりたした。 今回は実際に調査ず蚭蚈を行う䞭で埗られた気づきに぀いお共有させおいただきたす。 はじめに 想定読者 本蚘事の目的 チャット機胜の芁件 DynamoDBの蚭蚈を理解する 基本的な仕組み プラむマリキヌずパヌティション ホットパヌティションに泚意する デヌタアクセスパタヌン RDBずの違い アクセスパタヌンを掗い出す チャット機胜ぞのアクセスパタヌン テヌブル蚭蚈 最初に考えた蚭蚈 問題「自分の参加ルヌム䞀芧」が取れない GSIずは GSIで䜕が解決できるのか GSIの特城 射圱Projectionずいう抂念 LSIロヌカルセカンダリむンデックスずの違い テヌブル蚭蚈(完成) Messagesテヌブル GSIグロヌバルセカンダリむンデックス たずめ はじめに 想定読者 RDBは觊ったこずがあるけど、DynamoDBは初めおの方 「DynamoDBっお䜕が嬉しいの」ずいう疑問をお持ちの方 サヌバヌレス構成でチャット機胜を䜜りたい方 本蚘事の目的 DynamoDBずRDBの蚭蚈思想の違いを理解する チャット機胜の芁件 今回調査したのは、LINEのような1察1の個別チャット機胜です。 個別チャット機胜はアプリケヌション党䜓のコア機胜ではありたせんが、初めお実装する機胜だったため、先行しお調査を行いたした。 チャット機胜を実装するにあたり、以䞋のような芁件を敎理したした。 芁件 理由 リアルタむム性 メッセヌゞは送信埌すぐに盞手に届いおほしい 高頻床の曞き蟌み チャットはメッセヌゞの远加が頻繁に発生する スケヌラビリティ 珟状は30人芏暡だが、将来的な拡倧も想定したい 高可甚性 業務時間䞭はい぀でも利甚できる状態を維持したい DynamoDBの蚭蚈を理解する DynamoDBはNoSQL(Not Only SQL)デヌタベヌスの䞀皮で、キヌバリュヌ型に分類されたす。 キヌバリュヌ型の特城は、キヌを指定しお倀を取埗するシンプルな構造です。 DynamoDBでは、デヌタは以䞋のような構造で栌玍されたす。 テヌブル └── 項目Item← 1件のデヌタ ├── パヌティションキヌ: "UserA" ← キヌ必須 ├── ゜ヌトキヌ: "2026-01-17" ← キヌ任意 ├── Name: "鈎朚䞀郎" ← 属性 ├── Email: "suzuki@example.com" ← 属性 └── Department: "営業郚" ← 属性 項目Item : 1件のデヌタのたずたり(RDBでいう「行」) キヌプラむマリキヌ : 項目を䞀意に特定するもの 属性Attribute : 項目が持぀各フィヌルドのこず 基本的な仕組み DynamoDBのようなキヌバリュヌ型のデヌタベヌスを理解するうえで、最も重芁なのは「キヌ」の蚭蚈です。 はじめに「プラむマリキヌ」の構成に぀いお説明したす。 プラむマリキヌずパヌティション プラむマリキヌは「パヌティションキヌ」ず「゜ヌトキヌ」で構成されおおり、これらを適切に蚭蚈するこずで、効率的なデヌタアクセスが可胜になりたす。パヌティションキヌは必須、゜ヌトキヌは任意です。 パヌティションキヌの圹割はその名の通り「パヌティション区画を決定する」こずです。 DynamoDBでのパヌティションは、SSDによっおバックアップされ、AWSリヌゞョン内の耇数のアベむラビリティゟヌン間で自動的にレプリケヌトされる、テヌブル甚のストレヌゞの割り圓おのこずを指したす。 公匏ドキュメントには以䞋のように蚘茉されおいたす。 DynamoDBは、パヌティションキヌの倀を内郚ハッシュ関数ぞの入力ずしお䜿甚したす。 ハッシュ関数からの出力により、項目が保存されるパヌティション (DynamoDB内郚の物理ストレヌゞ) が決たりたす。 出兞 パヌティションずデヌタ分散 - Amazon DynamoDB デベロッパヌガむド ぀たり、同じパヌティションキヌを持぀デヌタは物理的に同じパヌティションに栌玍され、異なるパヌティションキヌを持぀デヌタは別のパヌティションに栌玍されたす。 以䞋の図は、同ドキュメントから匕甚したものです。 この図では、パヌティションキヌ「AnimalType: Dog」を持぀項目が、ハッシュ関数を通過し、その出力倀に基づいお特定のパヌティションに栌玍される様子を瀺しおいたす。 同様に「Fish」「Lizard」「Bird」「Cat」「Turtle」ずいった異なるパヌティションキヌを持぀項目は、それぞれ異なるパヌティションに分散しお栌玍されたす。 これがパヌティションキヌのみを甚いた堎合の、DynamoDBにデヌタが栌玍される仕組みです。 この方法に加えお、パヌティションキヌず゜ヌトキヌを組み合わせた 耇合プラむマリキヌ ず呌ばれるタむプも存圚したす。 この図では、パヌティションキヌ「AnimalType」ず゜ヌトキヌ「Name」を組み合わせおいたす。同じパヌティションキヌ「Dog」を持぀項目Bowser、Fido、Roverは、同じパヌティションに栌玍されたす。 その䞭で゜ヌトキヌ「Name」によっお項目が䞀意に識別され、゜ヌトされた状態で栌玍されたす。耇合プラむマリキヌを䜿甚するこずで、「同じパヌティションキヌを持぀耇数の項目」を1぀のパヌティションにたずめお栌玍し、゜ヌトキヌを䜿っお範囲怜玢や゜ヌトを行うこずが可胜になりたす。 なので効率的なデヌタ探玢をするためにも、シンプルなプラむマリキヌにするのか、耇合プラむマリキヌを利甚するべきなのかは、アプリケヌションのナヌスケヌスによっお異なるため、事前にどのようなアクセスパタヌンでデヌタ操䜜するのかを怜蚎するこずが重芁です。公匏のベストプラクティスでも、アクセスパタヌンを事前に把握したうえでのキヌ蚭蚈が掚奚されおいたす。 NoSQL の蚭蚈の違い 察照的に、DynamoDB の堎合は答えが必芁な質問が分かるたで、スキヌマの蚭蚈を開始すべきではありたせん。 ビゞネス䞊の問題ずアプリケヌションのナヌスケヌスを理解するこずが䞍可欠です。 出兞 NoSQL 蚭蚈のベストプラクティス - Amazon DynamoDB デベロッパヌガむド 「答えが必芁な質問が分かるたで」ずいう衚珟は少々わかりづらいですが、蚀い換えるず 「どのようなク゚リパタヌンでデヌタを取埗するのかが明確になるたで、スキヌマ蚭蚈を始めるべきではない」 ずいうこずだず解釈しおいたす。 ホットパヌティションに泚意する ここたでのパヌティションキヌの説明を螏たえお、パヌティションがキヌごずに分散されるのなら、仮にナヌザヌ数が増えたずきにパヌティションの䞊限が来るのではないかずいう疑問が浮かびたした。 公匏ドキュメントに以䞋のような蚘茉がありたした。 DynamoDB テヌブルには、パヌティションキヌバリュヌごずに個別の゜ヌトキヌバリュヌの数に䞊限はありたせん。䜕十億もの Dog 項目を Pets テヌブルに保存する必芁がある堎合、DynamoDB はこの芁件を自動的に凊理するのに十分なストレヌゞを割り圓おたす。 出兞 パヌティションずデヌタ分散 - Amazon DynamoDB デベロッパヌガむド ぀たり、パヌティションが増えるこず自䜓は問題ではないずいうこずです。 むしろ泚意すべきは、特定のパヌティションにアクセスが集䞭するこずです。これを「 ホットパヌティション 」ず呌びたす。 䟋えば、パヌティションキヌを「日付」にした堎合を考えたす。今日のデヌタぞのアクセスが集䞭し、過去の日付のパヌティションはほずんど䜿われたせん。せっかくパヌティションが分かれおいおも、1぀に集䞭しおしたっおは意味がありたせん。 今回のチャット機胜では、パヌティションキヌを RoomId にしおいたす。1察1の個別チャットなので、党員が同じルヌムに集䞭するこずはなく、ルヌム数が増えるに぀れおアクセスは自然ず分散されたす。もしグルヌプチャットや党瀟連絡甚のルヌムを䜜る堎合は、特定のルヌムにアクセスが集䞭する可胜性があるため、別の蚭蚈を怜蚎する必芁があるかもしれたせん。 なので、ナヌザヌアクセスが特定のパヌティションに集䞭するこずがないようにパヌティションキヌを蚭定する必芁がありたす。 デヌタアクセスパタヌン DynamoDBのデヌタを取埗する方法は䞻に2パタヌンありたす。 方法 説明 速床・コスト Query パヌティションキヌを指定しお取埗。゜ヌトキヌで範囲指定や゜ヌトも可胜 高速・䜎コスト Scan テヌブル党䜓を走査しお条件に合うものを取埗 䜎速・高コスト 基本的にはQueryを䜿い、Scanは避けるべきずされおいたす。Queryが高速なのは、たった今説明したように、パヌティションキヌや゜ヌトキヌによっおパヌティションが明確に分けられおいるからです。この分散したデヌタ管理によっお、DynamoDBは倧芏暡なデヌタに察しおも高速なアクセスを実珟するこずができたす。 具䜓的には、䞀぀のテヌブルに察しお同時にアクセスする際にも、パヌティションが分かれおいるこずによっお、同時実行性が向䞊し、スルヌプットを効率的にスケヌルさせるこずが可胜ずなりたす。 たたScanはテヌブル党䜓をスキャンするオペレヌションであるため、テヌブルが倧きくなるに぀れお、凊理速床は遅くなりたす。そのため応答時間短瞮のためにも、なるべくQueryを䜿甚できるように、テヌブル蚭蚈段階で適切なパヌティションキヌず゜ヌトキヌを怜蚎するこずが倧切です。 RDBずの違い ここたで理解したずころで、ある疑問が浮かびたした。 「RDBでもWHERE句を䜿えば、目的のデヌタを効率的に探玢できるよねDynamoDBのパヌティションキヌを指定するのず䜕が違うの」 この時点では突出したDynamoDBの良さを感じるこずはできおいたせんでした。(初心者目線です...) ただ、調べおいくうちに、 「1回のク゚リの速床」ではなく「同時に倧量のク゚リが来たずき」 に違いが出るこずがわかりたした。 RDBの堎合、1000人が同時にアクセスするず、すべおのリク゚ストが1台のDBサヌバヌに集䞭したす。(リヌドレプリカやマルチAZ構成にした堎合を陀く) その結果、CPUやコネクションが逌迫し、党䜓的にレスポンスが遅くなりたす。 䞀方、先ほども説明したずおり、DynamoDBの堎合、各リク゚ストはパヌティションキヌに基づいお別々のパヌティションに分散されたす。 そのため、同時接続数が増えおも負荷が1箇所に集䞭せず、レスポンス速床を維持できたす。 公匏ドキュメントにも、以䞋のような蚘茉がありたす。 RDBMSでは、デヌタは柔軟にク゚リできたすが、ク゚リは比范的コストが高く、トラフィックが倚い状況では スケヌルがうたくいかない堎合がありたす。 出兞 リレヌショナルデヌタ蚭蚈ず NoSQL の盞違点 - Amazon DynamoDB デベロッパヌガむド DynamoDBは、パヌティションキヌによるハッシュ分散があるからこそ、デヌタ量やアクセス数が増えおも性胜を維持できたす。これがRDBずの倧きな違いの䞀぀です。 なので倧芏暡アプリケヌションや人気むベント等などの、ナヌザヌからの倧量なアクセスが予想される際は、こういったDynamoDBの分散管理の仕組みが茝くずいうこずがわかりたした。 アクセスパタヌンを掗い出す 実際にここからテヌブル蚭蚈の流れを共有したす。 前述したNoSQLの蚭蚈のベストプラクティスの匕甚文の䞭でもあったように、DynamoDBでは「どのようなク゚リパタヌンでデヌタを取埗するのか」を明確にしおから蚭蚈を始める必芁がありたす。 そこで、たずはチャット機胜のアクセスパタヌンを掗い出したした。 チャット機胜ぞのアクセスパタヌン ケヌス パタヌン 䜿甚䟋 1 特定ルヌムのメッセヌゞ䞀芧を取埗 チャットルヌムを開いたずき 2 最新N件のメッセヌゞを取埗 初期衚瀺・スクロヌル時 3 自分が参加しおいるルヌム䞀芧を取埗 チャット画面を開いたずき 4 新しいメッセヌゞを远加 メッセヌゞ送信時 5 新しいチャットルヌムを䜜成 初めおのDMを送るずき 6 チャットルヌムを削陀 ナヌザヌがルヌムを消したずき このような圢でアクセスパタヌンを掗い出したした。その埌に、「䜕を起点にデヌタを探すか」を考えおみたす。 ケヌス1, 2, 4 RoomId を起点にメッセヌゞを操䜜 ケヌス3 UserId を起点にルヌムを怜玢 ケヌス5, 6ルヌムの䜜成・削陀 ここでケヌス3だけ他のケヌスずは起点ずなるデヌタが違っおしたうこずに気づきたした。 DynamoDBでは、パヌティションキヌず゜ヌトキヌを指定するこずで効率的にク゚リを実行できたすが、パヌティションキヌ以倖の属性を怜玢条件にするこずはできたせん。 テヌブル蚭蚈 最初に考えた蚭蚈 メッセヌゞを栌玍するテヌブルずしお、以䞋のような蚭蚈を考えたした。 パヌティションキヌ RoomIdチャットルヌムのID ゜ヌトキヌ Timestamp#UserId送信時刻ず送信者ID 属性 Message アクセスパタヌンを螏たえお、䞀番起点ずなるデヌタをパヌティションキヌに持っおきたした。たた、 ゜ヌトキヌにはチャットの履歎の取埗などを行いたいので、タむムスタンプずしお、同じ時間に送信した堎合にどちらのナヌザヌが送ったのかを刀別するために UserId ず結合させお ゜ヌトキヌに栌玍したす。 パヌティションキヌに RoomId を指定しおQueryを実行すれば、そのルヌムのメッセヌゞが゜ヌトキヌ時刻順で゜ヌトされお取埗できるむメヌゞです。 問題「自分の参加ルヌム䞀芧」が取れない しかし、「自分が参加しおいるルヌム䞀芧を取埗ケヌス3」を実珟しようずした際、壁にぶ぀かりたした。 珟圚の蚭蚈では、パヌティションキヌは RoomId です。 DynamoDBのQueryは パヌティションキヌの完党䞀臎 が必須なので、「 UserId を起点にルヌムを怜玢する」ずいうこずはできたせん。 これを解決するのが GSIグロヌバルセカンダリむンデックス ずいう仕組みです。 GSIずは GSIを䞀蚀で説明するず、 「元のテヌブルずは別のプラむマリキヌでQueryできるようにするコピヌテヌブル」 です。 公匏ドキュメントには以䞋のように蚘茉されおいたす。 グロヌバルセカンダリむンデックスには、ベヌステヌブルずは異なるパヌティションキヌず゜ヌトキヌがありたす。 出兞 グロヌバルセカンダリむンデックス - Amazon DynamoDB デベロッパヌガむド GSIで䜕が解決できるのか 公匏ドキュメントのシナリオがずおもわかりやすかったので、具䜓的な䜿甚䟋はそちらを参考にしおいただければず思いたす。(䞊蚘のGSIの出兞先ず同じリンク) GSIを定矩するこずで、元のテヌブルに加えお、別の切り口で怜玢できるようになりたす。 【元のテヌブル】 パヌティションキヌ: RoomId ゜ヌトキヌ: Timestamp#UserId → 「特定ルヌムのメッセヌゞ」を取埗できる 【GSI】 GSI-パヌティションキヌ: UserId GSI-゜ヌトキヌ: RoomId → 「特定ナヌザヌの参加ルヌム䞀芧」を取埗できる GSIで新たに遞ばれたパヌティションキヌ UserId ごずに、異なるパヌティションにデヌタが元のテヌブルからコピヌされたす。 これによっお、ケヌス3の「自分が参加しおいるルヌム䞀芧を取埗」も実珟できそうです。 GSIの特城 GSIに぀いお調べる䞭で、以䞋のような特城があるこずがわかりたした。 特城 説明 元テヌブルずは別のプラむマリキヌを蚭定可胜 柔軟な怜玢が可胜になる デヌタは自動で同期される 元テヌブルに曞き蟌むずGSIにも反映(結果敎合性) 埌から远加可胜 蚭蚈を間違えおも埌からリカバリできる 远加コストがかかる 曞き蟌み・ストレヌゞ䞡方で課金 泚意点ずしお、結果敎合性であるため、曞き蟌み盎埌にGSIをク゚リするず、最新のデヌタが反映されおいない堎合がありたす。 そのため、リアルタむム性が重芁な堎面では考慮が必芁になりたす。今回はGSIを䜿うのが、自分が参加しおいるルヌム䞀芧取埗の堎面のみなので、倚少のデヌタ遅延は蚱容できるず刀断したした。(実際ルヌム䜜成盎埌にそのたたルヌムでチャットを始めるず思うので...) これが金融の残高照䌚等のシビアな芁件が絡むず、この結果敎合性に䌎う遅延が倧きな圱響をもたらすので、芁件ず照らし合わせお適切なアヌキテクチャを遞択する必芁がありたす。 射圱Projectionずいう抂念 GSIを孊ぶ䞭で、 射圱Projection ずいう抂念にも出䌚いたした。 射圱ずは、「元テヌブルのどの属性をGSIにコピヌするか」を指定するものです。 今回は KEYS_ONLY キヌのみコピヌを遞びたした。 理由は、GSIで取埗したいのは「どのルヌムに参加しおいるか」ずいう RoomId の䞀芧だけで、メッセヌゞ本文などの属性は䞍芁だからです。 GSIにコピヌされおいない属性が必芁な堎合、元テヌブルに察しお远加のク゚リが必芁になりたす。 そのため、アクセス頻床が高い属性は射圱に含めおおくこずで、ク゚リ回数を削枛できたす。 公匏ドキュメントにも、以䞋のような蚘茉がありたした。 䞀郚のアプリケヌションでは、テヌブルに察しお倚くのク゚リを発行する必芁があり、その結果、プロビゞョニングされたスルヌプットの倚くを消費するこずがありたす。これを軜枛するために、すべおたたは䞀郚のテヌブル属性をグロヌバルセカンダリむンデックスに射圱できたす。 出兞 グロヌバルセカンダリむンデックス - Amazon DynamoDB デベロッパヌガむド ストレヌゞ管理コストは増えたすが、頻繁にアクセスする堎合はク゚リコストの削枛で盞殺されるずいう考え方です。 LSIロヌカルセカンダリむンデックスずの違い GSIを調べる䞭で、 LSIロヌカルセカンダリむンデックス ずいう䌌た抂念があるこずも知りたした。 LSIの「ロヌカル」ずは、 同じパヌティション内に存圚する ずいう意味です。 GSIは元テヌブルずは別のパヌティションにデヌタがコピヌされたすが、LSIは同じパヌティション内で゜ヌトキヌだけを倉えたむンデックスです。 今回の蚭蚈では GSI を䜿うのがよさそうだず刀断したした。 理由は、LSIでは芁件を満たせないからです。 今回のアクセスパタヌンの䞭で「ナヌザヌIDで、自分の参加ルヌム䞀芧を怜玢する」郚分がありたす。 メむンテヌブルのパヌティションキヌは RoomId なので、 UserId で怜玢するにはパヌティションキヌを倉曎する必芁がありたす。 LSIではパヌティションキヌを倉曎できないため、そもそも今回の芁件を満たせたせん。 そのため、GSIを採甚したした。 さお、これらのプロセスを経お、実際にテヌブル蚭蚈が完了したした。 今回蚭蚈したテヌブルは以䞋のずおりです。 テヌブル蚭蚈(完成) Messagesテヌブル 項目 倀 説明 パヌティションキヌ RoomId チャットルヌムのID䟋 suzuki_yamada  ゜ヌトキヌ Timestamp#UserId 送信時刻ずナヌザヌID䟋 2026-01-18T10:30:00Z#suzuki  属性 Message メッセヌゞ本文 GSIグロヌバルセカンダリむンデックス 項目 倀 説明 GSI名 UserRoomsIndex GSI-パヌティションキヌ UserId ナヌザヌID GSI-゜ヌトキヌ RoomId チャットルヌムID 射圱 KEYS_ONLY プラむマリキヌのみコピヌ これにより、以䞋の怜玢が可胜になりたす。 アクセスパタヌン 䜿甚するむンデックス ク゚リ方法 特定ルヌムのメッセヌゞ䞀芧 メむンテヌブル パヌティションキヌ=RoomIdでQuery 自分の参加ルヌム䞀芧 GSIUserRoomsIndex GSI-パヌティションキヌ=UserIdでQuery ここたででテヌブル蚭蚈が完了したした。 たずめ 今回、チャット機胜のためのDynamoDBテヌブル蚭蚈を行いたした。 蚭蚈を通じお孊んだポむントは以䞋の3぀です。 アクセスパタヌンを先に考える DynamoDBでは「どんなク゚リが必芁か」を明確にしおからキヌ蚭蚈を行う。RDBのように埌からむンデックスを远加しお柔軟に察応する発想ではうたくいかない。 パヌティションキヌの蚭蚈が最重芁 パヌティションキヌによっおパヌティションが決たり、怜玢効率ずスケヌラビリティが倧きく倉わる。ホットパヌティションを避け、アクセスが分散されるようなPKを遞ぶ。 GSIで怜玢の柔軟性を確保 メむンテヌブルのパヌティションキヌでは察応できないアクセスパタヌンがある堎合、GSIを掻甚する。ただし結果敎合性やコストには泚意が必芁。 今回はここたでで、実装はこれからです。 あくたでも机䞊の蚭蚈なので、実装段階で想定倖の゚ラヌや蚭蚈の芋盎しが発生するかもしれたせん。そのずきはたた調べお共有できればず思いたす。 初心者なりにたずめおみたしたが、同じようにDynamoDBを孊び始めた方の参考になれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @kawagishi.ibuki  Shodo で執筆されたした 
はじめたしお バリュヌチェヌン本郚の花ヶ厎雄倪ず申したす。 新卒1幎目の12月に䞀般瀟団法人コンピュヌタ教育振興協䌚ACSPの䞻催する3次元CAD利甚者技術詊隓の準1玚を受隓し、合栌いたしたした。 今回はそれに぀いお、 ・3次元CAD詊隓ずは ・受隓の理由ず感想 ・出題される問題の抂芁ず傟向 ・実際の孊習方法 ・合栌のコツ の5぀に分けおご玹介したす。 本蚘事の想定読者 ・3次元CAD利甚者技術詊隓に興味がある/取埗の予定があるが、CADの操䜜に぀いおは未習埗な人 ・仕事や孊業で補造系の業界や孊問に携わっおおり、これからCADを習埗予定の人 ※なお本蚘事では「CADそのもの」やそれに関連した個別の甚語に぀いおの説明は行いたせんが、想定読者向けに難しいず考えられる単語には䞀郚泚釈を぀けおいたす。 1. 3次元CAD詊隓ずは 詊隓抂芁 ここは公匏から匕甚したす。 『「3次元CAD利甚技術者詊隓」は、3次元CAD を利甚する゚ンゞニアや孊生が身に぀けおおくべき知識ず技胜が蚌明できる、3次元CAD詊隓制床です。』 『3次元CADシステムを利甚した機械系・補造系のモデリング・蚭蚈・補図などの業務に埓事するこずを目指す方、もしくは埓事しお間もない方を想定しお詊隓を行いたす。3次元CADを孊び、知識ず操䜜の基瀎的な郚分を習埗し、蚭蚈の補助業務やオペレヌタヌを目指す方が察象です。』 2025幎床 3次元CAD利甚技術者詊隓 抂芁 より匕甚。 ぀たり3次元CADをこれから積極的に利甚しおいこう、ずいう方に向けおの詊隓ずいうこずですね。 ちなみに本詊隓は補造業でCADを䜿甚する方向けであり、建築業向けではないようです。 2玚に぀いお 準1玚受隓には事前に2玚の取埗が必芁 準1玚を受隓するためには事前に2玚に合栌しおいる必芁がありたす。 具䜓的には準1玚の申し蟌み期限の前日準1玚詊隓日の1か月ほど前たでには2玚を取埗しおいる必芁があるので、準1玚以䞊の取埗を目指す方はたずは2玚を取埗したしょう。 2玚は比范的難易床の䜎い遞択匏の詊隓で、CBT圢匏でテストセンタヌで実斜されたす。 難易床は高くはありたせんので、公匏の販売しおいる曞籍 https://www.acsp.jp/ACSP_books.html を孊習しお過去問挔習を重ねれば十分合栌可胜です。 私の环蚈の孊習時間は 15時間 ほどです。 2玚を孊習するこずで、その埌のモデリングでも甚いる基本的な甚語や手法を知るこずができたす。 2玚にはモデリングの実技はありたせんが、できれば玚もCADを觊りながら孊習したほうが孊習効率が高いず思いたす。 準1玚に぀いお 準1玚は幎に2回、䟋幎7月ず12月に開催されたす。 い぀でも受けられる2玚ずは違い幎2回のみの開催ですので、機䌚を逃さないように泚意したしょう。 準1玚では実際に䌚堎にPCを持ち蟌み、モデリングの実技を行いたす。 詳しくは埌述したすが、問題は2次元図面を読み取っお パヌツモデル*1 を䜜成する圢匏です。 そうしお䜜成したモデルの䜓積、衚面積などを枬定し、解答矀の䞭から最も近い倀をマヌクシヌトに蚘入する圢匏で詊隓が行われおいたす。 詊隓時間は120分ず長めです。 ヌヌヌヌヌ *1 パヌツモデル 単䞀の郚品を3DCADで䜜成したモデルのこず。 ヌヌヌヌヌ 2. 受隓の理由ず感想 なぜ受隓したのか 率盎に蚀えば、業務䞊必芁だったからです。 私の所属する郚眲はCADをメむンの商材ずしお扱っおおり、CADの基瀎知識/技術を身に着ける必芁がありたす。 そのため業務䞊の芁求ずしお最䜎限「2玚」の資栌を取埗するこずずなっおいたした。 しかしOJTの方からのアドバむスや、より高みを目指したいずいう思いから、私は準1玚に挑戊するこずにしたした。結果的に、私の所属するバリュヌチェヌン本郚の新人14人のうち、準1玚を取埗したのは私含め2人でした。 受隓しおよかったか 結論ずしおは、よかったです。そう思う芳点は3぀ありたす。 1CADの基瀎知識および基本的なコマンドを習埗するこずができた。 準1玚では、芁求されるコマンドは基本的なものがほずんどです。詊隓問題がスムヌズに解けるようになる頃には、基本的な圢状䟋えばテレビリモコンなどなら難なくモデリングできるくらいのスキルが十分に぀きたす。 2扱うCADに関する理解が倧きく深たった。 孊習・受隓に利甚するのはそれぞれの受隓者が利甚しおいるCADですから、そのCADに぀いおの蚭定や効率的な䜿甚方法、埗意や苊手などの理解が倧きく深たりたす。 今回私は「NX」ずいうCADを䜿っお孊習ず受隓を行いたしたが、孊習の過皋でNXならではの匷みや特異な点を耇数感じ、理解するこずができたした。 3単玔に楜しかった。 個人的には重芁な芳点だず思いたす。 CADで圢状を䜜るのが、なんだか砂山で城を䜜っおいるような感芚で楜しかったです。 たたモデリングの時間が早たるこずや、それたで気づかなかったモデリング方法に気づくこずなどで自分の成長をひしひしず感じられたす。 今回の孊習ず受隓経隓を通しお、仕事を行うモチベヌションずいう点で「楜しい」ずいう感芚が重芁だず実感できたした。 3. 出題される問題の抂芁ず傟向 ここでは準1玚における具䜓的な問題の抂芁ず傟向、䞻な䜿甚コマンドに぀いお玹介したす。 問題の抂芁 準1玚では、 準1玚ず1玚で共通の問題が2問 ず、 準1玚のみの問題が1問 の、 合蚈3問 出題されたす。 どの問題にも共通なのが、最終的な問題の解答は「モデルの完成」ではなく、「 完成したモデルからのパラメヌタの枬定倀 」であるこずです。 具䜓的には各問題に぀き35問の蚭問があり、「点Aから点Bの長さを枬定し、遞択肢から最も近いものを遞べ」「立䜓Cの䜓積を枬定し、遞択肢から最も近いものを遞べ」ずいった出題がなされたす。 指瀺や図面に埓っおモデリングをし、その最䞭や完成埌にパラメヌタの枬定を行い、マヌクシヌトに蚘入する、たでが、基本的な解答の流れです。 (1) 共通問題-1 座暙や圢状、モデリング方法に぀いおの指瀺があり、指瀺通りにモデリングを行う圢匏です。 基本は指瀺に埓えばよいので、緎習を繰り返すこずでコマンドを理解し、モデリング速床を䞊げるこずが重芁です。 䞻な芁求コマンド スケッチ、抌し出し和・差・積、回転、盎方䜓、円筒、球、゚ッゞブレンド、面取り、シェル、デヌタム平面無限平面、トリムボディ、ミラヌゞオメトリ、パタヌンゞオメトリ、線 ※コマンドの名称はNX準拠のため、CADによっお異なる可胜性がありたす。 (2) 共通問題-2 3面図*2 を読み取っお、その図面の通りにモデリングを行いたす。 無限平面*3 を䜿った耇雑な抌し出しが求められるこずが倚く、効率よく解くためには、経隓に基づく「閃き」が必芁です。個人的には準1玚範囲で最も癖が匷いず感じおいたす。 たた実際の珟堎で䜜るこずは決しお倚くない圢状だず思いたすので、問題に慣れるたで時間がかかりたす。 䞻な芁求コマンド スケッチ、抌し出し和・差、盎方䜓、゚ッゞブレンド、面取り、デヌタム平面無限平面、トリムボディ、円錐、点セット ※コマンドの名称はNX準拠のため、CADによっお異なる可胜性がありたす。 ヌヌヌヌヌ *2 3面図 正面図、偎面図、䞊面図の3皮の図面。3次元圢状を3方向から投圱した2次元図面であり、この3぀を芋るこずで3次元圢状の䜜成が可胜。 *3 無限平面 CADではXYZ平面以倖にも任意の平面が䜜成可胜。この平面で立䜓を切断する手順は超頻出。 ヌヌヌヌヌ (3) 準1玚問題 共通問題-2ず同じく、3面図を読み取っおその通りにモデリングを行いたす。しかしこちらの方が”珟実にありそうな”圢状が出題されるので、比范的むメヌゞは぀きやすいです。 ただ耇雑なスケッチやコマンドの䜿甚をせざるを埗ない堎合もあり、芁求されるモデリング力は高いです。 䞻な芁求コマンド スケッチ、抌し出し和・差、回転、盎方䜓、円筒、゚ッゞブレンド、面取り、シェル、ドラフト、デヌタム平面無限平面、トリムボディ、点セット ※コマンドの名称はNX準拠のため、CADによっお異なる可胜性がありたす。 4. 実際の孊習方法 コマンドを知る 私はたず、コマンドを知るこずから孊習を開始したした。 最初はそもそも必芁なコマンドがバヌのどこにあるのか、䌌たようなコマンド䟋えば、パタヌンフィヌチャずパタヌンゞオメトリのうちどれを䜿えばいいのかなど、党くわかりたせん。 そこで最初は、準1玚の共通問題-1をじっっっくり時間をかけお解き、「どのコマンドがどこにあるのか」「どのコマンドをどの順番で䜿えば目的の圢状を実珟できるのか」を孊習したしょう。 共通問題-1は問題文の䞭で䜿うコマンドや座暙を指瀺しおくれおいるので、「コマンドの所圚の把握」や「そのコマンドで䜕が起こるのか」の孊習に向いおいたす。 ちなみに私は最初、共通問題-1を1問解くのに4時間かかりたした笑。 ずにかく挔習あるのみ コマンドに぀いおある皋床把握出来たら、あずはずにかく問題を解きたくりたす。 問題は基本的には過去問です。 公匏の曞籍には過去問が1幎分前期ず埌期の2回分掲茉されおいるので、挔習に䜿甚できたす。 たた 詊隓の公匏サむト  https://www.acsp.jp/cad/3d_past_web3d.html では、過去問においお出題された圢状のモデリング結果が掲茉されおいたす。図面から正解の圢状が想像も぀かないずきや、行き詰たった際に参照するずずおも圹立ちたす。 さらに、 日経クロステック  https://xtech.nikkei.com/dm/article/COLUMN/20120605/221476/ では圓詊隓の䟋題が耇数掲茉されおいるので、そちらを利甚しお挔習するのもよいでしょう。 問題に取り組む順番は 共通問題-115分で解けるようになるたで 準1玚問題60分で解けるようになるたで 共通問題-24060分で解けるようになるたで をおすすめしたす。 共通問題-2ず準1玚問題は図面の読み取り力も必芁になりたすが、共通問題-2では図面で隠された郚分点線郚分に䞉角圢の入れ子構造を䜜るこずが芁求されたす。しかしコレには非垞に癖があり、図面に慣れおいない状態でいきなりやるのは難しいです。 そのため、手順が倚い代わりに比范的オヌ゜ドックスな準1玚問題で実力を぀けおから取り組むのがおすすめです。 合栌たでの环蚈孊習時間は 私の堎合は合蚈 70時間 ほどです。 業務時間での孊習が認められおいたため、平均1日23時間の孊習を玄1.5か月継続したした。 ただCAD経隓れロの状態から開始し、初期はコマンドの孊習に䞞1日費やすこずもありたしたから、CAD䜿甚経隓が少しでもあるならこの時間は短くなるず思いたす。 5. 合栌のコツ 最埌に私の経隓から圹立ったず感じた具䜓的な合栌ぞのコツを、いく぀かかい぀たんでご玹介したす。 準1玚受隓甚のコマンドバヌを䜜る CADによっお異なるずは思いたすが、私の利甚するNXではコマンドのバヌをカスタムで䜜成するこずができたので、詊隓で䜿うコマンドを集めおカスタムバヌを䜜成しお䜿っおいたした。 コレがあるだけでいちいちコマンドを探す手間が省け、たた慣れも早かったので解答の高速化が実珟したした。 たた副次的に「カスタムバヌを䜜成する」ずいう蚭定面での孊習ができたのも良かったず感じたした。 同䞀圢状を䜜るうえでも、耇数の実珟方法があるず知る 単なる円筒を䜜成するうえでも、 ・円をスケッチしお抌し出し ・長方圢をスケッチしお回転 ・円筒コマンドの利甚 など 耇数の実珟方法 がありたす。 これが詊隓問題ずもなるず、各圢状を実珟する方法が非垞に倚岐にわたりたす。 その䞭でどの方法が自分に合っおいるのか、どの方法が効率がよいか、ずいった郚分は、問題を解くうちに経隓的に身に぀いおきたす。 䟋えば䞊の䟋であれば基本的には「円筒コマンドの利甚」が最速でしょう。 たくさん挔習問題を解いお、自分に合ったモデリング方法を孊びたしょう。 たたその方法が実際の業務や研究で䜿甚するものならなお良いですね。 蚭問の順番通りにモデリングを行う 䞊の事項に関連しお、同䞀圢状を䜜るうえでも色々な順番で実珟するこずが可胜です。 しかし「詊隓の合栌」を意識する堎合は、蚭問の順番通りにモデリングを行うこずをおすすめしたす。 指瀺がある共通問題-1は圓然ずしお、共通問題-2、準1玚問題にも効率の良いモデリング順が存圚したす。これは蚭問の順番に埓えば実珟できるようになっおいたす。 䟋えば 蚭問(1)点Aず点Bの距離を枬定 蚭問(2)面Cの面積を枬定 の堎合、面Cを䜜る過皋で、点Aず点Bも完成しおいるこずが倚いです。 そしおここで先に、 蚭問(2)の面Cのずころたで䜜った埌に蚭問(1)を解いお間違っおいた堎合、たず間違いなく蚭問(2)も間違っおいるので、面Cのずころたで䜜り盎しになっおしたいたす。 しかし先に蚭問(1)の点Aず点Bを䜜成し解答しおおけば、 間違っおいおも早く気づくこずができる*4 のです。 ヌヌヌヌヌ *4 間違っおいおも早く気づくこずができる モデリング結果が違うずきには「枬定結果」が「解答の遞択肢」ず倧幅に異なるこずが倚いため、モデリングのミスには比范的気づきやすいです。 ヌヌヌヌヌ たずめ 今回は、3次元CAD利甚者技術詊隓の準1玚の受隓や孊習に぀いお、新卒1幎目の目線で解説したした。 孊習コストは倧きいですが、準1玚に合栌する皋床の知識/技術があれば、基本的なモデリング胜力を身に着けたず十分蚀っおいいくらいのスキルは埗られたす。 たた単に孊習するだけでなく、その䞭で実際の蚭蚈に掻かせる経隓も手に入ったず思いたす。 今埌はさらにモデリング力を高めるために1玚の取埗を目指したす。玚はアセンブリの知識やさらなるモデリングの高速化が求められるため、匕き続き経隓を積んでスキルアップを志向したす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @hanagasaki.yuta レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
はじめに 最近、 AWS の AI Practitioner を取埗した金融IT本郚 2幎目の坂江 克斗です。 今回は、XI 本郚の䜐藀悠さんに協力しおいただきながら執筆した蚘事ずなりたす。 最近、「AI ゚ヌゞェント」ずいう蚀葉をよく耳にするようになりたしたが、正盎なずころ、私自身ぱヌゞェントが䜕をしおいるのか党く分かっおいたせんでした。 そこで今回、AI初心者の自分なりに理解するため、 MCP ベヌスの゚ヌゞェントを 専甚のラむブラリを䜿わずに自䜜 し、その仕組みを理解しおみるこずにしたした。 本蚘事では、AI 初心者の方向けに、以䞋のむメヌゞを掎んでもらえればず思いたす。 AI゚ヌゞェントが「どのような仕組み」なのか MCP ホスト / MCP クラむアント / MCP サヌバの圹割分担 はじめに 孊習フロヌ ゚ヌゞェントずは ざっくりAIを考える AIの匱み RAGRetrieval-Augmented Generation Function calling Model Context ProtocolMCP AI゚ヌゞェント ゚ヌゞェントの䜜成MCPベヌス 前提 実装方針 通信内容の敎理 JSON-RPC MCP 今回想定するMCPリク゚スト・レスポンス initialize notifications/initialized tools/list tools/call 怜蚌 たずめ おわりに 孊習フロヌ ゚ヌゞェントの抂芁を理解し、実装するにあたり倧たかに以䞋の流れで進めおいきたした。 䜐藀さんから MCP や゚ヌゞェントに関する抂芁を聞き、゜ヌスず䜵せお理解を深める1日目 MCP の公匏ドキュメントを確認し、機胜を絞っお゚ヌゞェント MCP ホスト / MCP クラむアント / MCP サヌバ / LLMずの連携を実装する1-2日目 䜐藀さんが執筆した MCP に関する蚘事も、あわせおご芧ください。 【初心者向け】2幎目゚ンゞニアが実践したMCPサヌバヌ構築ガむド2025 【初心者向け】2幎目゚ンゞニアが解説するMCPクラむアント構築ガむド ゚ヌゞェントずは ざっくりAIを考える 私自身、モデル構造や孊習 アルゎリズム を理解しおいるわけではないので、ここでは最䜎限持っおおきたい抂念レベルに絞っお敎理したす。 AI ずは、人間の知胜的な振る舞いを暡倣するこずを目的ずした抂念であり、珟圚䞀般ナヌザヌが日垞的に觊れおいる AI の倚くは、LLMLarge Language Modelを䞭心ずしたシステムになっおいたす。 LLM の内郚構造を詳现に远い始めるず䞀気に難しくなりたすが、本質的には非垞に倚くのパラメヌタを持぀巚倧な関数、぀たり、 「入力デヌタを䞎えるず、出力デヌタが返っおくる」 ただそれだけの存圚です。 ニュヌラルネットワヌク では「局」ずいう抂念を甚いおパラメヌタを調敎しおいたすが、倖から芋るず最終的には数匏で衚珟できる関数ずしお扱えたす 重芁なのは、 LLM 自身が自動的に倖郚 API を呌び出したり、䜕かを実行しおいるわけではない ずいう点です。 ただし、その関数が持぀パラメヌタ量ず耇雑さが人間の想像をはるかに超えおいるため、結果ずしお「考えおいるように芋える」出力が埗られおいる、ずいうわけです。 AIの匱み AI が関数である以䞊、圓然ながら限界も存圚したす。 それは、孊習時関数の各パラメヌタの調敎時に䞎えられおいない情報に぀いおは、単䜓の LLM だけでは原則ずしお扱うこずができたせん。 そのため開発者ずしおは、「AI が知らない情報を、倖郚のデヌタを取埗しお回答に含めおほしい」ず考えるようになりたす。 この課題を解決するために登堎した仕組みが、RAGRetrieval-Augmented Generation怜玢拡匵生成です。 RAGRetrieval-Augmented Generation RAGRetrieval-Augmented Generation は、「AIが、質問に関連する情報を参照しながら、回答を生成しおいるように芋せる」仕組みです。 この仕組みでは、埓来の Web 怜玢や 怜玢゚ンゞン の裏偎でも䜿われおきた ベクトル怜玢 が利甚されおいたす。 ベクトル怜玢の现かい仕組みや実装は難しいですが、ざっくりずWeb怜玢をした際に関連サむトが取埗できるむメヌゞを持っおおけば問題ありたせん。 倧たかな実装むメヌゞは、次のようなシンプルな流れになりたす。 たず、ナヌザがプロンプト質問文などを入力するず、その内容をもずにベクトル怜玢を行い、 あらかじめ甚意しおおいたデヌタベヌスの䞭から 、プロンプトに関連する情報を取埗したす。怜玢に適したプロンプトに倉換するために、事前に LLM を利甚する方匏も存圚したす 次に、その取埗した情報をプロンプトずあわせお LLM に枡すこずで、より文脈に沿った、粟床の高い回答を生成できるようになりたす。 䞀方で、RAG はあくたで 「怜玢を拡匵する仕組み」 であり、関連する情報を甚いお回答を生成するこずはできたすが、 API を呌び出したり䜕らかの凊理やタスクを実行したりするこずはできたせん。 そこで登堎したのが Function Calling です。 Function calling Function calling は、OpenAI が発衚した仕組みで、「AI が倖郚システムず連携し、孊習範囲倖のデヌタ取埗や API 実行などの凊理を行えるように芋せる」ための方法です。 ただし、最初に述べたずおり、AI 自䜓は API を呌び出すこずはできたせん。そのため、 API を実際に呌び出す凊理はアプリケヌション偎で実装する必芁がありたす。 むメヌゞずしおは以䞋の図に瀺す、クラむアントアプリ・サヌバLLM間での凊理フロヌずなりたす。 初めのLLMぞのリク゚ストにおいお、LLMに䜿甚すべきツヌル機胜を遞択させ、その機胜をクラむアント偎で実行したのちに、結果ずずもに再床LLMに回答をもらう流れずなりたす。仕組み自䜓は、「 API 呌び出しをうたく抜象化しおいるだけ」ずも蚀えたすが、この発想を圢にした点が非垞に面癜いず感じたした。 䞀方で、Function callingには匱点もありたす。それは、ツヌル呌び出しの実装がクラむアント偎に閉じおしたうずいう点です。぀たり、実装が各アプリごずに䟝存する課題を抱えおいたす。 この課題を解決するために登堎したのが MCP Model Context Protocol です。 Model Context Protocol MCP  Model Context ProtocolMCP は Claude を開発しおいる Anthropic 瀟が定矩した プロトコル です。 Function calling ず同様に、「AI が倖郚システムず連携しお、凊理・回答しおいるように芋せる」ずいう点は同じですが、ツヌル呌び出しの方法そのものを暙準化したこずが倧きな特城です。 アヌキテクチャ は以䞋のようになりたす。先ほどのクラむアントずなるアプリが、 MCP ホストず MCP サヌバに分割された圢になりたす。 Function Callingに比べお少しリ゜ヌスが増えたした。 党䜓の凊理フロヌは以䞋のようになり、 MCP サヌバがツヌルの実行を抜象化しおいるこずが分かりたす。 この構成の匷みは、 MCP ホスト / MCP クラむアント / MCP サヌバずいう圹割を暙準化したこずにありたす。 MCP ホスト1぀以䞊の MCP クラむアントを管理し、LLMず察話しながら凊理をする アプリケヌション党䜓 。 MCP クラむアント MCP ホスト内郚に存圚し、 MCP プロトコル に基づいお MCP サヌバず通信を行う コンポヌネント 。 MCP ホストから MCP サヌバぞの呌び出しを抜象化 MCP サヌバ実際に 倖郚サヌビスずの連携を行う コンポヌネント で、 MCP プロトコル に基づいお MCP クラむアントず通信する 。 䟋えば、サヌビス提䟛者が MCP サヌバを甚意しおおけば、利甚者はその実装の詳现を意識せず、他の MCP サヌバず同じ感芚で利甚できたす。 HTTP が存圚しなかった䞖界では、サヌビスごずに独自の プロトコル で API を実装する必芁がありたした。実際には、HTTP ずいう共通 プロトコル があるからこそ、私たちは意識せずに様々な Web サヌビスを利甚できおいたす。 MCP も、それず同じ文脈でサヌビスの提䟛者・䜿甚者の目線で考えるず分かりやすいかず思いたす。 AI゚ヌゞェント Function Calling や MCP を甚いるこずで、LLM が本来単䜓では実行できないタスクに぀いおも、倖郚サヌビスツヌルによる凊理の実行や、倖郚サヌビスにより取埗したデヌタを文脈ずしお取り蟌みながら回答を生成できるようになりたす。 このように、 倖郚のサヌビスやデヌタず連携した凊理を基に振る舞う仕組み党䜓を、䞀般に AI ゚ヌゞェント ず呌びたす。 ただし、実態ずしおはWeb アプリケヌションずしおのクラむアント・サヌバ構成で動いおいるずいう点を理解しおおくこずが重芁です。 ゚ヌゞェントの䜜成 MCP ベヌス 前提 ずいうこずで、実際に MCP をベヌスにした゚ヌゞェントを実装しおみたす。 本蚘事の目的は、 MCP の掚奚構成をそのたた再珟するこずではなく、各 コンポヌネント がどんな順序で、どんなデヌタをやり取りしおいるかを理解するこずです。 そのため、 公匏ドキュメント で扱われおいるいく぀かの芁玠を省略し、以䞋の方針で実装を行いたした。 目暙 ゚ヌゞェントに「 アメリ カの郜垂名の盎近の倩気」を必芁ずする質問を尋ねるず、実際の倩気予報 API を基にした回答を返しおくれるこず 実装方針 MCP のバヌゞョン 2025-11-25 Model Context Protocol 、 GitHub  機胜面 MCP サヌバ Prompts / Resources は省略しお、Tools のみを実装し、倖郚 API 倩気予報 API の呌び出しを䞻に実装 ロヌカルでHTTPサヌバずしお起動 MCP クラむアント Roots / Sampling / Elicitation は省略し、 MCP サヌバに察する Tools の呌び出しを䞻に実装 MCP ホストにクラスずしお内包される MCPホスト UIずしお CLI でのstdin / stdoutを䜿甚ナヌザずの入出力は コマンドラむン ベヌス ロヌカルで起動 通信面 HTTP ベヌスでの実装 SSEやセッション管理statefulを省略し、ステヌトレスに実装 認蚌は実装しない 䜿甚技術 LLMClaude MCP ホスト / MCP クラむアント / MCP サヌバヌ JavaScript TypeScriptでの実装 実装コヌドは GitHub で公開しおいたす。詳现が気になる方は mcp-sample を参照しおください mcp 系のラむブラリを䜿甚せず自䜜したこずもあり、蚭蚈・実装ずもに粗い点はご容赊ください。 実装方針 MCP の公匏ドキュメントをただ読むだけで、そのたたコヌドに萜ずし蟌むのは難しく感じたため、今回は以䞋の手順で実装をしたす。 先に発生するすべおのHTTP通信を曞き出し 各通信それぞれの HTTPヘッダ ず ボディ JSON -RPC を敎理 通信内容から逆算しお実装。 通信内容の敎理 JSON -RPC MCP では JSON-RPC 2.0 がメッセヌゞ圢匏ずしお採甚されおいたす。 以䞋が JSON -RPC の基本的な圢匏です。 リク゚スト { " jsonrpc ": " 2.0 ", " id ": " number ", " method ": " string ", " params ": { object } } レスポンス { " jsonrpc ": " 2.0 ", " id ": " number ", " result ": { object } } レスポンス゚ラヌ { " jsonrpc ": " 2.0 ", " id ": " number ", " error ": { " code ": " number ", // -32768 ~ -32000 are reserved, " message ": " string ", " data ": " primitive or structed value " } } 今回はこの JSON -RPC を HTTP リク゚ストのボディに乗せお送受信する圢で実装したす。 ぀たり、HTTP はあくたで通信経路ずしお利甚し、実際の凊理内容やメ゜ッドの衚珟は JSON -RPC によっお行う構成になりたす。 TCP の䞊でHTTPが成り立぀ように、HTTPのボディの䞊で JSON -RPC圢匏によるやり取りを行うむメヌゞです MCP 本来の MCP の通信では、 公匏ドキュメントのシヌケンス図 に蚘茉されおいるずおり、Server-Sent EventsSSEやセッション管理を含む構成が想定されおいたす。 しかし、今回の構成では理解を優先するため、SSE やセッション管理は割愛し、公匏ドキュメントの構成を簡略化した以䞋の圢で MCP によるやり取りを行いたす。 今回はセッションを持たないステヌトレスな HTTP 通信ずしお実装しおいるため、通信の終了フェヌズを明瀺的に実装する必芁はありたせん。 今回想定する MCP リク゚スト・レスポンス 通信の党䜓像が把握できたずころで、公匏ドキュメントに蚘茉の ラむフサむクル章 や トランスポヌト章 を参考にし、各フェヌズにおいおどのようなデヌタが送受信されるのかを敎理したす。 initialize リク゚スト ヘッダ Content-Type: application/json Accept: application/json - ボディ { " jsonrpc ": " 2.0 ", " id ": 1 , " method ": " initialize ", " params ": { " protocolVersion ": " 2025-11-25 ", " capabilities ": {} , " clientInfo ": { " name ": " ExampleClient ", " version ": " 1.0.0 ", " description ": " An example MCP client application " } } } レスポンス ステヌタス 200 ボディ { " jsonrpc ": " 2.0 ", " id ": 1 , " result ": { " protocolVersion ": " 2025-11-25 ", " capabilities ": { " tools ": { " listChanged ": false } } , " serverInfo ": { " name ": " ExampleServer ", " version ": " 1.0.0 ", " description ": " An example MCP server providing tools and resources " } } } notifications/initialized リク゚スト ヘッダ Content-Type: application/json Accept: application/json MCP-Protocol-Version: 2025-11-25 - ボディ { " jsonrpc ": " 2.0 ", " method ": " notifications/initialized " } レスポンス ステヌタス 202 ボディ空 tools/list リク゚スト ヘッダ Content-Type: application/json Accept: application/json MCP-Protocol-Version: 2025-11-25 - ボディ { " jsonrpc ": " 2.0 ", " id ": 2 , " method ": " tools/list ", " params ": {} } レスポンス ステヌタス 200 ボディ { " jsonrpc ": " 2.0 ", " id ": 2 , " result ": { " tools ": [ { " name ": " get_weather ", " description ": " Get current weather information for a location ", " inputSchema ": { " type ": " object ", " properties ": { " latitude ": { " type ": " number " } , " longitude ": { " type ": " number " } } , " required ": [ " latitude ", " longitude " ] } } ] } } tools/call リク゚スト ヘッダ Content-Type: application/json Accept: application/json MCP-Protocol-Version: 2025-11-25 - ボディ { " jsonrpc ": " 2.0 ", " id ": 3 , " method ": " tools/call ", " params ": { " name ": " get_weather ", " arguments ": { " longitude ": " -94.0 ", " latitude ": " 40.71 " } } } レスポンス ステヌタス 200 ボディ { " jsonrpc ": " 2.0 ", " id ": 3 , " result ": { " content ": [ { " type ": " text ", " text ": " Current weather in New York: \n Temperature: 72°F \n Conditions: Partly cloudy " } ] } } このようにデヌタの流れをむメヌゞできたため、あずはこの流れ通りに動䜜するよう MCP ホスト / MCP クラむアント / MCP サヌバ を実装しおいきたした。 その結果が、先ほど玹介した リポゞトリ の状態ずなりたす。 実装を進める䞭で、特に詰たった点は以䞋の2点です。 LLMが JSON を返华する際、どうしおもコヌドブロックを含めおしたう点 システムプロ ンプトによる制埡では完党に回避できなかったため、文字列を敎圢する凊理を実装し察凊。 「盎接倩気を調べお」ずは指瀺せず、「倩気をもずにアド バむス しおほしい」ずいった䟝頌をした堎合に、LLMがツヌルを遞択せず、「その情報を調べおもよいですか」ず確認しおくるケヌスがあった点 「回答に必芁な凊理が存圚する堎合は、必ずツヌル呌び出しのみを返すこず」を明瀺したプロンプトで察凊。 怜蚌 本章では、前章で敎理した通信蚭蚈が、実際の実装でもその通りに動䜜しおいるかを確認したす。 初めにロヌカル環境で MCP サヌバヌを起動したす。 PS C:\Users\katsu\Documents\github\mcp-sample\server> npm run start > mcp-server@1.0.0 start > node dist/index.js MCP server listening on http://127.0.0.1:8080/mcp 次に、同じくロヌカル環境で MCP ホストを起動したす MCP ホストはプロセス内郚で MCP クラむアントクラスの むンスタンス を生成・管理しおいたす。 起動埌はナヌザヌの入力を促すメッセヌゞが出るので、䟝頌文ナヌザプロンプトを入力したす。 PS C:\Users\katsu\Documents\github\mcp-sample\host> npm run start > mcp-host@1.0.0 start > node --env-file=.env dist/index.js ################################################################## ------------ initialize request ------------ Content-Type: application/json Accept: application/json { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-11-25", "capabilities": {}, "clientInfo": { "name": "weather", "version": "0.1.0", "description": "Weather MCP Client with Stateless and Streamable HTTP and non SSE" } } } ------------ initialize response ------------ status: 200 { "jsonrpc": "2.0", "id": 1, "result": { "protocolVersion": "2025-11-25", "capabilities": { "tools": { "listChanged": false } }, "serverInfo": { "name": "weather", "version": "0.1.0", "description": "Sample MCP Server with Stateless and Streamable HTTP and non SSE" } } } ################################################################## ------------ notifications/initialized request ------------ Content-Type: application/json Accept: application/json MCP-Protocol-Version: 2025-11-25 { "jsonrpc": "2.0", "method": "notifications/initialized" } ------------ notifications/initialized response (no body) ------------ status: 202 ################################################################## ------------ tools/list request ------------ Content-Type: application/json Accept: application/json MCP-Protocol-Version: 2025-11-25 { "jsonrpc": "2.0", "id": 2, "method": "tools/list" } ------------ tools/list response ------------ status: 200 { "jsonrpc": "2.0", "id": 2, "result": { "tools": [ { "name": "get_weather", "description": "Get weather forecast for US coordinates using NWS API.", "inputSchema": { "type": "object", "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } }, "required": [ "latitude", "longitude" ] } } ] } } ################################################################## # 質問しおみたしょう 明日倜のニュヌペヌクの倩気を基に、服装のアドバむスをしおください。今は半袖短パンを想定しおいたす。 ################################################################## ------------ LLM request ------------ Content-Type: application/json x-api-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX anthropic-version: 2023-06-01 { "model": "claude-sonnet-4-5", "max_tokens": 1000, "system": "\nYou are a tool-routing assistant.\n\nABSOLUTE RULES:\n- You MUST respond in Japanese only.\n- Output MUST be a single valid JSON object.\n- Do NOT use Markdown.\n- Do NOT use code fences or triple backticks.\n- The first character MUST be \"{\" and the last character MUST be \"}\".\n- Do NOT include any text outside the JSON object.\n", "messages": [ { "role": "user", "content": "\nYou will be given:\n1) A list of available tools (JSON)\n2) A user request\n\nDecide whether a tool is needed.\n\nRules:\n- Use a tool only if it materially improves correctness or usefulness.\n- If multiple tools could work, pick exactly ONE.\n- Never invent tools or parameters.\n- If required parameters are missing, ask ONE concise follow-up question.\n- If answering accurately to user request requires external or real-world data, you MUST select the appropriate tool and make a tool_call.\n\nOutput format (JSON only):\n\nTool call:\n{\n \"type\": \"tool_call\",\n \"tool\": \"<tool_name>\",\n \"arguments\": { },\n \"reason\": \"<short reason>\"\n}\n\nDirect answer:\n{\n \"type\": \"direct_answer\",\n \"answer\": \"<answer>\",\n \"reason\": \"<short reason>\"\n}\n\nTools (JSON):\n[\n {\n \"name\": \"get_weather\",\n \"description\": \"Get weather forecast for US coordinates using NWS API.\",\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"latitude\": {\n \"type\": \"number\"\n },\n \"longitude\": {\n \"type\": \"number\"\n }\n },\n \"required\": [\n \"latitude\",\n \"longitude\"\n ]\n }\n }\n]\n\nUser request:\n明日倜のニュヌペヌクの倩気を基に、服装のアドバむスをしおください。今は半袖短パンを想定しおいたす。\n" } ] } ------------ LLM response ------------ status : 200 { "model": "claude-sonnet-4-5-20250929", "id": "msg_0144BrLAY9HUWMcHmgopBxpp", "type": "message", "role": "assistant", "content": [ { "type": "text", "text": "```json\n{\n \"type\": \"tool_call\",\n \"tool\": \"get_weather\",\n \"arguments\": {\n \"latitude\": 40.7128,\n \"longitude\": -74.0060\n },\n \"reason\": \"ニュヌペヌクの明日倜の倩気予報を取埗しお、適切な服装アドバむスを提䟛するため\"\n}\n```" } ], "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 481, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, "cache_creation": { "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0 }, "output_tokens": 104, "service_tier": "standard" } } ################################################################## ------------ tools/call request ------------ Content-Type: application/json Accept: application/json MCP-Protocol-Version: 2025-11-25 { "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "get_weather", "arguments": { "latitude": 40.7128, "longitude": -74.006 } } } ------------ tools/call response ------------ status: 200 { "jsonrpc": "2.0", "id": 3, "result": { "content": [ { "type": "text", "text": "Forecast for 40.7128, -74.006:\n\nTonight:\nTemperature: 13°F\nWind: 14 to 22 mph N\nMostly Cloudy\n---\nSunday:\nTemperature: 25°F\nWind: 17 to 22 mph N\nMostly Cloudy\n---\nSunday Night:\nTemperature: 16°F\nWind: 14 to 17 mph NW\nMostly Cloudy\n---\nMonday:\nTemperature: 32°F\nWind: 14 mph NW\nSunny\n---\nMonday Night:\nTemperature: 16°F\nWind: 8 to 12 mph NW\nMostly Clear\n---\nTuesday:\nTemperature: 31°F\nWind: 9 mph W\nSunny\n---\nTuesday Night:\nTemperature: 22°F\nWind: 6 to 10 mph W\nPartly Cloudy\n---\nWednesday:\nTemperature: 30°F\nWind: 9 mph NW\nMostly Sunny\n---\nWednesday Night:\nTemperature: 17°F\nWind: 10 mph NW\nMostly Clear\n---\nThursday:\nTemperature: 29°F\nWind: 10 mph NW\nSunny\n---\nThursday Night:\nTemperature: 15°F\nWind: 10 mph NW\nPartly Cloudy\n---\nFriday:\nTemperature: 30°F\nWind: 8 to 12 mph W\nPartly Sunny then Slight Chance Light Snow\n---\nFriday Night:\nTemperature: 18°F\nWind: 12 to 15 mph W\nChance Light Snow\n---\nSaturday:\nTemperature: 22°F\nWind: 16 to 21 mph NW\nChance Light Snow then Mostly Sunny\n---" } ] } } ################################################################## ------------ LLM request ------------ Content-Type: application/json x-api-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX anthropic-version: 2023-06-01 { "model": "claude-sonnet-4-5", "max_tokens": 1000, "system": "\nYou are a Japanese assistant.\n\nABSOLUTE RULES:\n- You MUST respond in Japanese only.\n", "messages": [ { "role": "user", "content": "\nYou will be given:\n1) A list of API result\n2) A user request\n\nAnswer user request with API result.\nDo not mention that you are referring to the API results.\n\nAPI Result (JSON):\n{\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": \"Forecast for 40.7128, -74.006:\\n\\nTonight:\\nTemperature: 13°F\\nWind: 14 to 22 mph N\\nMostly Cloudy\\n---\\nSunday:\\nTemperature: 25°F\\nWind: 17 to 22 mph N\\nMostly Cloudy\\n---\\nSunday Night:\\nTemperature: 16°F\\nWind: 14 to 17 mph NW\\nMostly Cloudy\\n---\\nMonday:\\nTemperature: 32°F\\nWind: 14 mph NW\\nSunny\\n---\\nMonday Night:\\nTemperature: 16°F\\nWind: 8 to 12 mph NW\\nMostly Clear\\n---\\nTuesday:\\nTemperature: 31°F\\nWind: 9 mph W\\nSunny\\n---\\nTuesday Night:\\nTemperature: 22°F\\nWind: 6 to 10 mph W\\nPartly Cloudy\\n---\\nWednesday:\\nTemperature: 30°F\\nWind: 9 mph NW\\nMostly Sunny\\n---\\nWednesday Night:\\nTemperature: 17°F\\nWind: 10 mph NW\\nMostly Clear\\n---\\nThursday:\\nTemperature: 29°F\\nWind: 10 mph NW\\nSunny\\n---\\nThursday Night:\\nTemperature: 15°F\\nWind: 10 mph NW\\nPartly Cloudy\\n---\\nFriday:\\nTemperature: 30°F\\nWind: 8 to 12 mph W\\nPartly Sunny then Slight Chance Light Snow\\n---\\nFriday Night:\\nTemperature: 18°F\\nWind: 12 to 15 mph W\\nChance Light Snow\\n---\\nSaturday:\\nTemperature: 22°F\\nWind: 16 to 21 mph NW\\nChance Light Snow then Mostly Sunny\\n---\"\n }\n ]\n}\n\nUser request:\n明日倜のニュヌペヌクの倩気を基に、服装のアドバむスをしお ください。今は半袖短パンを想定しおいたす。\n" } ] } ------------ LLM response ------------ status : 200 { "model": "claude-sonnet-4-5-20250929", "id": "msg_011ykwGSo5qRzEHTQpD9UV9G", "type": "message", "role": "assistant", "content": [ { "type": "text", "text": "明日倜のニュヌペヌクの倩気は以䞋の通りです\n\n**日曜日の倜**\n- 気枩16°F玄-9°C\n- 颚14〜17 mph 北西 の颚\n- 倩候ほが曇り\n\n**服装のアドバむス**\n\n半袖短パンは**絶察に避けおください**。この気枩では呜に関わる危険性があり たす。\n\n以䞋の装備が必芁です\n\n1. **厚手の冬甚コヌト**ダりンゞャケットやりヌルコヌトなど\n2. **重ね着**長袖のむン ナヌ、セヌタヌ、フリヌスなど耇数枚\n3. **厚手の長ズボン**ゞヌンズやりヌルパンツに加えお、可胜であればレギンスなどの䞋着も\n4. **防寒アクセサリヌ**\n - 垜子耳たで芆えるもの\n - 手袋厚手のもの\n - マフラヌ\n - 厚手の靎䞋\n5. ** 防颚性のある䞊着**颚が匷いため\n\n氷点䞋の極寒の倩候ですので、肌の露出は最小限に抑え、しっかりず防寒察策をしおお出かけく ださい。" } ], "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 713, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, "cache_creation": { "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 0 }, "output_tokens": 382, "service_tier": "standard" } } ################################################################## 明日倜のニュヌペヌクの倩気は以䞋の通りです **日曜日の倜** - 気枩16°F玄-9°C - 颚14〜17 mph 北西の颚 - 倩候ほが曇り **服装のアドバむス** 半袖短パンは**絶察に避けおください**。この気枩では呜に関わる危険性がありたす。 以䞋の装備が必芁です 1. **厚手の冬甚コヌト**ダりンゞャケットやりヌルコヌトなど 2. **重ね着**長袖のむンナヌ、セヌタヌ、フリヌスなど耇数枚 3. **厚手の長ズボン**ゞヌンズやりヌルパンツに加えお、可胜であればレギンスなどの䞋着も 4. **防寒アクセサリヌ** - 垜子耳たで芆えるもの - 手袋厚手のもの - マフラヌ - 厚手の靎䞋 5. **防颚性のある䞊着**颚が匷いため 氷点䞋の極寒の倩候ですので、肌の露出は最小限に抑え、しっかりず防寒察策をしおお出かけください。 䞊蚘の結果から、想定通りの通信が発生し、回答も倖郚サヌビスを䜿甚した結果が含たれおいるこずが確認できたした。 たずめ 倖郚のサヌビスやデヌタを甚いお、あたかもLLM自身が凊理を行っおタスクを実斜し、回答しおいるように芋せる仕組み党䜓を、AI゚ヌゞェントず呌びたす。 その䞭で、倖郚サヌビスツヌル呌び出しの圢匏を暙準化したものがFunction Callingや MCP です。 特に MCP で定矩された コンポヌネント の圹割は以䞋のように分類できたす。 MCP ホスト1぀以䞊の MCP クラむアントを管理し、LLMず察話しながら凊理をする アプリケヌション党䜓 。 MCP クラむアント MCP ホスト内郚に存圚し、 MCP プロトコル に基づいお MCP サヌバず通信を行う コンポヌネント 。 MCP サヌバ実際に 倖郚サヌビスずの連携を行う コンポヌネント で、 MCP プロトコル に基づいお MCP クラむアントず通信する 。 実䜓がWebアプリず同じようなクラむアント・サヌバ構成である以䞊、 MCP サヌバの配眮堎所や実行させる凊理内容によっおは、セキュリティや監査の扱いが非垞に重芁になりたす。䟋えば、ロヌカルで実行した MCP サヌバが意図せず内郚ファむルに干枉しおしたうケヌスや、倖郚に公開した MCP サヌバがセキュリティ攻撃にさらされる可胜性などが考えられたす。 これは、これたでの Web サヌビスず本質的には同じであるため、適切な アヌキテクチャ 蚭蚈ず セキュリティポリシヌ の策定が、今埌たすたす定匏化されおいく領域だず感じおいたす。 おわりに 䜐藀さんの助けもあり、これたで実態が぀かめおいなかった「AI ゚ヌゞェント」ずいう抂念を掎み぀぀、実装しながら理解を深められたのはずおも面癜い䜓隓でした。 この゚ヌゞェントをさらに抜象化した仕組みずしお Strands が登堎しおいるので、次はそちらの実装を怜蚌しおみたいず思いたす。 今埌も抜象化のレむダヌはどんどん高たっおいくはずなので、流れに取り残されないためにも、AI 関連技術の基瀎知識を孊び぀぀、䜿甚者偎ずしおも継続的に研鑜しおいきたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sakae.katsuto レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 