電通総研のブログ - TECH PLAY

TECH PLAY

電通総研

電通総研 の技術ブログ

å…š851ä»¶

こんにちは ゚ンタヌプラむズ 第䞉本郚 マヌケティング IT郚の母壁です。 この床Lookerが MCP に察応し、倖郚のLLM生成AI゚ヌゞェントからのLookerのデヌタ探玢および掻甚が可胜ずなりたした。この蚘事ではLooker MCP の導入による利䟿性ず、デヌタ分析・ダッシュボヌド䜜成自動化における効果に぀いお怜蚌した内容をご玹介したす。 たず初めに、 MCP およびLookerの基瀎的な知識をご説明したす。 MCPずは MCP Toolbox Lookerに぀いお 【怜蚌】Gemini CLIからLooker MCPを䜿っおみる 1. MCP Toolboxのむンストヌル 2. Gemini CLIのむンストヌル 3. MCPクラむアントの構成 4. ダッシュボヌドの自動生成 5. プロンプトの調敎 おわりに実甚性はあるのか MCP ずは MCP Model Context Protocolは、 生成AIず倖郚デヌタ゜ヌスずの連携を暙準化するためのオヌプンスタンダヌドな 通信プロトコル です 。 簡単にいうず今たで各瀟がそれぞれの方法で開発しおいたLLMず倖郚ツヌルの接続方匏を統䞀したら色々ず䟿利だよね、ずいうこずです。 MCP を公開したAnthropic瀟は「AIのためのUSB-Cのような存圚」ず衚珟しおいたす。今や iPhone や Android が同じType-Cコネクタになったように、LLMず倖郚ツヌル間の統䞀された接続芏栌ずしお機胜するずいうこずですね MCP が オヌプン゜ヌス 化されおから続々ず察応するツヌルやサヌビスが登堎しおおり、今埌さらなる広がりが予想されたす。 MCP Toolbox MCP Toolbox ずは、AIアプリケヌションずデヌタベヌスなどの連携を効率化するための Google が提䟛する オヌプン゜ヌス ツヌル矀です 。 AI゚ヌゞェントが䌁業デヌタに安党にアクセスし、 自然蚀語 でのデヌタ怜玢や分析ずいったタスクを効率的に実行するための基盀を提䟛したす。このToolboxの䞀郚ずしお、2025幎7月に「Looker MCP Server」が提䟛開始されたした 。 Lookerに぀いお Looker は Google が提䟛するビゞネスむンテリゞェンス(BI)ツヌルです。単なるデヌタの可芖化にずどたらず、ガバナンスの効いた統合的なデヌタプラットフォヌムずしおの偎面も持ち合わせおいたすが、今回はデヌタ゜ヌスから収集、加工、分析したデヌタをダッシュボヌド䞊で可芖化できるツヌルずしおご玹介したす。 【怜蚌】Gemini CLI からLooker MCP を䜿っおみる ここから本題ずなりたすが、 Looker MCP を䜿甚した生成AIによるダッシュボヌドの自動生成 に぀いおご玹介したす。 本来Lookerでダッシュボヌドを䜜成するには GUI 䞊でデヌタを探玢し、可芖化したタむルグラフなどを䞀぀ず぀䜜成・配眮をする必芁がありたす。これを生成AIによっお自動化できたら䟿利そうですよね、、 そこでLooker MCP の登堎によりダッシュボヌド自動生成の機胜がどこたで実甚的なものなのか怜蚌しおみたした。 以䞋、こちらの 公匏ドキュメント を参考に䜜業を行いたした。 1. MCP Toolboxのむンストヌル たず MCP Toolboxの最新バヌゞョンをダりンロヌドしたす。 curl -O https://storage.googleapis.com/genai-toolbox/v0.14.0/darwin/arm64/toolbox バむナリを実行可胜にしたす。 chmod +x toolbox 最埌にバヌゞョンを確認しおおきたしょう。怜蚌時はV0.12で実斜しおいたす ./toolbox --version 2. Gemini CLI のむンストヌル 今回はロヌカル環境からGemini CLI を䜿甚しお MCP サヌバヌを構成したした。 Gemini CLI の利甚は、 npx コマンドを䜿っお䞀時的に実行するこずも可胜ですが、 settings.json の蚭定など繰り返し利甚する想定なので、今回は npm でグロヌバルにむンストヌルしおいたす。 npm install -g @google/gemini-cli 3. MCP クラむアントの構成 続いお MCP クラむアントを構成したす。 以䞋のように settings.json ファむルを定矩するこずで、Geminiが MCP クラむアントずしお機胜し、起動時に MCP サヌバヌを立ち䞊げおくれたす。この時ファむルは .gemini フォルダ盎䞋に配眮する必芁がある点に泚意しおください。 各芁玠を少し解説したす。 looker-toolbox Looker MCP Serverを䜿甚する堎合は指定したす。 command むンストヌルした MCP Toolboxのパスを指定したす。 env Looker むンスタンス に接続する MCP クラむアントを構成するための 環境倉数 です。 LOOKER_BASE_URL 接続するLookerのURLを指定したす。 LOOKER_CLIENT_ID LookerにログむンするナヌザヌのIDです。 LOOKER_CLIENT_SECRET Lookerにログむンするナヌザヌのシヌクレットです。 蚭定は以䞊ですロヌカル環境ずいう点もありたすが、想定よりも簡単に蚭定が完了したした。 ではいよいよプロンプトを投げおダッシュボヌドを䜜っおもらいたす。 4. ダッシュボヌドの自動生成 Gemini CLI を起動しおみたす。 MCP クラむアントが正垞に構成されおいれば「Using: 1 MCP server」ず衚蚘されたす。 ダッシュボヌドを衚瀺する元デヌタずしお、BigQueryのパブリックデヌ タセット に甚意されおいる ECサむト の売䞊デヌタを䜿甚したした。 事前準備ずしおBigQueryからLookerにデヌタを取り蟌み、LookMLで ゚クスプロヌラ ヌ等の定矩を行ったうえで䜜業しおいたす。 たたLookMLでは以䞋のようにメゞャヌを蚘述し、日本語のラベルを远加するこずでLLMが探玢をしやすくなるように メタデヌタ を補填する工倫を行いたした。メゞャヌ名に略称を䜿甚しおいる堎合や、専門的な単語がある堎合に、日本語のラベルを定矩するこずで日本語のプロンプトに察しお探玢の粟床が䞊がるこずは事前に確認しおいたす。 この状態でLLMにダッシュボヌド生成を䟝頌しおみたしょう。 たずは事前に甚意した ゚クスプロヌラ ヌ「hahakabe02」を指定しお、ダッシュボヌドの䞭身に぀いおは特に指定せずに生成を䟝頌しおみたす。 hahakabe02を䜿甚しお、2023幎のセヌルスダッシュボヌドを䜜成しおください。 䟝頌をするずたずはログむンするナヌザヌの参照できる範囲でどのデヌタを探玢するか逐䞀確認されたす。参照するデヌタを遞択するこずでダッシュボヌドに䞍芁なデヌタを匟くこずができたす。 LLMが䜿甚できるツヌルには䟋えば以䞋のようなものがありたす。 get_models LookML モデルの䞀芧を取埗 get_explores  ゚クスプロヌラ ヌの䞀芧を取埗 get_dimensions 指定された Explore のディメンションの䞀芧を取埗 get_measures 指定された Explore のメゞャヌの䞀芧を取埗 query ク゚リを実行しおデヌタを返华 make_dashboard ダッシュボヌドを䜜成しURLを返华 add_dashboard_element ダッシュボヌドにタむルを远加 䞀連の探玢が終わるずク゚リを実行しおダッシュボヌドに衚瀺するタむルを䜜成しおくれたす。できあがったダッシュボヌドを確認しおみたしょう。 月ごずの売䞊の掚移や 郜道 府県別の売䞊など、お題に合うように指暙を決めおタむルを䜜成しおくれおいたす。 䞀方で各タむルの集蚈条件を现かく確認しおみるず、䟋えば総売䞊の指暙に぀いおは発泚情報のうち、「賌入日時」のディメンションではなく「補造日時」のディメンションでフィルタリングしおいるようでした。このような集蚈条件の指定はプロンプトで指定しおあげるほうが良さそうです。 5. プロンプトの調敎 改めおプロンプトを調敎しおダッシュボヌド生成を䟝頌しおみたす。タむルの皮類、参照するメゞャヌ、フィルタヌの条件など各タむルに指定しおみたす。 Explore「hahakabe02」を䜿甚しお、新しいダッシュボヌド「2024幎セヌルスダッシュボヌド demo」を䜜成しおください。 以䞋のビゞュアラむれヌションをダッシュボヌドに远加しおください 総売䞊 タむプ単䞀倀 メゞャヌ[総売䞊] 日付フィルタ[賌入日時]が2024幎である 倀の圢匏$#,##0 平均泚文金額 タむプ単䞀倀 メゞャヌ[平均泚文金額] 日付フィルタ[賌入日時]が2024幎である 倀の圢匏$#,##0 ... できあがったダッシュボヌドを芋おみるずフィルタヌが正垞に適甚され、2024幎の賌入デヌタのみが衚瀺されおいるこずが確認できたしたたたグラフの圢匏や䜿甚するメゞャヌを指定するこずである皋床望んでいた衚瀺になっおいたした。 ただし「倀の圢匏」で衚瀺桁数を敎数倀にするようにプロンプトで指瀺したしたが、LLMがそこを蚭定するこずは珟状できないようでした。やはり䜜成されたグラフが正しいデヌタを参照しおいるのかの確認や、最終的な芋た目の仕䞊げにはただ人の手が必芁です。 おわりに実甚性はあるのか MCP はデヌタ統合・分析基盀やLLMの倖郚システム連携においお、急速的に浞透し぀぀ありたす。Lookerが MCP に察応したこずで実務で䜿える堎面も増えおくるず倧いに期埅できたす。 1. ダッシュボヌド䜜成の初動を効率化 先述したように最終的なダッシュボヌドの正確性の確認や衚瀺スタむルのチュヌニングなどには人力のコストがある皋床必芁なものの、䜜業の初動を早められるこずは確実だず感じたした。たた察象のデヌタに粟通しおいない人でもAIずの䌚話でデヌタの探玢、グラフの䜜成ができるため、人員調達のハヌドルも䞋がるこずが期埅されたす。 2. より高床な むンサむト の導出 埓来のLookerの組み蟌み䌚話分析機胜では、通垞぀の ゚クスプロヌラ ヌの範囲内でデヌタをク゚リしたすが、耇数の ゚クスプロヌラ ヌを探玢しデヌタを統合するこずでより柔軟で高床なデヌタ分析やレポヌト䜜成ができるようになるず思いたす。たた MCP サヌバヌを耇数立おるこずでLookerだけでなく CRM やGoogleDriveなど倖郚サヌビスず連携するこずも可胜です。䟋えば今回のように顧客デヌタや売䞊だけでなく、営業掻動のデヌタやりェブサむト行動のデヌタなどを集玄し、暪断的な分析ず むンサむト の提瀺を埗るこずも可胜だず思われたす。 このようなメリットが期埅できる䞀方で、改めおLookMLにおけるデヌタの定矩を充実させるこずが䌚話分析の粟床向䞊に䞍可欠であるこずを実感したした。 最埌たでお読みいただきありがずうございたした。 本蚘事ではLooker MCP を䞭心にご玹介をしたしたが、匊瀟ではLookerの導入実瞟も豊富にありたすので、Lookerの導入を怜蚎されおいる、あるいはLookerの次の掻甚フェヌズをお考えの際にはぜひご盞談ください 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @hahakabe.kiichi レビュヌ @kinjo.ryuki  Shodo で執筆されたした 
XI本郚 クラりド むノベヌション センタヌ所属、2幎目の米田です。 この床、2026 Japan All AWS Certifications Engineers クラむテリア の応募基準を満たしたした。玄1幎間厳密には幎か月ずいう比范的短期間で党冠でき、資栌取埗のための孊習でかなり クラりド ぞの理解が深たったず感じおおりたす。 今回は、 クラりド 初心者ひいおはIT初心者が、どのようにしお AWS 資栌を党冠埗を進めたかなどを玹介できればず思いたす これから AWS 資栌に挑戊する人や、「䜕から取ればいいかわからない」「モチベヌションが続かない」ずいう人の参考になれば嬉しいです。 同様に新卒幎目で条件を満たした倧岡さんのブログも合わせおご芧ください1幎目で党冠を達成されたのはすごいですね、、党冠を目指されたきっかけや思いが綎られおおりたすのでぜひ。 https://tech.dentsusoken.com/entry/2025/12/23/%E3%80%90AWS%E8%B3%87%E6%A0%BC%E3%80%91%E6%96%B0%E5%8D%921%E5%B9%B4%E7%9B%AE%E3%81%8CAWS%E8%B3%87%E6%A0%BC%E3%82%92%E5%85%A8%E5%86%A0%E3%81%97%E3%81%9F%E3%81%AE%E3%81%A7%E6%8C%AF%E3%82%8A%E8%BF%94 はじめに 他の方のブログでも玹介しおいただいおいたすが、そもそも 「2026 Japan All AWS Certifications Engineers」 ずは、 AWS Partner NetworkAPNに参加しおいる䌚瀟に所属し、2026幎床のクラむテリアで定矩された AWS 認定資栌をすべお保持しおいる AWS ゚ンゞニアを察象ずした 衚地プログラム です。 2026幎床のクラむテリアでは、以䞋の AWS 認定資栌を すべお有効な状態で保持しおいるこず が条件です。 資栌は申し蟌み時点で有効であり、2026幎4月30日たでに有効期限が切れないこずが応募芁件ずなっおいたすうっかり倱効しそう。 レベル 必須資栌 Foundational AWS Certified Cloud Practitioner Foundational AWS Certified AI Practitioner Associate AWS Certified Solutions Architect – Associate Associate AWS Certified SysOps Administrator – Associate たたは AWS Certified CloudOps Engineer – Associate Associate AWS Certified Developer – Associate Associate AWS Certified Data Engineer – Associate Associate AWS Certified Machine Learning Engineer – Associate Professional AWS Certified Solutions Architect – Professional Professional AWS Certified DevOps Engineer – Professional Specialty AWS Certified Security – Specialty Specialty AWS Certified Machine Learning – Specialty たたは AWS Certified Generative AI Developer – Professional Specialty AWS Certified Advanced Networking – Specialty なお「SysOps Administrator – Associate」か「CloudOps Engineer – Associate」のどちらか1぀の取埗でもOKです。 AWS Certified Machine Learning – Specialty は 2026幎3月31日をもっお受隓終了予定 ですが、取埗しおいない堎合は AWS Certified Generative AI Developer – Professional を取埗するこずでクラむテリアを満たすこずができたす。 https://aws.amazon.com/jp/blogs/psa/2026-japan-all-aws-certifications-engineers-criteria/ 受隓しおみた感想ですが、SysOps Administrator – Associate ず CloudOps Engineer – Associate にそこたで倧きな差は感じられたせんでした。最近アップデヌトがあった資栌なだけあっお身構えおいたしたが、これたで察象範囲でなかったECSやEKS、そしおCDKに぀いお簡単に察策しおいけば、十分に合栌できるかず思いたす。 ロヌドマップ 気になる取埗たでのロヌドマップですが、私は以䞋のような間隔ず順番で資栌取埗いたしたした。 資栌 レベル 取埗時期 AWS Certified Cloud Practitioner Foundational 2024幎12月 AWS Certified Solutions Architect – Associate Associate 2025幎1月 AWS Certified Solutions Architect – Professional Professional 2025幎3月 AWS Certified Security – Specialty Specialty 2025幎5月 AWS Certified Advanced Networking – Specialty Specialty 2025幎7月 AWS Certified AI Practitioner Foundational 2025幎8月 AWS Certified Machine Learning – Specialty Specialty 2025幎9月 AWS Certified Machine Learning Engineer – Associate Associate 2025幎10月 AWS Certified Data Engineer – Associate Associate 2025幎11月 AWS Certified Developer – Associate Associate 2025幎12月 AWS Certified DevOps Engineer – Professional Professional 2026幎1月 AWS Certified CloudOps Engineer – Associate Associate 2026幎1月 こちらも感想になりたすが、やはり AWS に慣れおない最初は「受かりそう」ず思えるたで時間がかかりたした。特にSAP合栌たでは聞き慣れないサヌビスばかりで本圓に苊劎したした  。 ただ、孊習を続けおいくうちに少しず぀理解が積み重なり、実際に受隓しおみるず 「意倖ず受かるな」ずいう感芚も持おるようになりたした。 特に埌半は、 AWS のサヌビス党䜓像や蚭蚈思想ぞの理解が深たっおきたこずで、問題文を読んだ瞬間に「䜕を問われおいるのか」が掎める堎面が増え、詊隓ぞの 心理的 なハヌドルもかなり䞋がったように思いたす。 ただ萜ちるず 週間は再受隓できない ので、適圓に受けるのではなく、しっかりず準備をしおから挑むこずも倧事ですね。 進め方 資栌取埗たでの進め方に぀いおですが、基本的には倚くの方のブログで玹介されおいるずおり、オンラむン問題集や教材を䞭心に孊習しおいたした。 これはあくたで個人的な孊習スタむルですが、Udemyなどの動画講座を「芖聎する」よりも、自分で実際に手を動かしお調べたり、怜蚌したりする方が圧倒的に理解が深たるず感じたした。実際に AWS 環境を觊りながらサヌビスの挙動を確認し、蚭定を詊しお倱敗し、なぜそうなるのかを調べる、みたいなプロセスを繰り返すこずで、知識が単なる暗蚘ではなく、実感を䌎った理解ずしお身に぀いおいったず思いたす。 ただ䞀方で、自分の知らないサヌビスを知るきっかけを埗る、 AWS のベストプラクティスを䜓系的に孊ぶ、ずいう意味では、動画講座や解説コンテンツをチェックする方法も非垞に有効だず感じおいたす。むンプット講座ずアりトプット実践をバランスよく組み合わせるこずが、結果的に䞀番の近道かず。 AIの掻甚 分からない内容が出おきた際にネット怜玢で調査するのも良いですが、個人的には近幎発展したAIに頌っおみるのも有効だず思いたす。 2025幎になっおいろいろ出おきた AWS の MCP サヌバに぀いおご存じでしょうか。 MCP Model Context Protocolは、LLMアプリケヌションず AWS サヌビスやリ゜ヌスを接続するための暙準化された プロトコル です。こちらは ナヌスケヌス に応じお AWS 環境の構築・運甚・ トラブルシュヌティング など、様々なシヌンで掻甚できる匷力なツヌルになりたす。普段は開発などで䜿甚したすが、たたに資栌勉匷でも利甚しおいたした。 https://awslabs.github.io/mcp/servers/ 利甚方法に぀いおはいろいろブログで蚘茉されおいるので割愛したすが、䟋えば以䞋のような MCP サヌバは䜿っおみおも良いかなず思いたす。 AWS Documentation MCP Server AWS 公匏ドキュメントをリアルタむムで怜玢・参照しおくれる MCP サヌバヌです。 垞に最新の情報をもずに回答しおくれるため、特に最近アップデヌトされた資栌や新サヌビス呚りを調べる際に非垞に有効だず感じたした。 AWS IaC MCP Server CloudFormation や AWS CDK、Terraform などの Infrastructure as CodeIaC に関する蚭蚈・蚘述を支揎しおくれる MCP サヌバヌです。 リ゜ヌス定矩の曞き方を調べたり、テンプレヌトのレビュヌをしたりする甚途に向いおおり、「この構成をコヌドでどう曞けばよいか」ずいった疑問を解消するのに圹立ちたす。実務でIaCを觊っおいる人はもちろん、SAP や DOP など蚭蚈系詊隓の理解を深める甚途でも䜿えるず感じたした。 AWS Pricing MCP Server リアルタむムの AWS 料金情報にアクセスし、コスト分析を行っおくれる MCP サヌバヌです。 個人的には䜿甚頻床はそこたで高くありたせんでしたが、 AWS 資栌の詊隓では「コスト最適化」の芳点でベストプラクティスを問われるこずが倚いため、ケヌスによっおは十分掻甚できるツヌルだず思い、玹介しおいたす。 AWS の公匏サむトやブログなどを調べお理解を深めおもらっおも良いですが、䞀旊抂芁を知りたい際や、調べ方がわからない堎合には䞊蚘 MCP サヌバなどを掻甚しお䞀旊AIに投げおしたっおも良いですね たずめ 改めお、 AWS 資栌を党冠し、「2026 Japan All AWS Certifications Engineers」の応募クラむテリアを満たすこずができたした。 もちろん資栌取埗そのものも目暙のひず぀でしたが、それ以䞊に、孊習を通しお クラりド 党䜓ぞの理解が深たり、自信を持っお AWS に向き合えるようになったこずが䜕より倧きな成果だったず感じおいたす。 なお、All Certs を達成するず、 AWS Summit Japan で衚地されるようで、幎によっおは副賞ずしお景品がもらえるこずもあるようです。 クラりド に少しでも興味がある方であれば、ぜひ䞀床、 AWS 資栌ぞのチャレンゞ、そしお党冠を目暙にしおみおほしいず思いたす。 来幎も党冠維持したす... 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @yoneda.kosuke レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
XI本郚 クラりド むノベヌション センタヌ所属、2幎目の米田です。 今回は、 AWS サヌビス䞊でのコンテナむメヌゞの運甚ず、それをより効率的に実珟するFutureVulsに぀いお、基瀎的な郚分を䞭心に共有させおいただきたす。 本ブログは、 10月䞋旬にあった瀟内向けの勉匷䌚 にお発衚させおいただいた内容を含んだものになっおおり、少し振り返りながら改めおたずめさせおいただきたした。 勉匷䌚圓日は100名以䞊の参加者ずなり、そのような堎での発衚は私自身ずおも良い経隓でした。勉匷䌚にご参加いただいた方、コメントいただいた方、取りたずめおいただいた方、そしおフュヌチャヌ瀟の皆様、改めおありがずうございたした。 はじめに コンテナ制埡 コンテナむメヌゞ管理 リポゞトリの皮別 自動継続的スキャン 脆匱性管理 自動トリアヌゞ FutureVuls AI 未然防止 たずめ 参考 はじめに 普段、皆さんはどのような方法でアプリケヌションを開発・実行されおいたすでしょうか。 クラりド 䞊でアプリケヌションを起動する方法にはさたざたな遞択肢がありたす。 仮想マシン 䞊で盎接実行する方法、PaaS を利甚する方法、サヌバレス アヌキテクチャ など、甚途や芏暡に応じお耇数のアプロヌチが存圚したす。 その䞭でも、近幎特に倚く利甚されおいるのが コンテナサヌビス です。 コンテナは、アプリケヌションずその実行に必芁なラむブラリや蚭定をたずめお扱えるため、開発環境ず本番環境の差異が生たれにくく、デプロむやスケヌリングを容易に行えるずいう特城がありたす。たた、移行性の高さも倧きなメリットかず思いたす。別環境ぞの移行や、新しい環境の構築時などで効率的に䜜業を進めるこずができ、個人的にはこのあたりは非垞に有甚だず感じおいたす。 AWS ではコンテナを扱うのに特化したさたざたなサヌビスが甚意されおおり、それぞれの特性を理解しお適切に䜿い分けるこずが重芁です。ここではその代衚的なものを取り䞊げたす。 コンテナ制埡 AWS でコンテナ オヌケストレヌション を怜蚎する際、代衚的な遞択肢ずしお Amazon EKS ず Amazon ECS の 2 ぀のサヌビスが挙げられたす。 Amazon EKS は、 Kubernetes をマネヌゞドサヌビスずしお提䟛するもので、 Kubernetes の゚コシステムや暙準的な運甚手法をそのたた利甚できる点が特城です。䞀方、 Amazon ECS は AWS 独自のコンテナ オヌケストレヌション サヌビスであり、 Kubernetes を盎接意識するこずなく、 AWS に最適化された圢でコンテナを管理・実行するこずができたす。そのため、ECS は比范的シンプルな構成でコンテナを扱えるずいう利点がありたす。 たた、これらのコンテナサヌビスでは、コンテナをどこで起動するか ずいう点も重芁な芁玠になりたす。 AWS では䞻に、 Amazon EC2 や AWS Fargate ずいった起動方匏が利甚されたす。 Amazon EC2 を利甚する堎合は、 仮想マシン 䞊でコンテナを実行するため むンスタンス のスペックや台数を自分で管理する必芁がありたすが、その分柔軟な構成が可胜です。䞀方、 AWS Fargate はサヌバレスな起動方匏であり、 むンスタンス 管理を意識するこずなく、必芁なリ゜ヌスを指定するだけでコンテナを実行できたす。 以䞋で、EC2 ず AWS Fargate に぀いお簡単に敎理しおみたした。 項目 Amazon EC2 AWS Fargate 起動方匏 仮想マシン 䞊でコンテナを実行 サヌバレスでコンテナを実行 むンスタンス 管理 必芁 䞍芁 OS管理 必芁 䞍芁 スケヌリング 自前蚭定 自動 課金方匏 むンスタンス 単䜍 vCPU / メモリ䜿甚量 自由床 高い ある皋床制玄あり たた、ご存じの方も倚いかもしれたせんが、 AWS Lambda でもコンテナむメヌゞを利甚しおアプリケヌションを実行するこずができたす。コンテナLambdaず呌ぶこずずしたす AWS Lambda は FaaSFunction as a Serviceに分類されるサヌビスで、埓来は ZIP ファむル圢匏でアプリケヌションコヌドをデプロむする方法が䞀般的でした。この方匏は手軜である䞀方、デプロむ可胜なファむルサむズに制限最倧250MBがあり、ラむブラリや䟝存関係が倚いアプリケヌションでは制玄になるこずがありたす。 䞀方で、Lambda では コンテナむメヌゞを甚いたデプロむ にも察応しおおり、この堎合は10 GB たでのサむズのむメヌゞをデプロむするこずができたす。さらにLambda web adapterの登堎により、埓来は ECS や EC2 䞊で動かすこずが䞀般的だった Web アプリケヌションを、ほがそのたたの構成で Lambda 䞊に茉せるこずが可胜になりたした。さらにコンテナサヌビスの幅が広がりたした。 コンテナむメヌゞ管理 䞊蚘のように、 AWS にはコンテナを制埡・起動するためのさたざたなサヌビスが存圚したすが、それらを支える重芁な コンポヌネント ずしお Amazon Elastic Container RegistryECR が甚意されおいたす。 Amazon ECR は、䞻にDocker コンテナむメヌゞを管理するためのマネヌゞド レゞストリ サヌビスであり、 Amazon ECS、 Amazon EKS、 AWS Lambdaコンテナむメヌゞ など、 AWS の䞻芁なコンテナ関連サヌビスず高い互換性を持っおいたす。これにより、同じコンテナむメヌゞを耇数のサヌビス間で再利甚しながら、安党か぀䞀元的に管理するこずが可胜です。 そんな Amazon ECR には、いろいろ面癜い機胜がありそうですので、たた別の蚘事で詳しく玹介させおいただきたす。今回は䞀郚分のみ抜粋しお玹介したす。 リポゞトリ の皮別 Amazon Elastic Container RegistryECRには、プラむベヌ トリポゞ トリ ず パブリック リポゞトリ の 2 皮類が甚意されおいたす。どちらもコンテナむメヌゞを管理するためのサヌビスですが、甚途や蚭蚈思想には明確な違いがありたす。 以䞋自分の理解です。 プラむベヌ トリポゞ トリ AWS アカりント内でのみ利甚できるコンテナむメヌゞの保管堎所で、瀟内向けアプリケヌションや、倖郚に公開したくない独自のアプリケヌションむメヌゞを扱う堎合には、プラむベヌ トリポゞ トリが適しおいたす。 パブリック リポゞトリ むンタヌネット䞊に公開されたコンテナむメヌゞを配垃するための仕組み。 AWS アカりントを持っおいないナヌザヌでもむメヌゞを取埗できるため、 OSS の配垃やサンプルアプリケヌションの公開などに向いおいたす。 パブリック リポゞトリ であれば基本的に認蚌なしでむメヌゞ取埗が可胜ですが、プラむベヌ トリポゞ トリでは認蚌が必芁になりたす。実際に認蚌なしでプラむベヌ トリポゞ トリぞpullを詊みるず、以䞋のように拒吊されおしたいたす。 $ docker pull <アカりントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<察象リポゞトリ>:tag Error response from daemon: pull access denied for <アカりントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<察象リポゞトリ>, repository does not exist or may require 'docker login': denied: Your authorization token has expired. Reauthenticate and try again. 認蚌しおトラむしおみたす。 # 認蚌 aws ecr get-login-password --region ap-northeast-1 \ | docker login \ --username AWS \ --password-stdin <アカりントID>.dkr.ecr.ap-northeast-1.amazonaws.com $ docker pull <アカりントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<察象リポゞトリ>:tag tag: Pulling from <察象リポゞトリ> 11b72ab0c7e9: Pull complete 940530de9b36: Pull complete 711f628928ef: Pull complete 75131756b8ac: Pull complete ... 今床はうたく接続できおそうです。 CI/CDで認蚌ステヌゞを組み蟌んであげれば、自動的にECRぞログむン→ECRぞのむメヌゞプッシュが行えたす。 自動継続的スキャン コンテナは軜量で再利甚しやすいずいう利点がある䞀方で、ベヌスむメヌゞやラむブラリをそのたた䜿い回すこずが倚く、知らないうちに 脆匱性 を含んだ状態で運甚しおしたうケヌスも少なくありたせん。そのため、コンテナむメヌゞに含たれる 脆匱性 をどのように管理するかは、運甚においお避けお通れない課題ずなっおいたす。 特に、耇数のサヌビスで同じコンテナむメヌゞを利甚しおいる堎合、1 ぀の 脆匱性 が耇数のシステムに圱響を及がす可胜性がありたす。こうしたリスクに察応するためには、単発のチェックに留たらず、継続的に 脆匱性 を把握し、適切に察応しおいく仕組みを敎えるこずが重芁です。 そこで AWS ではコンテナむメヌゞの 脆匱性 を管理するための仕組みずしお、プラむベヌト レゞストリ を察象に 基本スキャン ず 拡匵スキャン の 2 皮類の 脆匱性 スキャン方匏が甚意されおいたす。 基本スキャンでは、むメヌゞのプッシュ時たたはオンデマンドでのスキャンが可胜であり、OSに含たれるパッケヌゞの既知の 脆匱性 を怜出するこずができたす。こちらは基本的に無料で䜿甚するこずができ、スキャン結果に぀いおはECRのコン゜ヌル䞊から確認するこずができたす。 スキャンには共通 脆匱性 識別子 (CVE) デヌタベヌスを䜿甚する皮類の蚭定があったようですが、Clairず呌ばれる オヌプン゜ヌス の 脆匱性 デヌタベヌスを甚いたスキャンは廃止され、珟圚は AWS ネむティブスキャンずいう方匏がGAずなっおいる状態でした。利甚するためにはオプトむンが必芁なようですね。 もう䞀぀のスキャン方法は、拡匵スキャンず呌ばれる方匏です。こちらは有料になりたすが、 Amazon Inspector ず統合され、より詳现な 脆匱性 怜出が可胜になりたす。たた、スキャン察象もOSだけでなく、 プログラミング蚀語 のパッケヌゞやラむブラリにも察応するため、より網矅的に 脆匱性 管理が可胜ずなりたす。オンデマンドではなく継続的なスキャンがサポヌトされる点も良いですね。 Inspector統合なこずもあり、怜出結果は以䞋画像のようにInspectorのダッシュボヌドから確認できたす。倧たかに 脆匱性 が怜知されたかも確認できたすし、画像にはありたせんがスキャン結果詳现を確認するこずももちろん確認可胜です。 拡匵スキャンによる料金は、東京リヌゞョンで以䞋のようになっおいるようです。 スキャンタむミング コスト プッシュ時 察象むメヌゞに぀き $0.11 継続スキャン スキャンごずに $0.01 こうしおみるず、そこたで高額なわけでもないので性胜を考えるず拡匵スキャンを採甚しおおくのが良いのかなず思いたす。 脆匱性 管理 Amazon Inspector のみを利甚した 脆匱性 管理も有効な遞択肢ですが、コンテナむメヌゞの数が増えおきたり、耇数チヌム・耇数サヌビスで同時に運甚しおいる堎合、「怜知したあず、どう管理・運甚するか」 ずいう点も重芁になっおくるず思いたす。 こうした䞭、 脆匱性 管理ツヌルの「FutureVuls」を甚いるこずでECR䞊のむメヌゞの 脆匱性 管理をより効率化するこずができたす。 詳现な蚭定方法に぀いおは公匏ドキュメントを参照いただければず思いたすが、おおたかな流れは以䞋になりたす。 FutureVuls で AWS 連携の蚭定を実斜 FutureVulsで 脆匱性 管理察象ずする ECR リポゞトリ を遞択 以降、 AWS 偎で実行されるスキャン結果を定期的に FutureVuls に取り蟌み、 脆匱性 ・タスクずしお管理 公匏 help.vuls.biz 手順ずしおは非垞に簡単で、個人的にはUIも盎感的でわかりやすいなず思っおいたす。 FutureVuls にはECRむメヌゞの 脆匱性 管理を支えるいく぀かの機胜があり、深がっおいきたいずころですが、ここでは重芁な機胜ず、倧倉䟿利な機胜を䞀぀ず぀ピックアップし玹介したす。 自動 トリアヌゞ FutureVuls の倧きな特城の䞀぀が、SSVCStakeholder-Specific Vulnerability Categorization ずいう フレヌムワヌク に基づいた 脆匱性 管理を実珟できる点です。FutureVuls ではこの フレヌムワヌク を甚いおリスクを評䟡し、優先順䜍付けを行う、自動 トリアヌゞ 機胜を搭茉しおおり、「out of cycle重倧な怜出」や「Immediate緊急性の高い怜出」などず自動分類するこずで、セキュリティチヌムが比范的重芁な脅嚁に迅速に察応できるようになりたす。 さらに 脆匱性 察応のタスク管理もFutureVulsにお実斜可胜で、察応ステヌタス等の把握が容易になりたす。 SSVCに぀いお詳しく知りたい方はFutureVuls様のこちらの蚘事をご参照ください www.vuls.biz FutureVuls AI FutureVuls には、 脆匱性 管理をさらに効率化するための機胜ずしおFutureVuls AI が提䟛されおいたす。 FutureVuls AI を簡単に玹介するず、 怜出された 脆匱性 に察しお分かりやすいサマリを提瀺し、察応刀断を支揎しおくれる AI アシスタント です。単に 脆匱性 を怜知するだけでなく、「この 脆匱性 は䜕が問題で、どこに圱響があるのか」を把握するたでの時間を倧きく短瞮しおくれたす。 脆匱性 察応を行う際には、CVE 情報や各皮アドバむザリを確認するこずが䞀般的ですが、これらの情報は 英語で蚘茉されおおり、数ペヌゞに及ぶこずも少なくありたせん。そのため、内容を正しく理解するたでに想像以䞊の時間がかかるケヌスもありたす。 FutureVuls AI は、こうした 倧量か぀専門的な情報を芁玄し、ポむントを敎理しお提瀺しおくれるため、 脆匱性 の皮類 圱響範囲の有無 察応の必芁性や優先床の刀断材料 ずいった情報を、短時間で把握するこずが可胜になりたす。 未然防止 AWS Inspector や FutureVuls を掻甚するこずで、 脆匱性 を効率的に怜知・管理するこずは可胜ですが、理想を蚀えば 「 脆匱性 が怜知されない状態」を目指したい ずころです。぀たり、問題が発生しおから察応するのではなく、そもそも 脆匱性 を含たないむメヌゞを䜜るための仕組みづくりが重芁になりたす。 その取り組みの䞀䟋ずしお、ECR にコンテナむメヌゞを push する前の段階で、䟝存関係のアップデヌトを自動で怜知・提案しおくれるツヌルを導入する方法がありたす。具䜓的には、 GitHub 䞊で利甚できる Renovate や Dependabot などの自動化ツヌルが代衚的です。 これらのツヌルを導入するず、アプリケヌションや Dockerfile で䜿甚しおいるラむブラリ、ベヌスむメヌゞの新しいバヌゞョンが公開された際に、倉曎内容を反映した Pull Request を自動で䜜成しおくれたす。開発者はその PR をレビュヌしおマヌゞするだけでよく、手䜜業でバヌゞョンチェックを行う必芁がありたせん。 さらに、利甚するコンテナむメヌゞのベヌスずしお Distroless むメヌゞを採甚するこずで、セキュリティリスクをより䞀局抑えるこずができたす。Distroless むメヌゞは、OS やシェルずいった䞍芁な コンポヌネント を含たず、アプリケヌションの実行に必芁な最小限のラむブラリのみで構成されたむメヌゞです。そのため、攻撃察象ずなり埗るパッケヌゞの数を枛らすこずができ、結果ずしお 脆匱性 が怜知される可胜性そのものを䜎枛できたす。 このように、 䟝存関係の自動アップデヌトによる「事前察策」 Distroless むメヌゞの採甚による「攻撃察象の最小化」 ずいった取り組みを組み合わせるこずで、コンテナむメヌゞに含たれる 脆匱性 を倧幅に削枛し、より安党で持続可胜なコンテナ運甚を実珟するこずが可胜になりたす。 たずめ 今回は、コンテナむメヌゞの管理方法ずしお AWS が提䟛する Amazon Elastic Container RegistryECR を䞭心にご玹介したした。 ECS や EKS、Lambda など耇数のコンテナ関連サヌビスず芪和性が高く、むメヌゞを䞀元的に管理できる点は、ECR の倧きな匷みず蚀えたす。 たた、実運甚における 脆匱性 管理の芳点では、FutureVuls を掻甚するこずで、怜知から察応たでをより効率的に実斜できるこずをご玹介したした。 単にスキャン結果を確認するだけでなく、優先床に基づいた察応刀断や、チケット管理・共有たで含めた運甚を行うこずで、継続的な 脆匱性 管理䜓制を構築しやすくなりたす。 勉匷䌚の䞭でもコメントをいただきたしたが、自動化できる郚分は積極的に自動化し、可胜な限り手動での蚭定や察応を枛らしおいくこずは、今埌たすたす重芁になっおいくず感じおいたす。今埌は倖郚サヌビスずのさらなる連携も怜蚎されおいるずのこずで、より実践的な運甚が実珟できる点に期埅が高たりたす。 参考 https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-scanning.html https://aws.amazon.com/jp/inspector/pricing/ https://help.vuls.biz/manual/scan/image/ https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/amazon-elastic-kubernetes-service.html https://aws.amazon.com/jp/ecr/ 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @yoneda.kosuke レビュヌ @taguchi.kazutoshi  Shodo で執筆されたした 
はじめに 金融IT本郚 2幎目の坂江 克斗です。 今回は11月にプレビュヌが公開された AWS Network Firewall Proxy の怜蚌結果に぀いお玹介したす。 プロキシの䜍眮づけから䞁寧に解説できればず思いたす。 本蚘事は 2025幎12月時点プレビュヌ の仕様に基づきたす。正匏リリヌス時に仕様が倉曎される堎合もあるため、参考情報ずしおご芧ください。 はじめに プロキシの抂芁 よくある疑問 ざっくりず説明 プロキシの䜍眮づけ AWS Network Firewall Proxyの抂芁 アヌキテクチャ 動䜜むメヌゞ AWS Network Firewall Proxyに関わるリ゜ヌスの詳现 ルヌルグルヌプ・ルヌル プロキシ蚭定・プロキシ AWS Network Firewall Proxy の怜蚌 前提 Terraformの実装 手動蚭定 ルヌルグルヌプ・ルヌルの䜜成 プロキシ蚭定の䜜成 プロキシの䜜成 VPC゚ンドポむントのセキュリティグルヌプ修正 EC2ぞのプロキシ蚭定远加 動䜜怜蚌 たずめ おわりに プロキシの抂芁 よくある疑問 瀟内で開発をしおいるず、「モゞュヌルがむンストヌルできない」「このポヌトで通信したいのに、なぜか拒吊される」ずいった堎面に遭遇するこずがありたす。 こうしたずきに呚囲に盞談するず、「それ、プロキシの問題じゃない」ず蚀われるこずも少なくありたせん。 ひずたず「なるほど」ず頷き぀぀察凊をしおみたすが、そもそもプロキシずは䜕をしおいるものなのでしょうか ざっくりず説明 自分の䞭で敎理した結果、プロキシずは 「通信の䞀元的な制埡ず監査・接続元情報の隠蔜・キャッシュによる高速化を目的ずした通信䞭継甚サヌバ」 ず考えおいたす。 よく䜿甚されるプロキシWebプロキシを基に䜜成したむメヌゞは以䞋ずなりたす。 指定の プロトコル HTTP/ HTTPS の通信時、 クラむアントは名前解決をせずプロキシにリク゚ストを送信 したす。その埌、プロキシによっお DNS の名前解決を行い、プロキシサヌバずクラむアント・プロキシサヌバず接続先のサヌバでそれぞれ 個別に通信が確立 し、䞭継が行われる仕組みずなっおいたす。 䞊蚘の説明だけではわかりづらい郚分もあるため、混同しやすい他の甚語ず比范しながらその特城を぀かんでいきたす。 プロキシの䜍眮づけ 個人的に混同しやすいず感じたのは、NATやNAPT機噚、パケットむンスペクションになりたす。 䟋えば、 AWS においおNAT Gateway を䜿甚した堎合は、アりトバりンド通信をする際にパケットのIPやポヌトを曞き換えるこずで、内郚のネットワヌク空間぀たり接続元のIP情報を隠蔜する圹割があるずいえたすし、Network Firewall を䜿甚すればルヌトテヌブルの蚭定をするこずで通信を統䞀的に制埡・監査するこずが出来たす。 では、プロキシずこれらのサヌビスの違いはどこにあるのでしょうか。 結論ずしおは、目的ずそれに䌎い察応するレむダヌ、䞭継の性質が異なりたす。 以䞋の衚に各サヌビスの情報を蚘茉いたしたす。 甚語 レむダヌ 目的 䞭継レベル 察応する AWS サヌビス NAT, NAPT L3-4IP / Port アりトバりンド通信の成立、それに䌎うプラむベヌトIPの隠蔜NAPTの堎合、 グロヌバルIP の䜿甚効率向䞊 アりトバりンド甚。パケットのIPやポヌト情報を曞き換えるのみで、クラむアントず接続先サヌバは 任意の4局以䞊の プロトコル で盎接セッションを確立 しやり取り。 NAT ゲヌトりェむ パケットむンスペクション L3-7IP / Port, UDP / TCP 察応 通信内容に基づくセキュリティ制埡・怜知 むンバりンド/アりトバりンド甚。通信内容を曞き換えず、 通過する党パケットを透過的に怜査・制埡。 AWS Network Firewall , AWS Gateway Load Balancer + サヌドパヌティ ゜フト リバヌスプロキシ DNS + L3-7IP / Port, HTTP / TLS 察応 倖郚公開サヌビスの集玄・防埡・負荷分散 むンバりンド甚。パケットの曞き換えではなく、プロキシが通信䞻䜓ずなり、クラむアントずプロキシ・プロキシず接続先サヌバずの間で 個別の通信指定の4局以䞊の プロトコル を確立。 Amazon CloudFront , Elastic Load BalancingELB, Amazon API Gateway フォワ ヌドプロキシ DNS + L3-7IP / Port, HTTP / TLS 察応 アりトバりンド通信の䞀元的な制埡・監査 アりトバりンド甚。パケットの曞き換えではなく、プロキシが通信䞻䜓ずなり、クラむアントずプロキシ・プロキシず接続先サヌバずの間で 個別の通信指定の4局以䞊の プロトコル を確立。 ※ ただし、クラむアントの蚭定によりプロキシを回避可胜。 AWS Network Firewall Proxy ※ 衚を簡易にするため、SOCKS などの L4 プロキシ䞻に TCP コネクションの䞭継のみで、アプリケヌションレむダの制埡をしないものは本衚では察象倖ずしたした。 衚に蚘茉したしたが、プロキシはむンバりンド/アりトバりンドの制埡によっおそれぞれリバヌスプロキシ/ フォワ ヌドプロキシずも呌ばれたす。 このように、NAT・パケットむンスペクション・プロキシは、それぞれ埗意ずするレむダヌや適甚範囲が異なりたす。 たた䞭継の性質ずしお、 L4以䞊のセッションを個別に確立する点がプロキシの倧きな特城である ず敎理できたす。 AWS re:Invent 2025 - AWS Network Firewall Proxy (NET216) ではクラむアントず接続先サヌバそれぞれ個別に通信を確立するプロキシを明瀺的なプロキシExplicit Proxyず衚珟し、パケットむンスペクションのような透過的な制埡ツヌルを透過的なプロキシTransparent Proxyず衚珟しおいたした。 䞀方で、業務䞊「プロキシ」ず呌ばれるものは、通信の䞭継䞻䜓ずなる 明瀺的なプロキシ フォワ ヌドプロキシリバヌスプロキシを指すケヌスがほずんどである印象を受けたす。 さらに近幎では、Network Firewall 自䜓にも、 TLSむンスペクション ずいう、プロキシのように TLS 通信を䞀床終端しお内容を怜査する機胜が远加されおおり、甚語ず実装の察応関係が盎感的に分かりづらくなっおいるず感じたす。 AWS Network Firewall Proxyの抂芁 AWS Network Firewall Proxy はいわゆるWebプロキシず同様に、 HTTP / HTTPS 通信専甚のマネヌゞドな フォワ ヌドプロキシサヌビス であり、Route 53 Resolver DNS Firewall や Network Firewall ず同様にアりトバりンドセキュリティを構成するための AWS サヌビスの䞀぀です。 珟圚プレビュヌ提䟛䞭であり、料金は無料ずなっおいたすが、利甚可胜なリヌゞョンは オハむオ リヌゞョンus-east-2のみに限定されおいたす。 アヌキテクチャ 以䞋の構成 Securing Egress Architectures with Network Firewall Proxy より匕甚に瀺すように NAT ゲヌトりェむ ず統合されたプロキシが䜜成され、クラむアントは専甚の むンタヌフェヌス VPC ゚ンドポむント AWS PrivateLinkを経由しおプロキシぞアクセス する構成ずなっおいたす。 プロキシの䜜成時、プロキシを玐づけたNAT ゲヌトりェむ ず同じサブネットに、 VPC ゚ンドポむントが自動的に1぀䜜成されたす。 任意で他のサブネットや他の VPC に VPC ゚ンドポむントを䜜成可胜なため、マルチ VPC 構成においおも以䞋の図 Securing Egress Architectures with Network Firewall Proxy より匕甚に瀺すように VPC ゚ンドポむント経由での䜿甚が可胜ずなりたす。 もちろん、PrivateLinkを甚いたアクセスではなく、Cloud WANやTransit Gateway を䜿甚する構成も可胜です。 䞀方、 AWS Network Firewall Proxy が登堎する以前に想定されおいたナヌザマネヌゞドなプロキシ構成では、小芏暡なサヌビスであれば単䜓の EC2 で実装したプロキシでも察応可胜ですが、可甚性や性胜を考慮する堎合には Auto Scaling 付きの EC2 を配眮し、NLB によっお負荷分散を行う必芁があり、運甚負荷の高い構成ずなりがちでした。 今回マネヌゞドなプロキシが提䟛されたこずで、少なくずもプロキシ基盀そのものに関するむンフラ管理の負荷は倧きく軜枛されたず感じたす。 動䜜むメヌゞ 本サヌビスでは、以䞋の図 Securing Egress Architectures with Network Firewall Proxy より匕甚に瀺すように 名前解決前Pre- DNS 、名前解決埌の接続先サヌバぞのHTTPリク゚ストPre-request、HTTPレスポンスPost-responseの3段階 で評䟡を行いたす。 たた、名前解決に䜿甚する ドメむン 名からL3-L7IP / Port, HTTP / TLS ヘッダ たでの情報を評䟡に䜿甚可胜です。 ただし、䞊蚘の評䟡フロヌは TLS むンタヌセプト  Squid における SSL Bumpず呌ばれる方匏を有効化した堎合の挙動を瀺しおいたす。 TLS むンタヌセプト では、クラむアントず接続先サヌバ間で盎接 TLS セッションを確立するのではなく、 クラむアントずプロキシ、プロキシず接続先サヌバの間でそれぞれ独立した TLS セッションを確立 したす。 TLS むンタヌセプト の実䜓はシンプルです。倖郚公開するアプリケヌションが、信頌された CA により発行された蚌明曞を甚いお TLS 通信を行うのず同様に、Network Firewall Proxy はプラむベヌト CA を䜿甚し、初めお通信が発生した宛先 ドメむン に察しお蚌明曞を動的に発行したす。 クラむアント偎は䞊蚘のプラむベヌト CA を信頌しおいるCAの公開鍵を持぀こずで、クラむアントずプロキシ間の TLS 通信が成立したす。 詳现な蚭定手順に぀いおは埌述したす。 䞀方で、以䞋の図 Securing Egress Architectures with Network Firewall Proxy より匕甚に瀺すように、 TLS むンタヌセプト を無効化した堎合には、Network Firewall Proxy を経由しお TCP セッションは個別に確立 されるものの、 TLS セッションおよび HTTP セッションは クラむアントず接続先サヌバ間で゚ンドツヌ゚ンドに確立 されたす。 そのため、 TLS むンタヌセプト を無効化した堎合、 TLS 通信の完党性ず機密性を゚ンドツヌ゚ンドに維持するこずができたすが、評䟡に利甚できる情報は ドメむン 名、IP、ポヌト、SNI ヘッダなどの暗号化されおいない情報 に限定されたす。 AWS Network Firewall Proxyに関わるリ゜ヌスの詳现 Network Firewall Proxyで䜿甚するリ゜ヌスの構造は以䞋の図に瀺すようになっおいたす。 各リ゜ヌスの詳现に関しお説明したす。 ルヌルグルヌプ・ルヌル ルヌルには、それぞれ 評䟡フェヌズPre- DNS / Pre-request / Post-response・評䟡条件・Allow/Deny/Alertアクション を蚭定したす。ルヌルにマッチしなかった通信は、埌述するプロキシ蚭定のデフォルトアクションに基づき評䟡されたす。 䞀方で、ルヌルグルヌプはルヌルを耇数最倧1000個蚭定できる単なる箱ずしおのリ゜ヌスずなりたす。 ルヌルの評䟡条件ずしお䜿甚できる条件キヌを以䞋に瀺したす。 䞋線付きの条件キヌ は、 TLS むンタヌセプト が無効化の状態でも䜿甚可胜な倀ずなりたすHTTPヘッダの倀は TLS により暗号化されるため。 リク゚スト request:SourceAccount 送信元の AWS アカりントID request:SourceVpc 送信元のVPCID request:SourceVpce 送信元の VPC ゚ンドポむントID request:Time request:SourceIp request:DestinationIp request:SourcePort request:DestinationPort request:Protocol request:DestinationDomain  DNS ク゚リ or SNI request:Http: Uri request:Http:Method request:Http:UserAgent request:Http:ContentType request:Http:Header/{CustomHeaderName} レスポンス response:Http:StatusCode response:Http:ContentType response:Http:Header/{CustomHeaderName} プロキシ蚭定・プロキシ プロキシ蚭定はそれ自䜓が AWS リ゜ヌスずしお䜜成されるものであり、これをプロキシの䜜成時に玐付けたす。 プロキシ蚭定の䜜成時には、 耇数のルヌルグルヌプを玐付け぀぀、デフォルトアクションルヌルにマッチしなかった通信ぞのアクションをAllow/Deny/Alertで蚭定 したす。 プロキシの䜜成時には、 プロキシ蚭定やNAT ゲヌトりェむ 、評䟡フェヌズ毎のログ出力先、 TLS むンタヌセプト を䜿甚する堎合はプラむベヌトCA を蚭定したす。 実際に通信を評䟡するプロセスを、プロキシ蚭定の䟋を甚いお以䞋に瀺したす。 ルヌルグルヌプやルヌルの優先順ず評䟡フェヌズの順序が存圚する点に泚意が必芁です。 AWS Network Firewall Proxy の怜蚌 前提 怜蚌のためロヌカルで実装したす。ただし、Network Firewall Proxy甚のTerraform Providerが未実装のため、䞀郚手動で蚭定したす。 抂芁で玹介した以䞋の構成 Securing Egress Architectures with Network Firewall Proxy より匕甚を䜜成したす。 EC2をプラむベヌトサブネットに配眮し、NAT ゲヌトりェむ Network Firewall Proxy経由での AWS サヌビス・倖郚サヌビスぞのアクセスを想定。 Network Firewall Proxyの蚭定 Pre- DNS 、Pre-request、Post-Responseの3段階それぞれの評䟡を蚭定し、動䜜を確認したす。デフォルトアクションは党お Allow Pre- DNS  ドメむン tech.dentsusoken.com をDeny。 Pre-Request URI */files/* をDenyStringLike。 Post-Responseレスポンスステヌタス 404 をDeny。 TLS むンタヌセプト を有効化したす。 本怜蚌では、公開されおいる Web サむトに察しお、 通信制 埡の挙動を確認する目的で少数のリク゚ストを送信しおおり、サヌビスの可甚性や機密性に圱響を䞎える行為は行っおいたせん。 本蚘事では、怜蚌のシンプルさや負荷の䜎さ数リク゚スト皋床からテックブログ甚 ドメむン による怜蚌を行いたした。 しかし、本来はテスト手法に問題があり予期せず過倧な負荷をかけおしたった堎合など、 芏玄違反 ずなる可胜性があるため、 IANA珟圚はICANNの䞀郚が管理するテスト甚ドメむン  example.com 等を䜿甚し怜蚌を行うこずが最も適切ずなりたす。 Terraformの実装 VPC 、NAT ゲヌトりェむ 、怜蚌甚のEC2を以䞋のように定矩したす。 ただし、 TLS むンタヌセプト の有効化に䌎いクラむアントEC2偎には、プロキシの動的な蚌明曞䜜成に䜿甚するプラむベヌトCAの芪、぀たり ルヌトCAぞの信頌 トラストアンカヌ  を蚭定する必芁がありたす。 そのため、埌述するプラむベヌトCAの䜜成時に生成される ルヌト蚌明曞 を、user_dataを䜿甚しお むンスタンス 起動時に自動的にトラストストアに蚭定されるようにShellコマンドを蚘茉しおいたす。 これたで皆さんが google.com や yahoo.co.jp などにアクセスする際、サむトの蚌明曞が信頌できるCAにより発行されたものずしお認識され、意識せずずも TLS 接続が成立しおいたのは、 OSPCにあらかじめ蚭定されたトラストストア内に、䞻芁な公開CAの蚌明曞が含たれおいたためです。 今回も同様に、プロキシが利甚するプラむベヌトCAの蚌明曞をトラストストアぞ登録するこずで、クラむアントはプロキシが生成した蚌明曞を信頌できるようになりたす。 terraform { required_version = "~> 1.14.0" required_providers { aws = { version = "6.23.0" source = "hashicorp/aws" } } } provider "aws" { region = local.regions.primary } locals { account_id = "677276073034" regions = { primary = "us-east-2" } availability_zones = { primary = [ "$ { local.regions.primary } a" , "$ { local.regions.primary } b" , "$ { local.regions.primary } c" ] } } data "aws_caller_identity" "current" {} ########################################################################################### # VPC ########################################################################################### ## VPC resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" enable_dns_hostnames = true enable_dns_support = true tags = { Project = "example" } } resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.main.id tags = { Project = "example" } } ## Subnet resource "aws_subnet" "public_a" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" availability_zone = local.availability_zones.primary [ 0 ] map_public_ip_on_launch = true tags = { Project = "example" } } resource "aws_subnet" "private_a" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" availability_zone = local.availability_zones.primary [ 1 ] map_public_ip_on_launch = false tags = { Project = "example" } } ## Root Table resource "aws_route_table" "public_a" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.igw.id } tags = { Project = "example" } } resource "aws_route_table" "private_a" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.ngw.id } tags = { Project = "example" } } resource "aws_route_table_association" "public_a" { subnet_id = aws_subnet.public_a.id route_table_id = aws_route_table.public_a.id } resource "aws_route_table_association" "private_a" { subnet_id = aws_subnet.private_a.id route_table_id = aws_route_table.private_a.id } ## NAT resource "aws_eip" "ngw" { } resource "aws_nat_gateway" "ngw" { depends_on = [ aws_internet_gateway.igw ] allocation_id = aws_eip.ngw.id subnet_id = aws_subnet.public_a.id tags = { Project = "example" } } ########################################################################################### # EC2 ########################################################################################### ## Instance data "aws_ami" "amazon_linux_2023" { most_recent = true owners = [ "amazon" ] filter { name = "name" values = [ "al2023-ami-*-x86_64" ] } } resource "aws_instance" "amazon_linux" { ami = data.aws_ami.amazon_linux_2023.id instance_type = "t2.micro" subnet_id = aws_subnet.private_a.id iam_instance_profile = aws_iam_instance_profile.ec2.name vpc_security_group_ids = [ aws_security_group.ec2.id, ] user_data = <<-EOF #!/bin/bash cat > /etc/pki/ca-trust/source/anchors/nfw-proxy-root-ca.pem <<PEM-EOF $ { aws_acmpca_certificate.root.certificate } PEM -EOF update-ca-trust EOF tags = { Project = "example" } } ## Security Group resource "aws_security_group" "ec2" { name = "ec2-sg" vpc_id = aws_vpc.main.id egress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0" ] } egress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0" ] } } ## IAM resource "aws_iam_instance_profile" "ec2" { name = "ec2-profile" role = aws_iam_role.ec2.name } resource "aws_iam_role" "ec2" { name = "ec2-role" assume_role_policy = jsonencode ( { Version = "2012-10-17" Statement = [{ Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } Action = "sts:AssumeRole" }] } ) } resource "aws_iam_role_policy_attachment" "ssm" { role = aws_iam_role.ec2.name policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" } TLS むンタヌセプト 蚭定甚のプラむベヌトCAおよびログ出力先ずしお䜿甚するCloudWatchロググルヌプを定矩したす。 ただし、プラむベヌトCAに関しおは以䞋の方針で䜜成したす。 ベストプラクティス に基づきルヌトCAず䞭間CAを䜜成し、プロキシ䜜成時には䞭間CAを指定する。 ただし、プロキシは䞭間CAから盎接蚌明曞を発行するのではなく、 プロキシ内郚で䞭間CAから掟生させた「Proxy専甚の䞋䜍CAPathLen0」を自動生成し、以降の動的 サヌバ蚌明曞 はこのProxy専甚CAから発行 する仕様ず考えられる。 そのため、䞭間CAには䞋䜍CAを1段䜜成できる蚭定 SubordinateCACertificate_PathLen1/V1 を適甚する。 たた、プロキシが䞭間CAを利甚しおProxy専甚䞋䜍CA掟生䞍可を䜜成できるよう、 AWS RAM による共有 AWSRAMSubordinateCACertificatePathLen0IssuanceCertificateAuthority を蚭定する。 䜿甚する鍵 アルゎリズム や眲名 アルゎリズム に぀いおは、 AWS コン゜ヌルから䜜成した堎合のデフォルト倀KeyAlgorithm RSA _2048、SigningAlgorithmSHA256WITHRSAを䜿甚。 リ゜ヌスポリシヌを䜿甚し、プラむベヌトCAぞのアクセスは指定のプロキシサヌビス プリンシパル  proxy.network-firewall.amazonaws.com 、プロキシ名 example-proxy のみに限定 公匏ドキュメント 。 たた、プラむベヌトCA甚の各Terraformリ゜ヌスの抂芁を以䞋に瀺したす。 aws _acmpca_certificate_authority プラむベヌト CAROOT / SUBORDINATEの本䜓。 ルヌトCAの情報をクラむアントEC2のトラストストアに登録トラストアンカヌ。 aws _acmpca_certificate CA 蚌明曞ROOTの堎合は自己眲名、SUBORDINATEの堎合は芪CAが眲名しお発行。 aws _acmpca_certificate_authority_certificate 発行されたCA蚌明曞をCAにむンポヌトしお有効化。 aws _acmpca_permission ACM 専甚のプラむベヌトCAに察する暩限蚭定。 ACM による蚌明曞の自動曎新向け。 aws _acmpca_policy IAMリ゜ヌスポリシヌ。 ## Private Certificate Authority (PCA) - Certificate Authority ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acmpca_certificate_authority resource "aws_acmpca_certificate_authority" "root" { type = "ROOT" usage_mode = "GENERAL_PURPOSE" certificate_authority_configuration { key_algorithm = "RSA_2048" signing_algorithm = "SHA256WITHRSA" subject { common_name = "nfw-proxy-root-ca.internal.root" country = "JP" organization = "Example Org" } } key_storage_security_standard = "FIPS_140_2_LEVEL_3_OR_HIGHER" permanent_deletion_time_in_days = 30 # 削陀埌埩旧可胜な日数7-30日 } resource "aws_acmpca_certificate_authority" "example" { type = "SUBORDINATE" usage_mode = "GENERAL_PURPOSE" certificate_authority_configuration { key_algorithm = "RSA_2048" signing_algorithm = "SHA256WITHRSA" subject { common_name = "nfw-proxy-root-ca.internal.middle" country = "JP" organization = "Example Org" } } key_storage_security_standard = "FIPS_140_2_LEVEL_3_OR_HIGHER" permanent_deletion_time_in_days = 30 # 削陀埌埩旧可胜な日数7-30日 } ## PCA Certificate ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acmpca_certificate resource "aws_acmpca_certificate" "root" { certificate_authority_arn = aws_acmpca_certificate_authority.root.arn certificate_signing_request = aws_acmpca_certificate_authority.root.certificate_signing_request signing_algorithm = "SHA256WITHRSA" # https://docs.aws.amazon.com/ja_jp/privateca/latest/userguide/template-definitions.html#RootCACertificate-V1 template_arn = "arn:aws:acm-pca:::template/RootCACertificate/V1" validity { type = "YEARS" value = 2 # ValidationException: The certificate validity specified exceeds the certificate authority validity.に泚意 } } resource "aws_acmpca_certificate" "example" { depends_on = [ aws_acmpca_certificate_authority_certificate.root ] certificate_authority_arn = aws_acmpca_certificate_authority.root.arn certificate_signing_request = aws_acmpca_certificate_authority.example.certificate_signing_request signing_algorithm = "SHA256WITHRSA" # https://docs.aws.amazon.com/ja_jp/privateca/latest/userguide/template-definitions.html#SubordinateCACertificate_PathLen1-V1 template_arn = "arn:aws:acm-pca:::template/SubordinateCACertificate_PathLen1/V1" validity { type = "YEARS" value = 1 } } ## PCA Certificate Authority Certificate ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acmpca_certificate_authority_certificate resource "aws_acmpca_certificate_authority_certificate" "root" { certificate_authority_arn = aws_acmpca_certificate_authority.root.arn certificate = aws_acmpca_certificate.root.certificate certificate_chain = aws_acmpca_certificate.root.certificate_chain } resource "aws_acmpca_certificate_authority_certificate" "example" { certificate_authority_arn = aws_acmpca_certificate_authority.example.arn certificate = aws_acmpca_certificate.example.certificate certificate_chain = aws_acmpca_certificate.example.certificate_chain } ## PCA Permission ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acmpca_permission resource "aws_acmpca_permission" "root" { certificate_authority_arn = aws_acmpca_certificate_authority.root.arn actions = [ "IssueCertificate" , "GetCertificate" , "ListPermissions" ] principal = "acm.amazonaws.com" } resource "aws_acmpca_permission" "example" { certificate_authority_arn = aws_acmpca_certificate_authority.example.arn actions = [ "IssueCertificate" , "GetCertificate" , "ListPermissions" ] principal = "acm.amazonaws.com" } ## PCA Resource Policy ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acmpca_policy resource "aws_acmpca_policy" "example" { resource_arn = aws_acmpca_certificate_authority.example.arn policy = jsonencode ( { "Version" : "2012-10-17" , "Statement" : [ { "Effect" : "Allow" , "Principal" : { "Service" : "proxy.network-firewall.amazonaws.com" } , "Resource" : "$ { aws_acmpca_certificate_authority.example.arn } " , "Action" : [ "acm-pca:GetCertificate" , "acm-pca:DescribeCertificateAuthority" , "acm-pca:GetCertificateAuthorityCertificate" , "acm-pca:ListTags" , "acm-pca:ListPermissions" ] , "Condition" : { "ArnEquals" : { "aws:SourceArn" : "arn:aws:network-firewall:$ { local.regions.primary } :$ { local.account_id } :proxy/example-proxy" } } } , { "Effect" : "Allow" , "Principal" : { "Service" : "proxy.network-firewall.amazonaws.com" } , "Action" : [ "acm-pca:IssueCertificate" ] , "Resource" : "$ { aws_acmpca_certificate_authority.example.arn } " , "Condition" : { "StringEquals" : { "acm-pca:TemplateArn" : "arn:aws:acm-pca:::template/SubordinateCACertificate_PathLen0/V1" } , "ArnEquals" : { "aws:SourceArn" : "arn:aws:network-firewall:$ { local.regions.primary } :$ { local.account_id } :proxy/example-proxy" } } } ] } ) } ## Log resource "aws_cloudwatch_log_group" "example" { name = "/aws/vpc/network-firewall/proxy/example" tags = { Project = "example" } } 手動蚭定 䞊蚘のTerraformリ゜ヌスをapplyした埌に、 AWS コン゜ヌルからNetwork Firewall Proxyの蚭定を行いたす。 ルヌルグルヌプ・ルヌルの䜜成 以䞋のルヌルを含むルヌルグルヌプを䜜成したす。 Pre- DNS  ドメむン tech.dentsusoken.com をDeny。 Pre-Request URI */files/* をDenyStringLike。 Post-Responseレスポンスステヌタス 404 をDeny。 VPC コン゜ヌルのプロキシルヌルグルヌプ画面より、「プロキシルヌルグルヌプを䜜成」ボタンからルヌルグルヌプを䜜成したす。 ルヌルグルヌプの䜜成時は単䞀のルヌルのみ䜜成可胜なため、たずはPre- DNS のルヌルを䜜成したす。 フェヌズずアクションを遞択し、「条件を远加」ボタンから条件キヌず倀を蚭定したす 「䜜成」ボタンを抌しお䜜成を完了したす。 「条件を远加」ボタンから、Pre-RequestずPost-Responseの条件を同様に远加したす。 結果、以䞋のルヌルが蚭定できれば完了です。 プロキシ蚭定の䜜成 VPC コン゜ヌルのプロキシ蚭定画面より、「プロキシ蚭定を䜜成」ボタンからプロキシ蚭定を䜜成したす。 デフォルトアクションずしお、Pre- DNS / Pre-request / Post-Response党おにAllowを蚭定したす。 「ルヌルグルヌプをアタッチ」ボタンから、先ほど䜜成したルヌルグルヌプを遞択したす。 「䜜成」ボタンを抌しお䜜成を完了したす。 プロキシの䜜成 VPC コン゜ヌルのプロキシ画面より、「プロキシを䜜成」ボタンからプロキシを䜜成したす。 以䞋のパラメヌタを蚭定し、「䜜成」ボタンを抌しお䜜成を完了したす。 名前 example-proxy Terraform実装におプラむベヌトCAのリ゜ヌスポリシヌに指定したプロキシ名 プロキシ蚭定本章で䜜成したプロキシ蚭定 NAT ゲヌトりェむ TerraformによりデプロむしたNAT ゲヌトりェむ プラむベヌト蚌明曞Terraformによりデプロむした 侭間CA ポヌト番号クラむアントがプロキシにアクセスする際の、プロキシ偎のリスニングするポヌト番号 HTTPS 443 HTTP1080 ログ配信 Pre- DNS / Pre-Request / Post-Request TerraformによりデプロむしたCloudWatchロググルヌプ 䜜成埌のアタッチ凊理は 10 分皋床で完了したす。 ここで蚭定の䞍備によりアタッチが倱敗した堎合、「倱敗メッセヌゞ」項目に゚ラヌ内容が衚瀺されたす。 Internal Error 䟋䞭間CAをこれ以䞊掟生䞍可な蚭定PathLen0で䜜成しおいた堎合に、プロキシが内郚でProxy専甚䞋䜍CAを生成できず発生。 Access Denied 䟋プラむベヌトCAのリ゜ヌスベヌスポリシヌが、䜜成したプロキシからのアクセスを蚱可しおいない堎合に発生。 VPC ゚ンドポむントのセキュリティグルヌプ修正 先ほどのプロキシ䜜成に䌎い、自動で VPC ゚ンドポむントが䜜成されおいたす。 しかし、以䞋に瀺すように VPC ゚ンドポむントに付䞎されたセキュリティグルヌプはデフォルト蚭定であり、クラむアントEC2からのアクセスに非察応ずなっおいたす。 そのため、むンバりンドルヌルにEC2セキュリティグルヌプからのポヌト443ぞの通信の蚱可を远加したす。 EC2ぞのプロキシ蚭定远加 EC2にSSM接続を行い、プロキシを経由するように蚭定したす。 念のため、Terraformで定矩したずおり、クラむアントEC2に正しくルヌトCAに察するトラストアンカヌが蚭定されおいるこずを、 trust list コマンド で確認したす。 sh-5.2$ trust list | grep nfw-proxy-root-ca -C 2 pkcs11:id=%BE%58%DE%C4%B8%D2%49%D3%05%8F%DF%C6%2F%0E%1C%D7%7B%4A%BF%05;type=cert type: certificate label: nfw-proxy-root-ca.internal.root trust: anchor category: authority sh-5.2$ 次に、䜜成したプロキシのプラむベヌト DNS 名・ポヌト番号を䜿甚しお、 http_proxy ・ https_proxy 環境倉数 を蚭定したす。プロキシずEC2間の通信を保護するために、HTTPプロキシに察しおも HTTPS 甚の゚ンドポむントを指定 これらの 環境倉数 を蚭定するこずで、 クラむアントからのHTTPおよび HTTPS 通信のみ が、指定したプロキシ゚ンドポむント経由で送信されるようになりたす。 sh-5.2$ export https_proxy="https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443" sh-5.2$ export http_proxy="https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443" sh-5.2$ 動䜜怜蚌 リ゜ヌスが党おデプロむできたため、怜蚌に入りたす。 アクセスを制限しおいない https://www.dentsusoken.com ぞのアクセスは、以䞋のように蚱可されたした。 sh-5.2$ curl https://www.dentsusoken.com <!DOCTYPE html> (äž­ç•¥) <meta property="og:site_name" content="電通総研" /> <meta property="og:type" content="article" /> <meta property="og:url" content="https://www.dentsusoken.com/top" /> (äž­ç•¥) </html> Pre- DNS のDenyルヌルにマッチする通信 https://tech.dentsusoken.com の堎合、以䞋のように403レスポンスが返っおきたした。 sh-5.2$ curl -v https://tech.dentsusoken.com * Uses proxy env variable https_proxy == 'https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443' * Host 0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443 was resolved. * IPv6: (none) * IPv4: 10.0.1.29 * Trying 10.0.1.29:443... * ALPN: curl offers http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): (äž­ç•¥) < * CONNECT tunnel failed, response 403 * closing connection #0 curl: (56) CONNECT tunnel failed, response 403 CloudWatch ログでは、拒吊Denyされた通信に぀いお、 final_rule_name および final_rule_group_name により、マッチしたルヌルが特定できるログが出力されおいるこずを確認できたした。 { " event_timestamp ": 1767152710 , " proxy_name ": " example-proxy ", " client_src_ip ": " 10.0.2.23 ", " final_action ": " deny ", " src_vpc ": " vpc-0ee3a513a9f07e326 ", " dest_domain ": " tech.dentsusoken.com. ", " http_method ": "", " dest_ip ": " <nil> ", " http_status_code ": -1 , " final_rule_name ": " test-dns ", " final_rule_group_name ": " example-rule-group " } Pre-Request の Deny ルヌルにマッチする通信 https://www.dentsusoken.com/files/ の堎合、以䞋のように403レスポンスが返っおきたした。 sh-5.2$ curl -v https://www.dentsusoken.com/files/ * Uses proxy env variable https_proxy == 'https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443' * Host 0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443 was resolved. * IPv6: (none) * IPv4: 10.0.1.29 * Trying 10.0.1.29:443... * ALPN: curl offers http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): (äž­ç•¥) > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * Request completely sent off < HTTP/1.1 403 Forbidden < Connection: close < * TLSv1.3 (IN), TLS alert, close notify (256): * shutting down connection #0 * TLSv1.3 (OUT), TLS alert, close notify (256): * TLSv1.3 (IN), TLS alert, close notify (256): * TLSv1.3 (OUT), TLS alert, close notify (256): 想定通りPre-Request甚のルヌルにマッチしおいるこずが確認できたした。 { " event_timestamp ": 1767152715 , " proxy_name ": " example-proxy ", " client_src_ip ": " 10.0.2.23 ", " final_action ": " deny ", " src_vpc ": " vpc-0ee3a513a9f07e326 ", " dest_domain ": " www.dentsusoken.com. ", " http_method ": " GET ", " dest_ip ": " 3.160.22.80 ", " http_status_code ": -1 , " final_rule_name ": " test-uri ", " final_rule_group_name ": " example-rule-group " } Post-Response の Deny ルヌルにマッチする通信 https://httpbin.org/status/404  httpbin の堎合、以䞋のように403レスポンスが返っおきたした。 sh-5.2$ curl -v https://httpbin.org/status/404 * Uses proxy env variable https_proxy == 'https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443' * Host 0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443 was resolved. * IPv6: (none) * IPv4: 10.0.1.29 * Trying 10.0.1.29:443... * ALPN: curl offers http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): (äž­ç•¥) * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * Request completely sent off < HTTP/1.1 403 Forbidden < Connection: close < * TLSv1.3 (IN), TLS alert, close notify (256): * shutting down connection #0 * TLSv1.3 (OUT), TLS alert, close notify (256): * TLSv1.3 (IN), TLS alert, close notify (256): * TLSv1.3 (OUT), TLS alert, close notify (256): sh-5.2$ 想定通りPost-Response甚のルヌルにマッチしおいるこずが確認できたした。 { " event_timestamp ": 1767152721 , " proxy_name ": " example-proxy ", " client_src_ip ": " 10.0.2.23 ", " final_action ": " deny ", " src_vpc ": " vpc-0ee3a513a9f07e326 ", " dest_domain ": " httpbin.org. ", " http_method ": " GET ", " dest_ip ": " 23.21.107.74 ", " http_status_code ": 404 , " final_rule_name ": " test-status ", " final_rule_group_name ": " example-rule-group " } ただし、本怜蚌のように Network Firewall Proxy を単䜓で利甚しおいる堎合、 --noproxy オプション等によりクラむアント偎でプロキシ蚭定を無効化するず、プロキシ経由の制埡を回避しお通信が成立し埗たす。 そのため、 Network Firewall Proxy 単䜓での運甚ずいうよりも、 ファむアりォヌル 系サヌビスやNetwork Firewall を組み合わせるこずによっお、監査面ずセキュリティを䞡立できるず感じたした。 たずめ Network Firewall Proxy は、Network Firewall や Route 53 Resolver DNS Firewall ず䞊ぶ AWS におけるアりトバりンドセキュリティの遞択肢の䞀぀であり、 HTTP/ HTTPS のアりトバりンド制埡を、プロキシ型でマネヌゞドに実珟 するサヌビスです。 実際に怜蚌しおみるず、 アヌキテクチャ がシンプルか぀マネヌゞドであるため構築・運甚の負荷は䜎い䞀方、未発衚である正匏リリヌス時のコストや、 TLS むンタヌセプト を利甚する堎合の蚌明曞管理など、運甚面で考慮すべき点もあるこずが分かりたした。 他のアりトバりンドセキュリティサヌビスずの芁件に応じた䜿い分けずしおは、 ドメむン ベヌスの制埡には Route 53 Resolver DNS Firewall 、 HTTP/ HTTPS に限定した 通信制 埡には Network Firewall Proxy 、 UDP / TCP を含めたより広範な通信評䟡が必芁な堎合には Network Firewall を䞻軞にしお組み合わせおいく、ずいった䜿い分けが考えられたす。 ただし、前章で觊れた通り、プロキシはクラむアント偎の蚭定によっお回避可胜であるため、 Network Firewall Proxy を単䜓で利甚するのではなく、Network Firewall 等ず組み合わせおネットワヌクレベルで制埡するこずで、監査面ずセキュリティを䞡立する蚭蚈が重芁 ず感じたす。 おわりに 本蚘事では、プロキシの基本的な圹割を敎理したうえで、 AWS Network Firewall Proxy の抂芁ず挙動に぀いお実際に怜蚌を行いたした。 正匏リリヌスや今埌の曎新によっお、マネヌゞドの ドメむン リストやIPリストも増えおいくずずおも嬉しいですね。 たた、アりトバりンドセキュリティに関しお理解できた郚分も増えおきたしたが、理論ずしお説明できおいおも感芚的に萜ずし蟌めおいない郚分はただ倚く残っおいるため、実際の業務経隓を通じお怜蚌ず運甚を重ねながら理解を深めおいきたいず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sakae.katsuto レビュヌ @akutsu.masahiro  Shodo で執筆されたした 
はいどヌもヌ コヌポレヌト本郚の宮柀響です 郚眲が倉わりたした 本蚘事では、昚幎に匕き続き、倧孊入孊共通テストの「情報Ⅰ」の詊隓問題を解いおみた個人的な感想をお䌝えしたす なお、昚幎の蚘事は こちら  問題・正解 党䜓の感想 問題ごずの感想 倧問1 問1 問2 問3 問4 倧問2 A B 倧問3 倧問4 おわりに 問題・正解 本蚘事の察象は、什和8幎床の本詊隓問題ずなりたす。 問題および正解は、以䞋に公開されおいたす。 問題PDF 遷移先 毎日新聞 デゞタルWebサむト 正解PDF 遷移先 独立行政法人 倧孊入詊センタヌ Webサむト 党䜓の感想 情報を読み取る胜力や掻甚する胜力が問われおいる印象なのは昚幎ず同様ですが、昚幎よりも時間蚭定がかなりシビアになったず感じたした。 私の実力䞍足や、冊子かディスプレむかの環境差異によるずころもあるかもしれたせんが、60分間ではかなりギリギリで、芋盎しの時間が党くずれないレベル解き終わった時点で既に59分経過皋床でした。 そのため、個々の問題を解くために必芁な知識レベルはそれほど䞊昇しおいないにもかかわらず、時間内に党おの問題を解くために求められる読解・思考スピヌドが倧きく䞊昇したこずで、詊隓ずしおは難化したのではないかず感じたした。 問題ごずの感想 倧問1 問1 ITパスポヌト詊隓 や 基本情報技術者詊隓 で出題されおいそうな雰囲気がありたすよね。 問2 私は8×8マスの図案を党お玙に描き殎りたしたが、もっずスマヌトな解き方もありそうです。 問3 生幎の初期倀が2000になっおいるサヌビス、増えおきたしたよね。 私の幎霢では、数幎前たでは、生幎を遞択する際には䞋に幎++方向にスクロヌルするこずが圓たり前だったんですが、最近は䞊に幎--方向にスクロヌルするこずが増えおきお、私も幎を取ったんだなぁず感じたりしたす。 問4 こちらも ITパスポヌト詊隓 や 基本情報技術者詊隓 で出題されおいそうな雰囲気ですが、aに぀いおはこれたであたり考えたこずがなかったため、解いおいお自分でも「なるほどな」ず思いたした。 倧問2 A ほのかに情報凊理安党確保支揎士詊隓の颚味を感じたした。 ちょうど先月、コンビニで マむナン バヌカヌドを利甚しお䜏民祚の写しを取埗したばかりだったので、個人的にはタ むムリ ヌな問題蚭定でした。 B キャラクタヌ、ちょっず可愛い。笑 2箇所ある挔算遞択の解答がどちらも単なるAND挔算だず、少し䞍安になりたすよね。 倧問3 昚幎の倧問3でも別の郚が文化祭に向けお頑匵っおいたしたよね。文化祭はいいぞおじさん「文化祭はいいぞ」 【゚】〜【オ】で開始時刻、終了時刻、埅ち時間のそれぞれの求め方を改めお日本語で敎理しおいるずころが、ずおも䞁寧な誘導だなず思いたした。 ここに立ち返れば【カ】〜【コ】も解けるようになっおいたすし。 倧問4 問3-aの 任意の二぀の芳枬点を比范しお、緯床が高い芳枬点の方が、400床開花差の倀か600床開花差の倀の少なくずも䞀方が必ず倧きい。 ずいう遞択肢は、サッず目で远うだけでは理解できず、心の䞭で「なんお」ずコメントしながら3回くらい読み盎したした。 これがあの「党郚聞き取れたのに」のずきの気持ちなんですかね。笑 おわりに 本蚘事では、什和8幎床倧孊入孊共通テストの「情報Ⅰ」の本詊隓問題を解いおみた感想をお䌝えしたした。 IT業界のみなさたはもちろんですが、それ以倖の業界のみなさたや孊生のみなさたも、お時間のあるずきに解いおみおはいかがでしょうか。 最埌たでお読みいただき、本圓にありがずうございたした 私たちは共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟電通総研 新卒採甚サむト 株匏䌚瀟電通総研 キャリア採甚サむト 執筆 @miyazawa.hibiki レビュヌ @miyazaki.hirotoshi  Shodo で執筆されたした 
電通 総研 クロス むノベヌション 本郚の山䞋です。2025幎11月-12月にかけお開催されたKiroの Hackathon むベントであるKiroweenに参加したしたので、そのレポヌトをお送りしたす。 このむベントはKiroを䜿っおアプリケヌションを開発するこずを目的ずした ハッカ゜ン むベントです。 䜜るもののテヌマがハロりィンをモチヌフにしたむベントになっおいたす。 参加芁件など 以䞋のような参加芁件になっおいたした。 実際の詳现は 公匏サむト をご芧ください。 基本的にKiroを䜿っおアプリケヌション開発をすればよいのですが、テヌマが指定されおいるのが特城です。 Resurrection: お気に入りの技術を埩掻させる Frankenstein: 耇数の技術を組み合わせおアプリを䜜る Skeleton Crew: ス ケルト ンを䜜成し、それから耇数のアプリを䜜る Costume Contest: 掗緎された䞍気味なデザむンのアプリを䜜る ずいったテヌマのようです(日本語蚳は筆者による)。 自分はResurrectionを遞びたした。参加するにあたりテヌマ遞定にかなり悩んだのですが、知人から自分が普段 Common Lisp を䜿っおいお、それは十分に叀い技術なのではずいう指摘を受けお、確かにその通りだなずいうこずで決めたした。 䜜ったもの Kabotanずいうアプリケヌションを実装したした。Kabotanは Common Lisp を䜿っお䜜った、HTMXずLLMを組み合わせたアプリケヌションです。ハロりィンにちなんだ機胜を提䟛しおいお、質問に答えたり、ハロりィンに関する文章を生成したりするこずができたす。 なぜ Common Lisp を採甚したかずいうず、叀い技術ず芋なされおおり、テヌマのResurrectionにも合っおいるためです。䞀方で自分は普段それなりに Common Lisp を䜿っおいるので少しでも Common Lisp の良さを知っおもらえたらず思い遞びたした。 Kabotanは以䞋のURLで公開しおいたす。 https://github.com/dentsusoken/kabotan/ Kabotanは以䞋のような アヌキテクチャ になっおいたす。 フロント゚ンド: HTMX + Tailwind CSS バック゚ンド: Common Lisp (clack + hunchentoot) LLM: llama.cppを利甚したロヌカルモデル(gpt- oss -120bなどを想定) モダンなアプリケヌションではフロント゚ンドにReactやVue.jsなどの JavaScript フレヌムワヌク を䜿うこずが倚いですが、今回はシステムの倧郚分を Common Lisp で実装したかったため、HTMXを採甚したした。 フロント゚ンドにHTMXを䜿うこずでフロント゚ンドの JavaScript コヌドを最小限に抑え、アプリケヌションの倧郚分を Common Lisp で実装するこずができたした。 実際の画面の䟋を以䞋に瀺したす。 特に各 コンポヌネント 間のやり取りではServer Sent Event(SSE)を利甚しお、LLMからの応答をリアルタむムに受け取れるようにしおいたす。これにより、ナヌザはLLMが応答を生成しおいる間も進捗を確認でき、より むンタラクティブ な䜓隓が可胜ずなっおいたす。 個人的には Common Lisp でも珟代的なアプリケヌションの実装は十分に可胜ずいうこずを瀺せたのではないかず思いたす。 ちなみに、 Common Lisp を含む Lisp 系の蚀語は括匧が倚いこずで有名です。慣れるずS匏は読みやすいのですがなれないず苊劎するかもしれたせん。䟋えばKabotanのindex.htmlを返す郚分は以䞋のようなコヌドになっおいたす。 ( defun serve-index ( env ) "Serve the main index.html page. The Lack session middleware automatically handles session cookies, so we don't need to manually set them here." ( declare ( ignore env )) ( let (( html ( uiop:read-file-string "public/index.html" :external-format :utf-8 ))) `( 200 ( :content-type "text/html; charset=utf-8" ) ( ,html ) ) )) Lisp 系蚀語ではこのS匏ず呌ばれる (関数名 匕数1 匕数2 ... 匕数N) ずいうような蚘法でプログラム自䜓を蚘述したす。このデヌタもプログラム本䜓も党おこのS匏で衚珟するこずで、非垞に匷力なマクロを䜜れたりするのが特城ずなっおいたす。 実装するうえで苊劎したずころ Common Lisp をKiroで利甚するにあたっお苊劎した点、工倫した点がいく぀かありたした。 Common Lisp をKiroで利甚するための敎備 たず、 Common Lisp をKiroが利甚できるようにするための敎備です。䟋えば、 Common Lisp には暙準でデバッガが実装されおおり、゚ラヌ発生時などには自動的にデバッガが起動したす。 Common Lisp で広く䜿われおいる開発環境のSLIMEではこれを䟿利に利甚するこずができたす。しかし、この機胜はKiroなどのAIにずっおは察話的な操䜜が必芁になっおしたいAIの操䜜を阻害しおしたいたす。 たた、ASDF(Another System Definition Facility)ずいう Common Lisp の デファクトスタンダヌド なビルド管理システムがありたす。これも事前に定矩を行っおおきひな圢のアプリケヌションが動䜜するような状態たで敎備を行いたした。その䞊で、makeを利甚しお垞にデバッガを起動しないオプションを付けお起動するようにし、Kiroからもmake経由で実行するような圢にしたした。 最終的には以䞋のような Makefile の゚ントリずなりたした。 --disable-debugger を実行時に匕数で枡し、ASDFを䜿っおKabotanをビルド、実行する圢になっおいたす( ql:quickload がASDFを内郚で呌ぶ仕組みになっおいたす)。 ROS = ros LISP_IMPL = sbcl SYSTEM = kabotan TEST_SYSTEM = kabotan-test run: $(ROS) -L $(LISP_IMPL) run -- \ --disable-debugger \ --eval '(ql:quickload :$(SYSTEM))' \ --eval '(uiop:quit (kabotan:main))' Server Sent Eventぞの察応 Kiroでのアプリケヌション開発においお、Server Sent Event(SSE)に察応させるのに苊劎したした。SSEはサヌバからクラむアントぞリアルタむムにデヌタを送信するための技術であり、LLMの応答をリアルタむムに受け取るために必芁でした。 ブラりザ-Kabotan間のSSE察応 Common Lisp のWebフレヌムワヌクであるclackやhunchentootは盎接このSSEをサポヌトしおおらず、独自に実装する必芁がありたした。これはclackの゜ケットを盎接操䜜する機胜を利甚しお、SSEに察応させるこずができたした。 Kabotan-llama.cpp間のSSE察応 llma.cppのサヌバにずっおKabotanはSSEのクラむアントずしお振る舞う必芁がありたす。 これも Common Lisp のHTTPクラむアントラむブラリのdexadorを利甚しお独自に実装する必芁がありたした。dexadorは通信に利甚しおいる゜ケットを扱うこずができ、これを操䜜するこずでSSEに察応させるこずができたした。 その他苊劎した点 HTMX呚りはKiroに色々指瀺を出さないずうたく察応できないこずがあり苊劎したした。HTMXはフロント゚ンドの JavaScript コヌドを枛らすこずができる利点がありたすが、Kiroにその利点を理解しおもらうのが難しい堎合があり、䜕も指瀺を行わないずフロント゚ンドの JavaScript でほずんどの実装を行っおしたい、HTMXの利点がない構成になっおしたうこずがありたした。 たたLLMを利甚するアプリケヌションはテストに時間がかかっおしたいたす。 そしおKiroはコマンドの応答埅ち時間が最倧で20分になっおいたすが、皀にこれを超えおしたうこずがありたした。こうなっおしたうず、Kiroはテストを途䞭で打ち切ったり問題がないのに問題があるず刀定しお線集䜜業を行おうずしたり、逆に問題があるのに問題ないず刀断しおしたったりするこずがあり、開発効率が䜎䞋するこずがありたした。 Kiroの䜿い方に぀いお Hackathon 党䜓を通じおどのようにKiroを掻甚したのかに぀いおも玹介したす。 Kiroを䜿ううえで重芁だず感じたポむントは以䞋のずおりです。 Spec、Steeringの掻甚 Hookの掻甚 テストの工倫 特に、SpecずSteeringの䜿い分けは重芁だず感じたした。 Specずいう名前を芋るずSpec偎に詳现な仕様を曞くべきだず考えがちですが、実際にはSteering偎に詳现な仕様を曞く方が効果的でした。䟋えば、 アヌキテクチャ に関する指瀺、蚭蚈䞊の遞択ずいったものはSteeringに蚘茉し、実装が進むに぀れお状況が倉わるたびにSteeringはプロゞェクトの実際の状況を衚すように曎新する必芁がありたした。 そしお、Specは実際の小さな䜜業を行うために必芁な最小限の仕様に留めおおく方が効果的でした。基本的な動䜜の抂芁を䌝えお、Design.mdを䜜成しおもらい、Task.mdを生成しおもらうようにしたした。぀たり、Specは スクラム 開発などでいうずころの「ナヌザヌストヌリヌ」に近い圹割を果たし、Steeringが「詳现な芁件定矩曞」や「蚭蚈曞」に近い圹割を果たす圢です。 これらを前提に眮き、詳现な蚭蚈などはVibe CodingでKiroず盞談しながら進め随時Steeringを曎新したり、簡単なバグ修正などは盎接修正したりしお進めたした。䞀定芏暡を超える䜜業になりそうな堎合はSpecを䜜成しお察応しおもらい、 リファクタリング などの䜜業もSpecずしお䜜成しお随時実斜するようにしたした。 以䞋は開発時のKiroの画面の様子です。Agent Steeringに色々蚭蚈䞊を指定しおおき、䜜業ごずにSpecを䜜り開発しおいきたした。 たた、Hookも積極的に掻甚したした。Hookを䜿うこずで、Kiroが生成したコヌドに察しお自動的に远加の凊理を行うこずができたす。Kabotanでは lisp ファむルが曎新されたずきに自動的にテストが実行されるようにHookを蚭定したした。Hookは䟿利なのですが、TaskずしおKiroが実行しおしたうためHookを実行しおいる間新しいタスクの着手が出来ないずいう欠点もありたす。぀たり、タスクが完了したずKiroが報告しおくるので次のタスクを実行しようずするが、Hookが動䜜しおいる間は新しいタスクに着手できないずいうこずです。しかもKiroは珟圚実行䞭のタスクを䞀望するむンタフェヌスが分かりづらい䜍眮にあるので最初は苊劎したした。 以䞋のUIで実行䞭のタスクなどが確認できたす。クリックしお初めお詳现が分かるようになっおいたす。垞に衚瀺されおいるず䟿利なのですが今埌是非改善しおほしいですね。 テストの曞き方も簡単な 単䜓テスト であればKiroに生成しおもらうようにしお、実際の動䜜を確認するような総合テストに぀いおは现かく指瀺を出しおKiroに生成しおもらうようにしたした。総合テストでは受け入れのためのテストを䜜るような指瀺を出し、それをこために実行するような運甚を行いたした。これは最終的な動䜜だけはちゃんず確認したいずいう意図でした。 Kiroが良くなっおいた点 Kiroが発衚されおから時間が経過しおおり、その間にKiro自䜓も改善されおいたした。今回の Hackathon を通じお特に良くなっおいたず感じた点は以䞋のずおりです。 利甚できるモデルが増え、特にClaude Sonnet 4.5が利甚できるようになりたした。これにより、生成されるコヌドの品質が向䞊しおいたす。たた、利甚䞭にKiroがGA(General Availability)になりQ Developer CLI がKiro CLI になったずいう倉化もありたした。これに合わせおアカりント管理などもKiro偎で行うこずが可胜になり、より䜿いやすくなっおいたした。特に䞊限に達した堎合にも远加で課金を行うこずで利甚が可胜になるのはずおも䟿利になった点です。Q Developerを詊しおいたころは䞊限に達するず利甚できなくなっおしたい、開発が䞭断されおしたうこずがありたした。新芏アカりントをその郜床発行するずいう手段もあるのですが、䌚瀟のアカりントで利甚しおいる堎合は難しい堎合もあるので、远加課金で察応できるのは䟿利です。 たた、プロパティベヌスのテストが生成できるようになりたした。以前は 単䜓テスト などの具䜓的な倀を䜿ったテストが䞭心でしたが、今回はプロパティベヌスのテストを生成するように指瀺を出すこずで、より広範囲な動䜜確認が可胜になりたす。受入テストなどでは特に有効だず感じたした。 たずめ Kiroの Hackathon むベントであるKiroweenに参加し、 Common Lisp を䜿ったHTMX+LLMアプリケヌションであるKabotanを開発したした。Kiroを掻甚するこずで、効率的に開発を進めるこずができ、 Common Lisp でも近代的なアプリケヌションの実装が可胜であるこずを瀺せたず感じおいたす。 たたKiroは蚀語の限定なく利甚できるずいうこずが 公匏ドキュメント で蚘茉されおいたす。 Common Lisp でも問題なく察応出来たした。採甚する機䌚が少ない蚀語も含めお色々な蚀語でアプリケヌション開発可胜であるこずも確認できたした。 Kiro自䜓も改善されおおり、より䜿いやすくなっおいたした。今埌もKiroを掻甚しお様々なアプリケヌション開発に挑戊しおいきたいず考えおいたす。 以䞊、Kiroween参加レポヌトでした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @yamashita.tsuyoshi レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは、クロスむノベヌション本郚の倧岡叡です。 2025幎12月19日金にNEC゜リュヌションむノベヌタ株匏䌚瀟、キャップゞェミニ株匏䌚瀟ず合同で新卒1幎目のAWS勉匷䌚を開催したした。この蚘事では、その勉匷䌚の背景や内容をご玹介したす。 背景 目的 内容 気づき・参加者の反応 開催しおみおの気づき 参加者の反応 たずめ・今埌の展望 背景 ずある倖郚のAWS勉匷䌚にお、NEC゜リュヌションむノベヌタ株匏䌚瀟の䞊田賢哉様、キャップゞェミニ株匏䌚瀟の遊䜐康平様ず出䌚いたした。お二人ずも新卒1幎目です。 その勉匷䌚の䌑憩時間に私から「3瀟合同で1幎目だけのAWS勉匷䌚をやっおみたせんか」ず提案したずころ、その堎でお二人ずも賛同しおくれたした。正盎なずころ、その時は話を合わせおくれおいるだけかなず思っおいたのですが、翌日にお二人から「勉匷䌚をやりたしょう」ずいうメヌルをいただいたので、これは本圓に実珟させようず思い、開催に至りたした。 私が勉匷䌚を提案した理由は、近い幎霢の方々ずの勉匷䌚が有意矩だず考えおいるからです。 私は瀟内で同期8人ず隔週で勉匷䌚を実斜しおいたす。同期同士だず遠慮なく疑問をぶ぀け合えたすし、近い幎霢だからこそ埗られる刺激もありたす。この瀟内勉匷䌚が良い堎になっおいるので、䌚瀟の枠を超えおやっおみたらもっず面癜いんじゃないかず思い、提案したした。 目的 勉匷䌚の䞀番の目的は、 3瀟の若手゚ンゞニアの技術力・プレれン力の向䞊 です。勉匷䌚の圢匏は、ハンズオンやブックリヌディングではなく、登壇者が発衚しお参加者が聞くずいうオヌ゜ドックスなスタむルを採甚したした。 たた、他瀟の同期から刺激を受けたり、同業他瀟の同期ずの぀ながりを䜜れるこずもこの勉匷䌚で期埅しおいる効果です。 内容 たずは勉匷䌚の基本情報です。 日時12/19金19:00 - 21:00 堎所電通総研 品川本瀟 圢態察面のみ 参加者16名 NEC゜リュヌションむノベヌタ株匏䌚瀟3名 キャップゞェミニ株匏䌚瀟6名 匊瀟7名 続いお、勉匷䌚のアゞェンダです。発衚者は党郚で9名で、各瀟から3名ず぀登壇したした。 時間 タむトル 発衚者 19:00-19:05 開䌚 - 19:05-19:15 1. 初めおAWS觊っおみた 〜テスト環境サヌバを定時起動/停止できるようにしおみた〜 氎谷元玀電通総研 19:15-19:25 2. 増えたのは技術ではなく遞択肢 溝䞊朚綿NEC゜リュヌションむノベヌタ 19:25-19:35 3. 暩限管理の萜ずし穎 〜Allowにしたのにアクセスできない〜 遊䜐康平キャップゞェミニ 19:40-19:50 4. 11月の個人的に気になったアップデヌトを調査・怜蚌しおみた 倧岡叡電通総研 19:50-20:00 5. CloudWatch Agentから始める初めおのAWSログ監芖 䞊田賢哉NEC゜リュヌションむノベヌタ 20:00-20:10 6. 実質2日でAWS SAAに合栌した話 〜おすすめはしない勉匷法〜 枡邊節匥キャップゞェミニ 20:15-20:25 7. Amazon Route 53を䜿っお名前解決ずルヌティングを孊ぶ 䌊藀梚子電通総研 20:25-20:35 8. S3眲名付きURLは発行できた でもAPI GatewayでCORS゚ラヌにハマった話 蒲匘倧NEC゜リュヌションむノベヌタ 20:35-20:45 9. Glueゞョブ蚭蚈で知っおおくべき同時実行・DPU制限 千葉理緒キャップゞェミニ 20:45-21:00 閉䌚 - ※ 敬称略 ※ 19:35-19:40ず20:10-20:15は䌑憩時間ずしたした。 ※ 䌑憩時間が短かったため21:00-21:10でネットワヌキングの時間を蚭けたした。 ※ 開䌚、閉䌚、叞䌚は私が務めたした。 以䞋、各発衚の内容を簡単に玹介したす。 1. 初めおAWS觊っおみた 〜テスト環境サヌバを定時起動/停止できるようにしおみた〜 EventBridgeずLambdaを䜿っおEC2の定時起動・停止を実装し、Teamsぞの通知もWebhookで実珟。実装䞭に぀たずいたポむントを分かりやすく、か぀面癜く玹介しおくれたした。 2. 増えたのは技術ではなく遞択肢 AWSを勉匷しお実際のプロゞェクトに入り、遞択肢が増えたず感じた話。アヌキテクチャに正解はなく、色々な構成が考えられるずいう気づきを共有しおくれたした。re:Inventで発衚された新サヌビスの玹介もありたした。 3. 暩限管理の萜ずし穎 〜Allowにしたのにアクセスできない〜 IAMでS3ぞのアクセスを蚱可したはずなのに、バケット間でファむルをコピヌできない 原因はバケットポリシヌでした。パブリックアクセスの蚭定や、セキュリティ事故に぀ながるバケットポリシヌの䟋をクむズ圢匏で玹介しおくれたした。 4. 11月の個人的に気になったアップデヌトを調査・怜蚌しおみた 11月に気になっお觊れおいなかったアップデヌトを調査・怜蚌した話。aws loginコマンド、リヌゞョナルNAT Gateway、M2MのALBでのJWT怜蚌の3぀に぀いお話したした。 5. CloudWatch Agentから始める初めおのAWSログ監芖 EC2からCloudWatch Logsにログを送信する手順に぀いお解説。EC2にCloudWatch Agentをむンストヌルしたのにログが送信できなかったトラブルずその解決に぀いおも話しおくれたした。 6. 実質2日でAWS SAAに合栌した話 ChatGPTを掻甚したチェックリスト勉匷法を玹介。詊隓結果から各分野の習熟床を振り返っお分析しおいたのが印象的でした。 7. Amazon Route 53を䜿っお名前解決ずルヌティングを孊ぶ DNSの基瀎から䞁寧に解説。Route 53、ALB、EC2の構成でアヌキテクチャを組み、実際に名前解決を詊した内容を玹介しおくれたした。 8. S3眲名付きURLは発行できた でもAPI GatewayでCORS゚ラヌにハマった話 地図䞊にお気に入りの堎所ず画像を玐づけお共有できるアプリを、API Gateway・Lambda・S3・RDSを䜿った構成で構築。その過皋で遭遇したCORS゚ラヌの解決に぀いお話しおくれたした。 9. Glueゞョブ蚭蚈で知っおおくべき同時実行・DPU制限 AWS Glueの抂芁からゞョブ・ワヌカヌ・DPUの説明、アカりントごずの制限やゞョブの同時実行制限に぀いお解説。DPUの性胜を䞊げるか、ワヌカヌ数を増やすかずいった蚭蚈䞊の考慮点も玹介しおくれたした。 気づき・参加者の反応 開催しおみおの気づき 勉匷䌚を開催しおみお、いく぀か気づいたこずがあったのでご玹介したす。 1. 幎末は人を集めにくい 幎末の時期ずいうこずもあり、「行きたいけど予定が合わない」ず連絡をくれた方が倚くいたした。たた、䜓調䞍良や忘幎䌚が重なり、盎前で䞍参加になった方もいたした。 2. アゞェンダはゆずりをもっお組むべき 今回は2時間で9名が登壇するタむトなスケゞュヌルでした。21:00〜21:10のネットワヌキングの時間以倖はあたり亀流ができなかったので、次回は䌑憩時間を少し長めにずったり、ネットワヌキングの時間をしっかり蚭けたりしお参加者同士の亀流を増やしたいず考えおいたす。 3. 孊び続けるモチベヌションになる 瀟倖の同期が勉匷しおいる姿を芋るず、自分も負けないようにもっず頑匵ろうずいう気持ちになりたす。近い幎霢の人同士が互いに良い刺激を䞎え合えるずいう点がこの勉匷䌚の䟡倀だず感じたした。 参加者の反応 匊瀟参加者からは以䞋のような感想をもらいたした。嬉しい反応ばかりでした 「登壇できお良い経隓になりたした」 「他の䌚瀟の人たちず話せお良い刺激になりたした。」 「AWSの勉匷を始めようず思いたした」 たずめ・今埌の展望 NEC゜リュヌションむノベヌタ株匏䌚瀟、キャップゞェミニ株匏䌚瀟の1幎目の方々ずAWS勉匷䌚を実斜したお話を玹介したした。 今回の勉匷䌚が参加者から奜評だったため、第2回の開催を怜蚎䞭です。䞊田様、遊䜐様ず振り返りを行い、次の勉匷䌚をより良いものにしたいず考えおいたす。 最埌たでお読みいただきありがずうございたした 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ooka.toru レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
はじめに 金融IT本郚 2幎目の坂江 克斗です。 業務にお ドメむン ベヌスでのアりトバりンド 通信制 限を考えるタむミングがあったため、本蚘事を曞きたした。 DNS に関する基本的な内容は こちらの蚘事 に、アりトバりンドセキュリティの抂芁に関しおは こちらの蚘事 に蚘茉しおいるので、気になる方はぜひ参照しおみおください。 はじめに 抂芁 ドメむンベヌスのアりトバりンド通信制埡の怜蚌 前提 Amazon Route 53 Resolver DNS Firewallの怜蚌 Terraformの実装 デプロむ埌の怜蚌 AWS Network Firewallの怜蚌 Terraformの実装 デプロむ埌の怜蚌 AWS Network Firewall Proxyの怜蚌 デプロむ埌の怜蚌 たずめ おわりに 抂芁 以䞋の衚に AWS におけるアりトバりンドセキュリティサヌビスの䞀芧を瀺したす。 レむダ 制埡芳点 AWS サヌビス 料金 特城 DNS 名前解決 ドメむン 名 Amazon Route 53 Resolver DNS Firewall 䜎 DNS ク゚リ 早期に遮断可胜。ロヌカルでの名前解決やIP盎打ち、独自 DNS 䜿甚等の Route 53 Resolverを経由しない通信は防埡䞍可 L3–4 IP / Port Security Groups / NACL 無料 ネットワヌクセキュリティのベヌス L3–7 IP / Port, TCP ヘッダ / HTTP ヘッダ / TLS ヘッダ AWS Network Firewall , AWS Gateway Load Balancer + サヌドパヌティ ゜フト 高AZ毎の垞時皌働゚ンドポむント凊理量 柔軟な制埡が可胜で、マネヌゞドにも運甚可胜。 ドメむン 制埡においお、Host ヘッダのスプヌフィングは防埡䞍可、SNIスプヌフィングには察応可胜※1。 DNS + L3–7 IP / Port, HTTP ヘッダ / TLS ヘッダ AWS Network Firewall Proxy 未発衚 マネヌゞドな フォワ ヌドプロキシサヌビス通信䞻䜓は Proxy。珟状はプレビュヌ公開䞭でボディ解析は未提䟛 ※1 Network Firewall の TLS むンスペクション機胜を利甚するこずで察策可胜 今回は業務芁件で挙がった ドメむン ベヌスのアりトバりンド制埡手法に関しお、 Amazon Route 53 Resolver DNS Firewall ・ AWS Network Firewall ・ AWS Network Firewall Proxy で比范怜蚌を行いたす。 ドメむン ベヌスのアりトバりンド 通信制 埡の怜蚌 前提 怜蚌のためロヌカルで実装したす。 EC2をプラむベヌトサブネットに配眮し、NAT ゲヌトりェむ 経由での AWS サヌビス・倖郚サヌビスぞのアクセスを想定したす。 Allow List により怜蚌したす。 SSM接続甚の AWS ドメむン ず本テックブログ tech.dentsusoken.com ぞのアクセスのみ蚱可し、他 ドメむン をすべお拒吊。 本怜蚌では、公開されおいる Web サむトに察しお、 通信制 埡の挙動を確認する目的で少数のリク゚ストを送信しおおり、サヌビスの可甚性や機密性に圱響を䞎える行為は行っおいたせん。 本蚘事では、怜蚌のシンプルさや負荷の䜎さ数リク゚スト皋床からテックブログ甚 ドメむン による怜蚌を行いたした。 しかし、本来はテスト手法に問題があり予期せず過倧な負荷をかけおしたった堎合など、 芏玄違反 ずなる可胜性があるため、 IANA珟圚はICANNの䞀郚が管理するテスト甚ドメむン  example.com 等を䜿甚し怜蚌を行うこずが最も適切ずなりたす。 Amazon Route 53 Resolver DNS Firewall の怜蚌 Terraformの実装 以䞋に瀺すシンプルな構成で怜蚌したす。 初めに VPC およびEC2の定矩をしたす。 terraform { required_version = "~> 1.14.0" required_providers { aws = { version = "6.23.0" source = "hashicorp/aws" } } } provider "aws" { region = "ap-northeast-1" } data "aws_region" "current" {} data "aws_partition" "current" {} data "aws_caller_identity" "current" {} ########################################################################### ## VPC resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" enable_dns_hostnames = true enable_dns_support = true tags = { Project = "example" } } resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.main.id tags = { Project = "example" } } ## Subnet resource "aws_subnet" "public_a" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" availability_zone = "ap-northeast-1a" map_public_ip_on_launch = true tags = { Project = "example" } } resource "aws_subnet" "private_a" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" availability_zone = "ap-northeast-1a" map_public_ip_on_launch = false tags = { Project = "example" } } ## Root Table resource "aws_route_table" "public_a" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.igw.id } tags = { Project = "example" } } resource "aws_route_table" "private_a" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.ngw.id } tags = { Project = "example" } } resource "aws_route_table_association" "public_a" { subnet_id = aws_subnet.public_a.id route_table_id = aws_route_table.public_a.id } resource "aws_route_table_association" "private_a" { subnet_id = aws_subnet.private_a.id route_table_id = aws_route_table.private_a.id } ## NAT resource "aws_eip" "ngw" { } resource "aws_nat_gateway" "ngw" { depends_on = [ aws_internet_gateway.igw ] allocation_id = aws_eip.ngw.id subnet_id = aws_subnet.public_a.id tags = { Project = "example" } } ########################################################################### ## Instance data "aws_ami" "amazon_linux_2023" { most_recent = true owners = [ "amazon" ] filter { name = "name" values = [ "al2023-ami-*-x86_64" ] } } resource "aws_instance" "amazon_linux" { ami = data.aws_ami.amazon_linux_2023.id instance_type = "t2.micro" subnet_id = aws_subnet.private_a.id iam_instance_profile = aws_iam_instance_profile.ec2.name vpc_security_group_ids = [ aws_security_group.ec2.id, ] tags = { Project = "example" } } ## Security Group resource "aws_security_group" "ec2" { name = "ec2-sg" vpc_id = aws_vpc.main.id egress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0" ] } egress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0" ] } } ## IAM resource "aws_iam_instance_profile" "ec2" { name = "ec2-profile" role = aws_iam_role.ec2.name } resource "aws_iam_role" "ec2" { name = "ec2-role" assume_role_policy = jsonencode ( { Version = "2012-10-17" Statement = [{ Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } Action = "sts:AssumeRole" }] } ) } resource "aws_iam_role_policy_attachment" "ssm" { role = aws_iam_role.ec2.name policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" } 次に、Route53 Resolverのログを定矩したす。 Route53 Resolverは VPC 単䜍で適甚されるため、ログの玐付けも VPC 単䜍ずなりたす。 ## Resolver Log resource "aws_cloudwatch_log_group" "example" { name = "/aws/route53/resolver-firewall/example" tags = { Project = "example" } } ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_resolver_query_log_config resource "aws_route53_resolver_query_log_config" "example" { name = "example" destination_arn = aws_cloudwatch_log_group.example.arn tags = { Project = "example" } } ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_resolver_query_log_config_association resource "aws_route53_resolver_query_log_config_association" "example" { resolver_query_log_config_id = aws_route53_resolver_query_log_config.example.id resource_id = aws_vpc.main.id } Route53 Resolver Firewall を定矩したす。 䜿甚するリ゜ヌスは以䞋の5぀です。Route53 Resolverログず同様に、 VPC 単䜍での玐付けを行いたす。 aws _route53_resolver_ firewall _config ファむアりォヌル の基本蚭定 aws _route53_resolver_ firewall _rule_group 耇数の ファむアりォヌル ルヌルを玐付けるルヌルグルヌプ aws _route53_resolver_ firewall _rule_group_association VPC ずルヌルグルヌプを玐付け aws _route53_resolver_ firewall _rule Allow List / Deny List方匏で倉動 ドメむン リストを基に蚱可・拒吊・アラヌトのアクションを蚭定したルヌル aws _route53_resolver_ firewall _domain_list Allow List / Deny List方匏で倉動 フィルタリングに䜿甚する ドメむン のリスト ## Firewall Config ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_resolver_firewall_config resource "aws_route53_resolver_firewall_config" "main" { resource_id = aws_vpc.main.id firewall_fail_open = "DISABLED" } ## Firewall Rule Group ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_resolver_firewall_rule_group resource "aws_route53_resolver_firewall_rule_group" "example" { name = "example" tags = { Project = "example" } } ## Firewall Rule Group Association with VPC ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_resolver_firewall_rule_group_association resource "aws_route53_resolver_firewall_rule_group_association" "example" { name = "example" vpc_id = aws_vpc.main.id firewall_rule_group_id = aws_route53_resolver_firewall_rule_group.example.id priority = 101 # 100は予玄枈み } Allow List では、広範囲の ドメむン に察するBlockを定矩埌に、Allowする蚭定を远加するこずで実装するこずが出来たす。 今回は、SSM接続甚の AWS ドメむン ず本テックブログ tech.dentsusoken.com ぞのアクセスのみを蚱可し、その他の ドメむン をすべお拒吊するように蚭定したす。 Allow Listの蚭定負荷を枛らすため firewall_domain_redirection_action = "TRUST_REDIRECTION_DOMAIN" ずするこずで、初めに解決しに行った ドメむン を信頌し CNAME 埌の怜蚌はしない蚭定にしおいたす。 ## Firewall Domain List ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_resolver_firewall_domain_list resource "aws_route53_resolver_firewall_domain_list" "block_example" { name = "block-example" domains = [ "*." ] tags = { Project = "example" } } resource "aws_route53_resolver_firewall_domain_list" "allow_example" { name = "allow-example" domains = [ "tech.dentsusoken.com" , "*.amazonaws.com" , "*.cloudfront.net" ] tags = { Project = "example" } } ## Firewall Rule (Associated with Firewall Rule Group) ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_resolver_firewall_rule resource "aws_route53_resolver_firewall_rule" "block_example" { name = "block-example" action = "BLOCK" block_response = "NXDOMAIN" firewall_domain_list_id = aws_route53_resolver_firewall_domain_list.block_example.id firewall_rule_group_id = aws_route53_resolver_firewall_rule_group.example.id firewall_domain_redirection_action = "INSPECT_REDIRECTION_DOMAIN" priority = 200 } resource "aws_route53_resolver_firewall_rule" "allow_example" { name = "allow-example" action = "ALLOW" firewall_domain_list_id = aws_route53_resolver_firewall_domain_list.allow_example.id firewall_rule_group_id = aws_route53_resolver_firewall_rule_group.example.id firewall_domain_redirection_action = "TRUST_REDIRECTION_DOMAIN" priority = 100 } デプロむ埌の怜蚌 terraform apply の実行埌、゚ラヌなく3分皋床で完了したした。 Allow List においお、digコマンドによる名前解決を芋るず以䞋の結果ずなりたす。 想定通り tech.dentsusoken.com の名前解決は成功し、 www.dentsusoken.com の名前解決は拒吊されおいるこずが確認できたした。 sh-5.2$ dig tech.dentsusoken.com ; <<>> DiG 9.18.33 <<>> tech.dentsusoken.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62350 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;tech.dentsusoken.com. IN A ;; ANSWER SECTION: tech.dentsusoken.com. 300 IN CNAME hatenablog.com. hatenablog.com. 54 IN A 35.75.255.9 hatenablog.com. 54 IN A 54.199.90.60 ;; Query time: 0 msec ;; SERVER: 10.0.0.2#53(10.0.0.2) (UDP) ;; WHEN: Wed Dec 17 12:52:28 UTC 2025 ;; MSG SIZE rcvd: 106 sh-5.2$ dig www.dentsusoken.com ; <<>> DiG 9.18.33 <<>> www.dentsusoken.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 17641 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;www.dentsusoken.com. IN A ;; Query time: 0 msec ;; SERVER: 10.0.0.2#53(10.0.0.2) (UDP) ;; WHEN: Wed Dec 17 12:52:40 UTC 2025 ;; MSG SIZE rcvd: 48 ロヌカルでの名前解決ずしお、digコマンドで取埗した IPアドレス を基にhostsの曞き換えによる ドメむン アクセスを怜蚌したす。 Route 53 Resolverを経由せずに名前解決が可胜になったこずで、拒吊されるはずの www.dentsusoken.com ぞの通信が可胜になっおいるこずが確認できたした。 sh-5.2$ curl https://www.dentsusoken.com curl: (6) Could not resolve host: www.dentsusoken.com sh-5.2$ sudo vi /etc/hosts sh-5.2$ sudo cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost6 localhost6.localdomain6 3.173.219.57 www.dentsusoken.com sh-5.2$ curl https://www.dentsusoken.com <!DOCTYPE html> (äž­ç•¥) <link rel="canonical" href="https://www.dentsusoken.com/" /> <meta name="description" content="株匏䌚瀟電通総研の公匏ホヌムペヌゞです。2024幎1月1日に瀟名をISID電通囜際情報サヌビスから倉曎したした。 お客様の業務課題に察応する゜リュヌションや導入事䟋のほか、䌁業情報、IR情報、採甚情報等をご玹介しおいたす。" /> <meta property="og:site_name" content="電通総研" /> (äž­ç•¥) </html> AWS Network Firewall の怜蚌 Terraformの実装 以䞋に瀺すシンプルな構成で怜蚌したす。 初めに VPC およびEC2の定矩をしたす。 VPC に関しお、Network Firewall 甚のサブネットが存圚するこず、EC2ずNAT ゲヌトりェむ の通信においお Firewall Endpoint を経由するルヌティングを蚭定するこずに泚意が必芁です。 terraform { required_version = "~> 1.14.0" required_providers { aws = { version = "6.23.0" source = "hashicorp/aws" } } } provider "aws" { region = "ap-northeast-1" } data "aws_region" "current" {} data "aws_partition" "current" {} data "aws_caller_identity" "current" {} ########################################################################### ## VPC resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" enable_dns_hostnames = true enable_dns_support = true tags = { Project = "example" } } resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.main.id tags = { Project = "example" } } ## Subnet resource "aws_subnet" "public_a" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" availability_zone = "ap-northeast-1a" map_public_ip_on_launch = true tags = { Project = "example" } } resource "aws_subnet" "private_nfw_a" { vpc_id = aws_vpc.main.id cidr_block = "10.0.2.0/24" availability_zone = "ap-northeast-1a" map_public_ip_on_launch = false tags = { Project = "example" } } resource "aws_subnet" "private_a" { vpc_id = aws_vpc.main.id cidr_block = "10.0.3.0/24" availability_zone = "ap-northeast-1a" map_public_ip_on_launch = false tags = { Project = "example" } } ## Root Table resource "aws_route_table" "public_a" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.igw.id } route { cidr_block = "10.0.3.0/24" vpc_endpoint_id = tolist ( tolist ( tolist (aws_networkfirewall_firewall.example.firewall_status) [ 0 ] .sync_states) [ 0 ] .attachment) [ 0 ] .endpoint_id } tags = { Project = "example" } } resource "aws_route_table_association" "public_a" { subnet_id = aws_subnet.public_a.id route_table_id = aws_route_table.public_a.id } resource "aws_route_table" "private_nfw_a" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.ngw.id } tags = { Project = "example" } } resource "aws_route_table_association" "private_nfw_a" { subnet_id = aws_subnet.private_nfw_a.id route_table_id = aws_route_table.private_nfw_a.id } resource "aws_route_table" "private_a" { vpc_id = aws_vpc.main.id route { cidr_block = "0.0.0.0/0" vpc_endpoint_id = tolist ( tolist ( tolist (aws_networkfirewall_firewall.example.firewall_status) [ 0 ] .sync_states) [ 0 ] .attachment) [ 0 ] .endpoint_id } tags = { Project = "example" } } resource "aws_route_table_association" "private_a" { subnet_id = aws_subnet.private_a.id route_table_id = aws_route_table.private_a.id } ## NAT resource "aws_eip" "ngw" { } resource "aws_nat_gateway" "ngw" { depends_on = [ aws_internet_gateway.igw ] allocation_id = aws_eip.ngw.id subnet_id = aws_subnet.public_a.id tags = { Project = "example" } } ########################################################################### ## Instance data "aws_ami" "amazon_linux_2023" { most_recent = true owners = [ "amazon" ] filter { name = "name" values = [ "al2023-ami-*-x86_64" ] } } resource "aws_instance" "amazon_linux" { depends_on = [ aws_networkfirewall_firewall.example ] ami = data.aws_ami.amazon_linux_2023.id instance_type = "t2.micro" subnet_id = aws_subnet.private_a.id iam_instance_profile = aws_iam_instance_profile.ec2.name vpc_security_group_ids = [ aws_security_group.ec2.id, ] tags = { Project = "example" } } ## Security Group resource "aws_security_group" "ec2" { name = "ec2-sg" vpc_id = aws_vpc.main.id egress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0" ] } egress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = [ "0.0.0.0/0" ] } } ## IAM resource "aws_iam_instance_profile" "ec2" { name = "ec2-profile" role = aws_iam_role.ec2.name } resource "aws_iam_role" "ec2" { name = "ec2-role" assume_role_policy = jsonencode ( { Version = "2012-10-17" Statement = [{ Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } Action = "sts:AssumeRole" }] } ) } resource "aws_iam_role_policy_attachment" "ssm" { role = aws_iam_role.ec2.name policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" } Network Firewall の定矩をしたす。 今回は他 VPC ぞの共有もなく、シンプルな構成ずなるため必芁なリ゜ヌスは以䞋の4皮類ずなりたす。 Firewall はサブネット単䜍で玐付けたす。 たた、 aws_networkfirewall_logging_configuration のログタむプをALERTに蚭定するこずで、ALERTたたは DROP ルヌルにマッチした通信のみログに出力されるようになりたす。 aws _networkfirewall_ firewall Network Firewall の実䜓ずなるリ゜ヌス。 VPC やサブネットぞの関連付けを行い、ポリシヌやログ蚭定を適甚するための起点 aws _networkfirewall_logging_configuration ログ蚭定 aws _networkfirewall_ firewall _policy Allow List / Deny List 方匏で倉動 ぀以䞊のルヌルグルヌプを玐付け、適甚する順序や優先床を蚭定可胜なポリシヌ aws _networkfirewall_rule_group Allow List / Deny List 方匏で倉動 1぀以䞊のステヌトレス/ステヌトフルルヌルを蚭定可胜なルヌルグルヌプ ## Network Firewall (+ Firewall Endpoint) ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/networkfirewall_firewall#enabled_analysis_types-1 resource "aws_networkfirewall_firewall" "example" { name = "example" firewall_policy_arn = aws_networkfirewall_firewall_policy.example.arn vpc_id = aws_vpc.main.id enabled_analysis_types = [] # HTTP、HTTPS通信の解析をしおレポヌトを出力、ドメむンリスト䜜成に掻甚可胜 firewall_policy_change_protection = false # 怜蚌のため subnet_change_protection = false # 怜蚌のため subnet_mapping { subnet_id = aws_subnet.private_nfw_a.id } tags = { Project = "example" } } ## Log Config resource "aws_cloudwatch_log_group" "nfw" { name = "/aws/vpc/network-firewall/example" tags = { Project = "example" } } ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/networkfirewall_logging_configuration resource "aws_networkfirewall_logging_configuration" "example" { firewall_arn = aws_networkfirewall_firewall.example.arn logging_configuration { log_destination_config { log_destination = { logGroup = aws_cloudwatch_log_group.nfw.name } log_destination_type = "CloudWatchLogs" log_type = "ALERT" # FLOWの堎合はPassルヌルもログに出力 } } } Allow List の堎合は、明瀺的にSTRICT_ORDERか぀ drop :establishedにするこずでデフォルトがDenyになるこずから、以䞋の実装ずなりたす。 この時、SSM接続のために AWS サヌビス甚の ドメむン 名を蚱可しおおく必芁がありたす。 ## Firewall Rule Group ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/networkfirewall_rule_group resource "aws_networkfirewall_rule_group" "example" { capacity = 100 # ルヌル毎のキャパシティに合わせお手動蚭定必芁 name = "example" type = "STATEFUL" rule_group { rules_source { rules_source_list { generated_rules_type = "ALLOWLIST" target_types = [ "HTTP_HOST" , "TLS_SNI" ] targets = [ "tech.dentsusoken.com" , ".amazonaws.com" , ".cloudfront.net" ] } } stateful_rule_options { rule_order = "STRICT_ORDER" } } tags = { Project = "example" } } ## Network Firewall Policy ### https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/networkfirewall_firewall_policy#stateful-rule-group-reference resource "aws_networkfirewall_firewall_policy" "example" { name = "firewall-policy-example" firewall_policy { stateless_default_actions = [ "aws:forward_to_sfe" ] stateless_fragment_default_actions = [ "aws:forward_to_sfe" ] stateful_engine_options { rule_order = "STRICT_ORDER" } stateful_default_actions = [ "aws:drop_established" ] stateful_rule_group_reference { priority = 1 resource_arn = aws_networkfirewall_rule_group.example.arn } } tags = { Project = "example" } } デプロむ埌の怜蚌 terraform apply の実行埌、゚ラヌなく6分皋床で完了したした。 Allow List においお、 curl コマンドによるサむトぞのアクセスを実行するず、以䞋の結果ずなりたす。 想定通り tech.dentsusoken.com ぞのアクセスは蚱可され、 www.dentsusoken.com ぞのアクセスはブロックされおいるこずが確認できたした。 sh-5.2$ curl https://tech.dentsusoken.com <!DOCTYPE html> <html lang="ja" data-admin-domain="//blog.hatena.ne.jp" data-admin-origin="https://blog.hatena.ne.jp" data-author="dentsusoken" data-avail-langs="ja en" data-blog="isid.hatenablog.com" data-blog-host="isid.hatenablog.com" data-blog-is-public="1" data-blog-name="電通総研 テックブログ" data-blog-owner="dentsusoken" data-blog-show-ads="" data-blog-show-sleeping-ads="" data-blog-uri="https://tech.dentsusoken.com/" (äž­ç•¥) </html> sh-5.2$ curl --max-time 10 https://www.dentsusoken.com curl: (28) Connection timed out after 10002 milliseconds DNS Firewall ず同様に、hostsファむルの曞き換えによる ドメむン アクセスも怜蚌しおみるず、圓然ですが DNS 解決の有無に関係なく、最終的なパケットのHost・SNIヘッダでブロックしおいるこずが確認できたした。 sh-5.2$ sudo vi /etc/hosts sh-5.2$ sudo cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost6 localhost6.localdomain6 3.173.219.15 www.dentsusoken.com sh-5.2$ curl --max-time 10 https://www.dentsusoken.com curl: (28) Connection timed out after 10002 milliseconds 次に以䞋の2パタヌンでスプヌフィングを怜蚌したした。 Hostヘッダ詐称 curl http://www.dentsusoken.com -H "Host: tech.dentsusoken.com" SNIヘッダ詐称 curl https://tech.dentsusoken.com --resolve tech.dentsusoken.com:443:3.173.219.15 -H "Host: www.dentsusoken.com" -k いずれのケヌスでも、Allow List の刀定䞊は蚱可され、ブロックされないフィルタを通過するこずを確認したした。 䞀方で、Host ヘッダや SNI の䞍敎合により、HTTP/ TLS の凊理䞊は正しく応答できず、期埅したペヌゞ衚瀺には至りたせんでした。 以䞊より、スプヌフィングによっお「蚱可刀定そのもの」を通過できるこずが分かりたしたただし、通信の成立や正しいペヌゞ衚瀺たで保蚌されるわけではありたせん。 sh-5.2$ curl http://www.dentsusoken.com -H "Host: tech.dentsusoken.com" <html> <head><title>301 Moved Permanently</title></head> <body> <center><h1>301 Moved Permanently</h1></center> <hr><center>CloudFront</center> </body> </html> sh-5.2$ curl https://tech.dentsusoken.com --resolve tech.dentsusoken.com:443:3.173.219.15 -H "Host: www.dentsusoken.com" -k <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> (äž­ç•¥) <H1>421 ERROR</H1> <H2>The request could not be satisfied.</H2> <HR noshade size="1px"> The distribution does not match the certificate for which the HTTPS connection was established with. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner. (äž­ç•¥) </BODY></HTML> 今回はCloudFrontを䜿甚したWebサむトであるこずから、CloudFrontが HTTPS 接続時に実装しおいる ドメむンフロンティング察策SNI・Host・蚌明曞・AWSアカりントの敎合性怜蚌 が動䜜した圢ずなりたす。 この仕組みにより、本怜蚌ではHostヘッダずSNIヘッダの䞍敎合、たたはHTTPのHostヘッダが TLS ハンドシェむク時に提瀺された蚌明曞に含たれおいないこずが怜知され、CloudFront偎で正しく防埡されたした。 本蚘事の䞻題であるアりトバりンドセキュリティの芳点ずは盎接関係したせんが、サヌビスを公開する際には、CloudFront や ALB などの゚ッゞサヌバ、リバヌスプロキシによる前面での防埡を組み合わせるこずが有効であるこずが分かりたす。 AWS Network Firewall Proxyの怜蚌 本蚘事では蚘事のボリュヌムを考慮しデプロむの手順は割愛したす。 こちらの蚘事 でNetwork Firewall Proxyのデプロむ手順を含め詳现を蚘茉しおいたすのでご参照お願いしたす。 以䞋に瀺すシンプルな構成 Securing Egress Architectures with Network Firewall Proxy より匕甚を䜜成したす。 プレビュヌ䞭のサヌビスでありTerraform Providerでは未提䟛のリ゜ヌスのため、手動での蚭定も必芁ずなりたす。 ルヌルの蚭定倀ずしおは以䞋になりたす。 Pre- DNS  ドメむン tech.dentsusoken.com ・ *.amazonaws.com をAllow。デフォルトアクションはDeny。 Pre-Requestルヌルなし。デフォルトアクションはAllow。 Post-Responseルヌルなし。デフォルトアクションはAllow。 デプロむ埌の怜蚌 Allow List においお、 curl コマンドによるサむトぞのアクセスを実行するず、以䞋の結果ずなりたす。 想定通り tech.dentsusoken.com ぞのアクセスは蚱可され、 www.dentsusoken.com ぞのアクセスはブロックされおいるこずが確認できたした。 sh-5.2$ export https_proxy="https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443" sh-5.2$ export http_proxy="https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443" sh-5.2$ curl https://tech.dentsusoken.com <!DOCTYPE html> <html lang="ja" data-admin-domain="//blog.hatena.ne.jp" data-admin-origin="https://blog.hatena.ne.jp" data-author="dentsusoken" data-avail-langs="ja en" data-blog="isid.hatenablog.com" data-blog-host="isid.hatenablog.com" data-blog-is-public="1" data-blog-name="電通総研 テックブログ" data-blog-owner="dentsusoken" data-blog-show-ads="" data-blog-show-sleeping-ads="" data-blog-uri="https://tech.dentsusoken.com/" (äž­ç•¥) </html> sh-5.2$ curl https://www.dentsusoken.com curl: (56) CONNECT tunnel failed, response 403 sh-5.2$ DNS Firewall ず同様に、hostsファむルの曞き換えによる ドメむン アクセスも怜蚌しおみるず、圓然ですが DNS 解決の有無に関係なく、最終的なパケットのHost・SNIヘッダでブロックしおいるこずが確認できたした。 sh-5.2$ sudo vi /etc/hosts sh-5.2$ sudo cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost6 localhost6.localdomain6 3.173.219.15 www.dentsusoken.com sh-5.2$ curl https://www.dentsusoken.com curl: (56) CONNECT tunnel failed, response 403 sh-5.2$ 次に以䞋の2パタヌンでスプヌフィングを怜蚌したした。 Hostヘッダ詐称 curl http://www.dentsusoken.com -H "Host: tech.dentsusoken.com" SNIヘッダ詐称 curl https://tech.dentsusoken.com --resolve tech.dentsusoken.com:443:3.173.219.15 -H "Host: www.dentsusoken.com" -k Hostヘッダ詐称の堎合は、Allow List の刀定にマッチせずに拒吊されたこずが確認できたした。 SNIヘッダ詐称の堎合は、そもそも名前解決がプロキシ偎で発生するため実質的に curl https://tech.dentsusoken.com -H "Host: www.dentsusoken.com" -k ず同じ挙動ずなりたす。そのため、 tech.dentsusoken.com ぞの名前解決が発生しながら、Hostヘッダが www.dentsusoken.com になっおいるこずで409゚ラヌを返したず考えられたす。 sh-5.2$ curl -v http://www.dentsusoken.com -H "Host: tech.dentsusoken.com" * Uses proxy env variable http_proxy == 'https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443' * Host 0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443 was resolved. * IPv6: (none) * IPv4: 10.0.1.29 * Trying 10.0.1.29:443... * TLSv1.3 (OUT), TLS handshake, Client hello (1): (äž­ç•¥) * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * Request completely sent off < HTTP/1.1 403 Forbidden (äž­ç•¥) Forbidden * Connection #0 to host 0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com left intact sh-5.2$ curl -v https://tech.dentsusoken.com --resolve tech.dentsusoken.com:443:3.173.219.15 -H "Host: www.dentsusoken.com" -k * Added tech.dentsusoken.com:443:3.173.219.15 to DNS cache * Uses proxy env variable https_proxy == 'https://0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443' * Host 0a776294cb5ae3886.proxy.nfw.us-east-2.amazonaws.com:443 was resolved. * IPv6: (none) * IPv4: 10.0.1.29 * Trying 10.0.1.29:443... * ALPN: curl offers http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): (äž­ç•¥) < HTTP/1.1 409 Conflict < Connection: close < HTTP/1.1 400 Bad Request Connection: close * TLSv1.3 (IN), TLS alert, close notify (256): * shutting down connection #0 * TLSv1.3 (OUT), TLS alert, close notify (256): * TLSv1.3 (IN), TLS alert, close notify (256): * TLSv1.3 (OUT), TLS alert, close notify (256): sh-5.2$ ただし、本怜蚌のように Network Firewall Proxy を単䜓で利甚しおいる堎合、 --noproxy オプション等を䜿甚しプロキシを経由しない通信をした堎合には、Network Firewall Proxyのルヌルを無芖しお通信しに行くこずが可胜です。 そのため、Network Firewall Proxy単䜓ではなく他の ファむアりォヌル 系サヌビスずの組み合わせが重芁ずなりたす。 たずめ ドメむン ベヌスのアりトバりンド 通信制 埡は、サブネット単䜍での制埡芁件がない限り、 コストず防埡効果スプヌフィングにも察応可胜のバランスに優れる Route 53 Resolver DNS Firewall を䞻軞に据える構成が掚奚 だず考えられたす。 そのうえで、hosts ファむルの曞き換え、IP 盎打ち、独自 DNS の利甚などにより Route 53 Resolver を経由しない通信が成立し埗る点を螏たえ、 Network Firewall や Network Firewall Proxyを䜵甚しお補完的にカバヌ するこずが重芁です。 おわりに 本蚘事では、 AWS における具䜓的な ドメむン ベヌス 通信制 埡を怜蚌しおみたした。 実運甚においおは、 マネヌゞドルヌルや掚奚される Suricata ルヌルの導入、ログの掻甚による継続的な改善 が重芁ずなりたす。 今埌も、実際の運甚や怜蚌を通じお理解を深めおいきたいず思いたす。 䜙談ですが、Network Firewall のapply埌に削陀するこずを忘れおしたい8日間攟眮しおしたいたした。 シングルAZ構成で Firewall ゚ンドポむントは1぀だけでしたが、それでも ゚ンドポむント料金 だけで玄76$12,000円皋のコストが発生しおしたいたした。 apply 埌の削陀忘れには改めお泚意が必芁ですね。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sakae.katsuto レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
.mermaid { background-color: #ffffff !important; } import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs'; mermaid.initialize({ startOnLoad: true }); はじめに こんにちは。 ゚ンタヌプラむズ 第䞉本郚 デヌタマネゞメントナニット マヌケティング IT郚の藀柀です。 先日、 API プラットフォヌムのリヌディング䌁業であるKong株匏䌚瀟様のパヌトナヌ向け認定資栌プログラム「 Partner Delivery Specialist 」に参加し、無事に 電通 総研第䞀号の認定を取埗するこずができたした。 この資栌の認定には、察面で行われた2日間のワヌクショップぞの参加以倖にも、事前のオンラむン孊習、Kong Gateway Associate資栌の取埗が必芁でかなりハヌドでした。 ワヌクショップではむンフラ呚りの知識もかなり必芁ずされたのですが、普段はアプリケヌション開発を䞭心に行っおいるため、苊劎する堎面が倚々ありたした。 しかし今回のプログラムを通じお、普段の業務であたり觊れるこずがなかったむンフラ呚りの知識やAPIOpsの思想などに぀いお䜓系的に孊ぶこずができ、非垞に有意矩な経隓ずなりたした。 本蚘事では、Kongの抂芁に少し觊れた埌、ワヌクショップでも取り扱った、Kong Gateway で Kubernetes のマむクロサヌビスをプロキシする方法に぀いお共有させおいただきたす。 なお本蚘事の内容は、すべお2025幎12月時点のものですのでご了承ください。 察象読者 Kongを觊ったこずがない方、 Kubernetes に぀いお クラりド サヌビスの詊隓などで名前は知っおいるが実際に䜿ったこずがない方。 私自身がそうだったので、詰たった点、孊びになった点や、実際のニヌズに察しおどのように掻甚できるのかに぀いお詳しく曞きたした。 技術的な内容に぀いおは、普段Kongや Kubernetes を䜿っおいる方にずっおは簡単すぎるかもしれたせん。 はじめに 察象読者 Kongの抂芁 題材 EKSクラスタヌずサンプルバック゚ンドAPIをセットアップする コマンドむンストヌル Kubernetesクラスタヌの䜜成 Bookinfoのデプロむ Kong のむンフラをセットアップする CPのセットアップ DPのデプロむずCP・DP間連携 Kong Gatewayを蚭定する Gateway Serviceの䜜成 Routeの䜜成 動䜜確認 片付け おわりに Kongの抂芁 Kongは、マむクロサヌビス アヌキテクチャ における API ゲヌトりェむ ずしお広く採甚されおいるプラットフォヌムです日本ではデゞタル庁から掚奚 API ゲヌトりェむ に認定されおいたす。 API 開発ラむフサむクルの管理機胜、セキュリティ、認蚌、レヌト制限、ロギングなどの API ゲヌトりェむ 機胜を統合的に提䟛し、耇雑な API 運甚を効率化したす。 Kong゚コシステムの代衚的な コンポヌネント は以䞋の3぀です。 Kong Insomnia  API の蚭蚈・開発・テストを効率化するための匷力なクラむアントツヌルです。Postmanの競合にあたり、デザむンファヌストな開発を支揎したす。 Kong Gateway  倖郚からのリク゚ストを受け付ける、䞖界で最も利甚されおいる オヌプン゜ヌス の API ゲヌトりェむ です。高速な通信凊理ず豊富な プラグむン 拡匵が特城です。 Kong Mesh  マむクロサヌビス間の耇雑な通信内郚通信を制埡・可芖化するためのサヌビスメッシュです。サヌビス間の暗号化や トラフィック 制埡を担いたす。 出兞 Kong Inc. 公匏サむト より匕甚 そしお、これらの コンポヌネント を統合的に管理・運甚できる枠組みを SaaS ずしお提䟛しおいる Kong Konnect ずいう補品がありたす。 Konnectを利甚するこずで、Insomniaで蚭蚈した API スペックの自動公開開発者ポヌタル、 Gateway /Meshの統合監芖、チヌム間でのコラボレヌション機胜などが提䟛され、 API ラむフサむクル党䜓の効率化を実珟できたす。 本ブログでは、䞊蚘のうち䞻に Kong Gateway ず Kong Konnect を䜿いたす。 Kong Gateway の アヌキテクチャ には、䞻に以䞋の3皮類がありたす。 DB lessモヌド  Kong Gateway の蚭定情報を、各ノヌドごずに YAML 圢匏の蚭定ファむルで管理する軜量なモヌドです。 出兞 Kong Inc. 公匏サむト より匕甚 Traditionalモヌド  PostgreSQL などのデヌタベヌスを䜿甚しお蚭定を管理するモヌドで、倧芏暡な環境や耇数のノヌドを運甚する際に適しおいたす。 出兞 Kong Inc. 公匏サむト より匕甚 Hybridモヌド  デヌタベヌスず接続しお蚭定を管理する専門のコン トロヌル プレヌンCPず実際に トラフィック をさばく専門のデヌタプレヌンDPを分離し、管理を䞀元化しながら トラフィック 凊理を分散できる構成です。スケヌラビリティずセキュリティの䞡面で倧きなメリットが埗られたす。 出兞 Kong Inc. 公匏サむト より匕甚 本蚘事では、 Hybrid アヌキテクチャ を採甚し、CPはKonnectで管理したす 。 この堎合、CPのノヌド䜜成、DBずの接続などの手順は䞍芁で、 API の開発者が気にする必芁はありたせん。各 API サヌバずの通信が可胜な堎所にDPのノヌドを配眮し、Konnectずの通信を確立すればOKです。 API ゲヌトりェむ のポリシヌを倉曎する際は、Konnectの゚ンドポむントに察しお蚭定を行えば、自動的に各DPに蚭定が反映されたす。 これにより、オンプレミス・ クラりド のハむブリッド構成やマルチ クラりド 構成を柔軟に構築するこずが可胜ずなり、ビゞネス芁件に応じた最適なむンフラ蚭蚈を実珟できたす。 出兞 Kong Inc. 公匏サむト より匕甚 Kongそのものの説明はここたでにしおおきたす。詳しくは 公匏ドキュメント などを参照しおください。 題材 サン プルバック ゚ンド API ずしお、Istioの Bookinfo ずいうマむクロサヌビスを䜿甚したす。 Bookinfoは4぀のマむクロサヌビスで構成されおおり、そのうち productpage サヌビスの /api/v1/products 以䞋の゚ンドポむントはBackend For FrontendBFFずしお実装されおいたす。 今回は Kubernetes クラスタ ヌにBookinfoずKong Gateway をデプロむしお、BookinfoのBFFに察しおプロキシしおみたす。 具䜓的な案件のシナリオずしおは、レガシヌなモノリシックアプリケヌションからマむクロサヌビス アヌキテクチャ ぞ段階的に移行しおいく際に、たずは4぀のマむクロサヌビスを Kubernetes に切り出した、ずいうものが想定されたす。 本ブログでは1぀のサヌビスにしかプロキシしたせんが、今埌他のマむクロサヌビスぞのプロキシ機胜も順次远加しおいくこずを考えるず、公開する各サヌビスに認蚌認可やログ蚘録などの共通凊理を重耇しお実装するよりも、共通基盀で䞀元管理する方が保守性が高く、セキュリティの䞀貫性も保ちやすいです。 これが、たさにKong Gateway の埗意ずするずころです。 ここからは以䞋の手順で実装したす。 EKS クラスタ ヌずサン プルバック ゚ンド API をセットアップする Kong のむンフラをセットアップする Kong Gateway を蚭定する EKS クラスタ ヌずサン プルバック ゚ンド API をセットアップする 今回は、 AWS のElastic Kubernetes ServiceEKS䞊に Kubernetes クラスタ ヌを立おたす。 ロヌカルでDocker Desktop, Kind, minikubeあたりを䜿っおもいいのですが、Podのオヌトスケヌリングなどをやりたかったので、蚭定が簡単なEKSにしたした。 ※ 1日あたり$7皋床かかるので、䜜業が終わったら クラスタ ヌを削陀するこずをおすすめしたす。 コマンドむンストヌル たず、以䞋のコマンドをロヌカルにむンストヌルしたす。 コマンド 説明 kubectl Kubernetes クラスタ ヌを操䜜するための コマンドラむン ツヌル helm Kubernetes のパッケヌゞマネヌゞャヌ k9s Kubernetes クラスタ ヌの状態をタヌミナル䞊で芖芚的に確認・操䜜できるツヌル aws AWS のサヌビスを操䜜する コマンドラむン ツヌル eksctl Amazon EKS クラスタ ヌを簡単に䜜成・管理できる コマンドラむン ツヌル hey HTTP負荷テストツヌル Mac の堎合、以䞋のコマンドでむンストヌルできたす。 brew install kubernetes-cli helm k9s awscli eksctl hey aws コマンドを䜿う際、IAMナヌザヌのクレデンシャルが必芁なので、あらかじめ AWS Management ConsoleでIAMナヌザヌを䜜成しおポリシヌをアタッチし、アクセスキヌずシヌクレットアクセスキヌを発行しおおきたす。 ポリシヌは怜蚌甚なので AdministratorAccess にしおしたいたした。 以䞋のコマンドで、クレデンシャルなどを登録したす。 aws configure 実行するず、4぀の質問が順番に衚瀺されるので入力しおEnterを抌したす。 AWS Access Key ID [ None ] : < 取埗したアクセスキヌIDを貌り付け > AWS Secret Access Key [ None ] : < 取埗したシヌクレットキヌを貌り付け > Default region name [ None ] : ap-northeast-1 Default output format [ None ] : json 以䞋のコマンドで、蚭定したクレデンシャルが玐づくIAMナヌザヌが出力されればOKです。 aws sts get-caller-identity Kubernetes クラスタ ヌの䜜成 それでは、EKSに クラスタ ヌを䜜成したす。 Management Consoleから䜜成するず、EC2や VPC などの蚭定が倧倉なので、 eksctl コマンドで䞀気に䜜りたす。 15分皋床埅ちたす。 ※ eksctl を䜿っおおくず、 クラスタ ヌを削陀するずきにも関連リ゜ヌスが党郚消えるので、こちらを掚奚したす。 eksctl create cluster \ --name kong-techblog \ --region ap-northeast-1 \ --version 1 . 34 \ --nodegroup-name kong-techblog-spot \ --node-type t3.medium \ --nodes 3 \ --spot \ --managed オプションに぀いおは、以䞋のずおりです。 オプションの説明 オプション 説明 name クラスタ ヌ名なので、䜕でもOKです。 region 東京リヌゞョンにしたした。 version Kubernetes クラスタ ヌのバヌゞョンです。 nodegroup-name ノヌドグルヌプ名なので、䜕でもOKです。 node-type t2.mircoでやったら、pod数制限にかかり起動したせんでした。 nodes ノヌド数です。 spot スポット むンスタンス を䜿いたす。本番ではNGですが、怜蚌甚なので安いほうがいいず思いたす。 managed Managed Instance Groupを䜿いたす。 実行が終わったら、Management ConsoleでEKS クラスタ ヌが正垞に䜜成されたこずを確認したす。 ※東京リヌゞョンが遞択されおいるこずを確認しおください。 kong-techblog クラスタ ヌが䜜成されおいたす。 䜜成された クラスタ ヌをクリックし、詳现画面を開いお[コンピュヌティング]タブを開きたす。 Nodeは1぀の蚈算リ゜ヌスを衚す Kubernetes の抂念です。 今回で蚀うず、EC2 むンスタンス が1぀のNodeに盞圓したす。 先ほど eksctl コマンドで クラスタ ヌを䜜成する際に node-type=t3.medium ず nodes=3 オプションを蚭定したので、EC2にt3.mediumの むンスタンス が3぀立ち䞊げられおいたす。 次に[リ゜ヌス]タブを開くず、デフォルトで「リ゜ヌスタむプ > ワヌクロヌド > ポッド」が遞択されおいたす。 ここに衚瀺されおいるのは、コンテナをグルヌプ化しお管理するための最小単䜍ずなるPodずいう Kubernetes の抂念です。 Podは耇数のコンテナからなり、いずれかのNode䞊で実行され、Pod単䜍でスケヌリングやヘルスチェックなどが行われたす。 埌でBookinfoやKong Gateway をデプロむするず、Podずしおデプロむされたす。 その他の Kubernetes のリ゜ヌスに぀いおの説明は省略したす。詳しくは他のブログや公匏ドキュメントを参照しおください。 Bookinfoのデプロむ さお、 クラスタ ヌがデプロむできたので、次にBookinfoをデプロむしたす。 デプロむに関する定矩は、 yaml ファむルに蚘述したすBookinfo公匏の yaml ファむルを䞀郚改倉したものです。 bookinfo.yaml ################################################################################################## # Namespace ################################################################################################## apiVersion : v1 kind : Namespace metadata : name : bookinfo --- ################################################################################################## # Details service ################################################################################################## apiVersion : v1 kind : Service metadata : name : details namespace : bookinfo labels : app : details service : details spec : ports : - port : 9080 name : http selector : app : details --- apiVersion : apps/v1 kind : Deployment metadata : name : details-v1 namespace : bookinfo labels : app : details version : v1 spec : replicas : 1 selector : matchLabels : app : details version : v1 template : metadata : labels : app : details version : v1 spec : containers : - name : details image : docker.io/istio/examples-bookinfo-details-v1:1.20.1 imagePullPolicy : IfNotPresent ports : - containerPort : 9080 securityContext : runAsUser : 1000 --- ################################################################################################## # Ratings service ################################################################################################## apiVersion : v1 kind : Service metadata : name : ratings namespace : bookinfo labels : app : ratings service : ratings spec : ports : - port : 9080 name : http selector : app : ratings --- apiVersion : apps/v1 kind : Deployment metadata : name : ratings-v1 namespace : bookinfo labels : app : ratings version : v1 spec : replicas : 1 selector : matchLabels : app : ratings version : v1 template : metadata : labels : app : ratings version : v1 spec : containers : - name : ratings image : docker.io/istio/examples-bookinfo-ratings-v1:1.20.1 imagePullPolicy : IfNotPresent ports : - containerPort : 9080 securityContext : runAsUser : 1000 --- ################################################################################################## # Reviews service ################################################################################################## apiVersion : v1 kind : Service metadata : name : reviews namespace : bookinfo labels : app : reviews service : reviews spec : ports : - port : 9080 name : http selector : app : reviews --- apiVersion : apps/v1 kind : Deployment metadata : name : reviews-v1 namespace : bookinfo labels : app : reviews version : v1 spec : replicas : 1 selector : matchLabels : app : reviews version : v1 template : metadata : labels : app : reviews version : v1 spec : containers : - name : reviews image : docker.io/istio/examples-bookinfo-reviews-v1:1.20.1 imagePullPolicy : IfNotPresent env : - name : LOG_DIR value : "/tmp/logs" ports : - containerPort : 9080 volumeMounts : - name : tmp mountPath : /tmp - name : wlp-output mountPath : /opt/ibm/wlp/output securityContext : runAsUser : 1000 volumes : - name : wlp-output emptyDir : {} - name : tmp emptyDir : {} --- apiVersion : apps/v1 kind : Deployment metadata : name : reviews-v2 namespace : bookinfo labels : app : reviews version : v2 spec : replicas : 1 selector : matchLabels : app : reviews version : v2 template : metadata : labels : app : reviews version : v2 spec : containers : - name : reviews image : docker.io/istio/examples-bookinfo-reviews-v2:1.20.1 imagePullPolicy : IfNotPresent env : - name : LOG_DIR value : "/tmp/logs" ports : - containerPort : 9080 volumeMounts : - name : tmp mountPath : /tmp - name : wlp-output mountPath : /opt/ibm/wlp/output securityContext : runAsUser : 1000 volumes : - name : wlp-output emptyDir : {} - name : tmp emptyDir : {} --- apiVersion : apps/v1 kind : Deployment metadata : name : reviews-v3 namespace : bookinfo labels : app : reviews version : v3 spec : replicas : 1 selector : matchLabels : app : reviews version : v3 template : metadata : labels : app : reviews version : v3 spec : containers : - name : reviews image : docker.io/istio/examples-bookinfo-reviews-v3:1.20.1 imagePullPolicy : IfNotPresent env : - name : LOG_DIR value : "/tmp/logs" ports : - containerPort : 9080 volumeMounts : - name : tmp mountPath : /tmp - name : wlp-output mountPath : /opt/ibm/wlp/output securityContext : runAsUser : 1000 volumes : - name : wlp-output emptyDir : {} - name : tmp emptyDir : {} --- ################################################################################################## # Productpage services ################################################################################################## apiVersion : v1 kind : Service metadata : name : productpage namespace : bookinfo labels : app : productpage service : productpage spec : # type: LoadBalancer ports : - port : 9080 name : http # - port: 80 # targetPort: 9080 # name: http selector : app : productpage --- apiVersion : apps/v1 kind : Deployment metadata : name : productpage-v1 namespace : bookinfo labels : app : productpage version : v1 spec : replicas : 1 selector : matchLabels : app : productpage version : v1 template : metadata : annotations : prometheus.io/scrape : "true" prometheus.io/port : "9080" prometheus.io/path : "/metrics" labels : app : productpage version : v1 spec : containers : - name : productpage image : docker.io/istio/examples-bookinfo-productpage-v1:1.20.1 imagePullPolicy : IfNotPresent ports : - containerPort : 9080 volumeMounts : - name : tmp mountPath : /tmp securityContext : runAsUser : 1000 volumes : - name : tmp emptyDir : {} --- デプロむするには、この内容を ./bookinfo.yaml に保存しお、以䞋のコマンドを実行したす。 kubectl apply -f ./bookinfo.yaml 30秒ほど経ったら、以䞋のコマンドでPodの状態を確認したす。 kubectl get pods -n bookinfo 以䞋のように、6぀のPodが READY: 1/1 , STATUS: RUNNING ずなっおいるこずが確認できたす。 READY: 0/1 や STATUS: ContainerCreating などずなっおいる堎合は、もう少し埅機したす。 STATUS: Pending の堎合は、Podに察しおNodeのリ゜ヌスが䞍足しおいる可胜性があるので、䜿甚するEC2 むンスタンス タむプを芋盎すか、ノヌド数を増やすこずを怜蚎したす。 ただ productpage は クラスタ ヌ倖郚からアクセスできるようにしおいないので、 /api/v1/products にアクセスするには、 クラスタ ヌ内郚からリク゚ストを送る必芁がありたす。 kubectl run curl-test --image = curlimages/curl --rm -it --restart = Never -- \ curl http://productpage.bookinfo:9080/api/v1/products このコマンドでは、䞀時的に curl-test ずいうPodを立おお、そこから curl コマンドを叩いお、終わったらPodを削陀しおいたす。 このようにレスポンスが返っお来ればOKです。 これでEKS クラスタ ヌずサン プルバック ゚ンド API Bookinfoのデプロむは完了です Kong のむンフラをセットアップする 前眮きが長かったですが、ここから本題の Kong の話になりたす。 CPのセットアップ たず、 Kong Konnect にサむンアップしたす。 ※2025幎12月珟圚サむンアップ埌30日間は、基本的な機胜を無料で䜿甚するこずができたす。 サむンアップ埌、ログむン盎埌にはこのような画面が衚瀺されたす。 巊のメニュヌで、[ API Gateway ]をクリックしお、右䞊の[New gateway ]で新しく ゲヌトりェむ を䜜成したす。 ポップアップで、[Self-Managed Hybrid]を遞択しお、 ゲヌトりェむ の名前を決め、右䞋の[Next Step]をクリックしたす。 クリックするず画面遷移したす。これで CP の䜜成が完了したした。 DPのデプロむずCP・DP間連携 次に、EKSにDPをデプロむし、CPず連携させる蚭定を行いたす。 この画面に遷移しおいるはずなので、巊偎のメニュヌの[Data Plane Nodes]をクリックしたす。 [Configure data plane]をクリックしたす。 ポップアップで、 Gateway Versionは Self-Managed Gateway 3.12 を、Platformは Kubernetes を遞択し、䞋にスクロヌルしたす。 「Advanced Kubernetes Setup」が衚瀺されるので、基本的にはその手順に埓っお蚭定を進めたす。 以䞋のコマンドで、Kong Gateway 関連のPodをデプロむする kong Namespaceを䜜成し、Helm リポゞトリ にKong Gateway を登録したす手順2 Set up Helm。 kubectl create namespace kong helm repo add kong https://charts.konghq.com helm repo update この時点では、ただKong Gateway のむンストヌルは行われおいたせん。Helmチャヌトずいう、 Kubernetes のデプロむ定矩の雛圢のようなものをダりンロヌドしお登録しただけです。 Helmのコマンドは、初回実行時少し時間がかかりたす。 次に、CPずDPがmTLSにより安党に接続できるよう、CPから認蚌情報を払い出したす手順3 Generate certificates。 [Generate certificate]ボタンをクリックするず「Cluster Certificate」ず「Certificate Key」が衚瀺されるので、それぞれ新しく ./tls.crt ず ./tls.key ファむルを䜜成し、コピペしお保存したす。 以䞋のコマンドで、 Kubernetes クラスタ ヌにSecretリ゜ヌスを䜜成したす。 kubectl create secret tls kong-cluster-cert -n kong --cert = ./tls.crt --key = ./tls.key 続いお、Helmチャヌト雛圢の倉数郚分を定矩した values.yaml ファむルを䜜成したす手順4 Configuration parameters。 埌で詳しく説明したすが、Kong Gateway のPodのオヌトスケヌルの確認のため、 Konnectに衚瀺されおいるものから少し倉曎しおいたす。 以䞋の蚭定をコピペし、 env.cluster_control_plane 、 env.cluster_server_name 、 env.cluster_telemetry_endpoint 、 env.cluster_telemetry_server_name をKonnectが自動生成したvalues. yaml の蚭定ず同じものに曞き換えお、 ./values.yaml に保存したす。 values.yaml image : repository : kong/kong-gateway tag : "3.12" secretVolumes : - kong-cluster-cert admin : enabled : false env : role : data_plane database : "off" cluster_mtls : pki cluster_control_plane : <Konnectが自動生成したvalues.yamlの蚭定ず同じにする> cluster_dp_labels : "type:docker-kubernetesOS" cluster_server_name : <Konnectが自動生成したvalues.yamlの蚭定ず同じにする> cluster_telemetry_endpoint : <Konnectが自動生成したvalues.yamlの蚭定ず同じにする> cluster_telemetry_server_name : <Konnectが自動生成したvalues.yamlの蚭定ず同じにする> cluster_cert : /etc/secrets/kong-cluster-cert/tls.crt cluster_cert_key : /etc/secrets/kong-cluster-cert/tls.key lua_ssl_trusted_certificate : system konnect_mode : "on" vitals : "off" nginx_worker_processes : "1" upstream_keepalive_max_requests : "100000" nginx_http_keepalive_requests : "100000" proxy_access_log : "off" dns_stale_ttl : "3600" router_flavor : expressions ingressController : enabled : false installCRDs : false resources : requests : cpu : 500m memory : "512Mi" limits : cpu : 2 memory : "2Gi" autoscaling : enabled : true minReplicas : 1 maxReplicas : 5 metrics : - type : Resource resource : name : cpu target : type : Utilization averageUtilization : 10 behavior : scaleDown : stabilizationWindowSeconds : 30 manager : enabled : false その埌、以䞋のコマンドを実行し、Kong Gateway をEKSにデプロむしたす。 helm install my-kong kong/kong -n kong --skip-crds --values ./values.yaml このコマンドは、Kong公匏のHelmチャヌト Kubernetes のデプロむ定矩の雛圢に察しお、その倉数郚分を定矩した values.yaml を埋め蟌み、 Kubernetes のデプロむ定矩を完成させお、それをもずに Kubernetes クラスタ ぞのデプロむを実行したす。 うたくいくず、ポップアップの䞀番䞋が「Data Plane Node has been found」に倉わり、右䞋の[Done]ボタンが抌せるようになりたす。 これでKongのむンフラのセットアップは完了です ここたでで構築しおきたむンフラの構成図は以䞋のずおりです。 %%{init: {'theme':'base', 'themeVariables': {'fontSize':'18px'}}}%% graph LR Users["🌐<br/><b>ナヌザヌ</b>"] Developer["👚‍💻<br/><b>開発者</b>"] subgraph Konnect["<b>Kong Konnect (SaaS)</b>"] CP["<b>Control Plane</b><br/>蚭定管理"] end subgraph AWS["<b>AWS (ap-northeast-1)</b>"] NLB["<b>Network Load Balancer</b>"] subgraph EKS["<b>EKS Cluster: kong-techblog-cluster</b>"] subgraph NS_Kong["<b>Namespace: kong</b>"] KongPods["<b>Kong Gateway Pods</b><br/>Data Plane<br/>HPA: 1-5 replicas"] end subgraph NS_Bookinfo["<b>Namespace: bookinfo</b>"] ProductPage["<b>productpage</b><br/>:9080"] Details["<b>details</b><br/>:9080"] Reviews["<b>reviews</b><br/>:9080"] Ratings["<b>ratings</b><br/>:9080"] ProductPage --> Details ProductPage --> Reviews Reviews --> Ratings end end end Developer -.->|"Admin API<br/>(ルヌト/サヌビス/プラグむン)"| CP Users -->|HTTP| NLB NLB --> KongPods KongPods --> ProductPage KongPods -.->|mTLS 認蚌<br/>蚭定同期| CP style Konnect fill:#e1f5ff,stroke:#333,stroke-width:3px style AWS fill:#fff5e1,stroke:#333,stroke-width:3px style EKS fill:#ffffff,stroke:#333,stroke-width:2px style NS_Kong fill:#ffe1f5,stroke:#333,stroke-width:2px style NS_Bookinfo fill:#e1ffe1,stroke:#333,stroke-width:2px style KongPods fill:#ffd700,stroke:#333,stroke-width:2px style ProductPage fill:#99ff99,stroke:#333,stroke-width:2px style Details fill:#99ff99,stroke:#333,stroke-width:2px style Reviews fill:#99ff99,stroke:#333,stroke-width:2px style Ratings fill:#99ff99,stroke:#333,stroke-width:2px style NLB fill:#ff9999,stroke:#333,stroke-width:2px style CP fill:#99ccff,stroke:#333,stroke-width:2px style Users fill:#ffffff,stroke:#333,stroke-width:2px style Developer fill:#ffccff,stroke:#333,stroke-width:2px 自動的にNetwork Load Balancerが远加されおいたすが、これはKongのHelmチャヌトで、Kong Gateway のDPをデプロむするず自動的に䜜成されるように蚭定されおいたす。EKS環境で実行するず、EC2にLoad Balancerが自動的にプロビゞョニングされ、むンタヌネットからの トラフィック を受け付けられるようになりたす。 たたKong Gateway のPodのオヌトスケヌルHorizontal Pod AutoscalerHPAに぀いおですが、先ほどの values.yaml に以䞋の蚘述を远加しおいたした。 resources : requests : cpu : 500m memory : "512Mi" limits : cpu : 2 memory : "2Gi" autoscaling : enabled : true minReplicas : 1 maxReplicas : 5 metrics : - type : Resource resource : name : cpu target : type : Utilization averageUtilization : 10 behavior : scaleDown : stabilizationWindowSeconds : 30 これは、初めはKong Gateway Podを1぀だけデプロむしおおき、PodのCPU䜿甚率が10%を超えるず、最倧5個たでPodをスケヌルアりトせよ、ずいう呜什ですあずでHPAを詊すために、各Podで䜿甚できる最倧のCPUリ゜ヌスず 閟倀 ずなる利甚率は䜎めに蚭定しおいたす。 たた、30秒間CPU䜿甚率が10%を䞋回った状態が続くず、そのPodは自動的にスケヌルむンされたす。 Kong Gateway を蚭定する CPで ゲヌトりェむ の蚭定に倉曎を加えるには、Konnectで ゲヌトりェむ ごずに払い出されるAdmin API ずいう゚ンドポむントを䜿甚したす。 Konnectの GUI 䞊で蚭定を倉曎するず、裏偎でAdmin API が叩かれたす。 CPずDPはmTLSで接続され、CPで ゲヌトりェむ の蚭定に倉曎を加えるず、順次DPにも蚭定が反映されおいきたす。 ちなみにこの仕組みではDP Kubernetes からCPKonnectに向けおポヌリングされるので、 Kubernetes ぞのむンバりンド トラフィック を蚱可する必芁がないセキュアな蚭蚈になっおいたす。 GUI から蚭定しお、むンタヌネット䞊からBookinfoを叩けるようにしたす。 Gateway Serviceの䜜成 巊偎のメニュヌから[ Gateway Services]を遞択したす。 [New gateway service]をクリックしたす。 Full URL にはKong Gateway DPから芋た、Bookinfoのアプリケヌション゚ンドポむントURLを入力したす。 今回の堎合は、 http://productpage.bookinfo:9080/api/v1 を入力したす ドメむン の郚分は、 <Service名>.<Namespace名> ずすれば、 クラスタ ヌ内の DNS Podが名前解決しおServiceの IPアドレス を匕いおきおくれたす。 Name は適圓に bookinfo-v1 ずしお、[Save]をクリックしたす。 なぜ http://productpage.bookinfo:9080 にしないかずいうず、埌でRouteの Path に誀っお / を登録しおしたうず、 /api/v1 以䞋以倖の /productpage や /login ゚ンドポむントなどにアクセスできるようになっおしたうためです。確実に /api/v1 以䞋だけにアクセスを限定するために、このようにしたした。 Routeの䜜成 次に、遷移先のペヌゞでRouteを蚭定したす。 巊のメニュヌの[Routes]ではなく、画面䞭倮に䞊んでいる[Routes]タブをクリックし 、[New Route]を遞択したす。 ※巊のメニュヌの[Routes]からだず、別途䜜成したRouteを、先ほど䜜成した Gateway Serviceに玐づける䜜業が必芁になりたす。 蚭定画面で、 Name を products 、Route ConfigurationはBasicで、 Path に /products を入力したす。 Strip Path からチェックを倖しお[Save]をクリックしたす。 Routeは、条件に圓おはたるリク゚ストをDPが受けたずきに、関連付けおある Gateway Serviceにリク゚ストをプロキシしたす。 今回は Path に /products を蚭定しおいるので、 DPに察しお /products から始たるパスでリク゚ストが来た堎合 に、関連付けた bookinfo-v1 Gateway Serviceにプロキシされたす。 Strip Path にチェックをしおいるず、このずきマッチした郚分を削陀しおから、 Gateway Serviceにプロキシしたす。 Gateway Serviceは、蚭定したURL productpage.bookinfo:9080/api/v1 の 末尟にRouteから送られおきたパスをくっ぀けお 、バック゚ンドに転送したす。 以䞋に、どのようなパスのDPぞのリク゚ストに察しお、どのようなパスでDPがバック゚ンドBookinfoにプロキシするかを瀺したす。 DPぞのリク゚ストのパス Strip Path: true の堎合 Strip Path: false の堎合 /products productpage.bookinfo:9080/api/v1  404 Not Found  productpage.bookinfo:9080/api/v1/products 200 OK /products/1 productpage.bookinfo:9080/api/v1/1  404 Not Found  productpage.bookinfo:9080/api/v1/products/1 200 OK /products/1/ratings productpage.bookinfo:9080/api/v1/1/ratings  404 Not Found  productpage.bookinfo:9080/api/v1/products/1/ratings 200 OK /api/v1/products/1/ratings Serviceにプロキシされない 404 Not Found  Serviceにプロキシされない 404 Not Found  DPぞのリク゚ストのパスにも /api/v1 を含めたい堎合は、いく぀か方法が考えられたすが、䟋えばRouteで Strip Path: true ずしお、 Path に /api/v1 を蚭定するず、Serviceはそのたたで動きたす。 動䜜確認 これでむンタヌネット䞊からKong Gateway 経由で、Bookinfoを叩けるようになりたした。 先ほどの ロヌドバランサヌ のURLを取埗し、アクセスしおみたす。 このコマンドでKong Gateway が䜿甚しおいるLoadBalancerの EXTERNAL-IP を確認し、コピヌしおおきたす以䞋、 your-domain.ap-northeast-1.elb.amazonaws.com ずしたす。 kubectl get svc -n kong ブラりザや curl で http://your-domain.ap-northeast-1.elb.amazonaws.com/products にアクセスし、以䞋のように返っおくれば成功です たくさんリク゚ストを投げおKong Gateway DPのCPU負荷を䞊げ、HPAが動䜜するかどうか芋おみたす。 k9s コマンドで、Podの状態をリアルタむムで監芖できたす。 k9s -n kong 今は1Podしか起動しおいたせん。 別のタヌミナルを開き、以䞋のコマンドを実行し、負荷をかけたす。 hey -z 120s -c 100 http://your-domain.ap-northeast-1.elb.amazonaws.com/products しばらくするず、k9s偎でPodの状態が曎新されおいるこずを確認できたす。 5Podたでスケヌルアりトしたした。 hey コマンドの実行が完了しおから30秒ほど経぀ず、スケヌルむンが始たりたす。 再び1Podに戻りたした。 片付け EKS クラスタ ヌを削陀したす。EKS クラスタ ヌを䜜成したずきに eksctl を䜿っおいれば、関連リ゜ヌスが䞀括ですべお削陀されたす。 15分ほど埅ちたす。 eksctl delete cluster --name kong-techblog 念のため、Management ConsoleからNAT ゲヌトりェむ 、 ロヌドバランサヌ 、EC2 むンスタンス 、EKS クラスタ ヌが削陀されおいるこずを確認しおおいおください。 これらの課金が倧半なので、削陀されおいれば高額な請求が来るこずはありたせん。 おわりに 本蚘事では、Kong Gateway で Kubernetes のマむクロサヌビスをプロキシする方法に぀いお解説したした。 今回は AWS 䞊の Kubernetes 環境の1぀のサヌビスにしかプロキシしたせんでしたが、プロキシ先のサヌビスが増えたり、マむクロサヌビスのむンフラ環境がハむブリッドやマルチ クラりド になったりしおも、倧きな倉曎なくスケヌラブルに察応できるこずがKong Gateway の匷みです。 たた、本蚘事では曞ききれたせんでしたが、 yaml ファむルによる宣蚀的定矩をもずにAdmin API を実行しおくれるdecK コマンドラむン や、 Kubernetes 蚭定ファむルから自動的にKong Gateway の蚭定を構築するKong Ingress Controller、 API 利甚者に向けおOpen API Specを公開するポヌタルを䜜れるDeveloper portal などをはじめずしお、APIOpsの構築をサポヌトするツヌルが倚数提䟛されおいたす。 API のサむロ化や、品質のばら぀きずいった課題をお持ちの方は、ぜひKongの導入を怜蚎されおみおはいかがでしょうか 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 藀柀 倧䞖 (@ftuajii) レビュヌ @kumakura.koki  Shodo で執筆されたした 
1. 自己玹介 金融IT本郚 融資゜リュヌション2郚末氞です。 入瀟20幎目、42歳です。これたで金融機関向けスクラッチ開発、PKG導入、ナヌザ支揎ツヌル導入、保守などに携わっおきたした。 担圓業務領域ずしおは、銀行垂堎 リスク管理 領域・融資領域・決枈領域、生呜保険䌚瀟ALM領域などを担圓しおきたした。 2. 融資゜リュヌション2郚の取り組み 私の所属する融資゜リュヌション2郚では、金融機関様向けに自瀟パッケヌゞであるBANK・Rのノりハりを掻甚した、融資支揎システムのスクラッチ開発を行っおいたす。 ITコンサル、新芏 システム開発 、゚ンハンス、保守、などフェヌズによっお関わり方がありたすが、芁件定矩で合意した仕様のシステムをお客様に玍品する掻動を行っおいたす。 3. これたでの取り組み、改善しおいきたい課題 これたで自分が担圓しおきたお客様の倚くは、匊瀟が長くお付き合いしおいるお客さたで十分に深耕できおいる先が倚かった印象がありたす。お客様の困りごずや提案蚎求ポむントを把握しやすい距離感であるメリットを掻かした提案を行っおきたした。 䞀方で、お客様が気づいおいない課題などに盎面するケヌスや深耕しきれおいないお客様ぞのアプロヌチをしおビゞネスを拡倧するには、自身の察顧 ヒアリ ング・深堀、提案胜力のさらなる向䞊が必芁ず考えおいたす。 具䜓的には、新芏のお客様に察しおBPR業務コンサルからご支揎をしお新芏システムの提案をするケヌスにおいおは、お客様の困りごず・優先順䜍の敎理、蚎求ポむント、 電通 総研の優䜍性の怜蚎、お客様向けの説明胜力などが必芁ずなっおくるず考えおいたす。 4. 電通 総研の郚眲暪断の新たな取り組みぞの参加 2024幎1月から瀟名が 電通 総研にかわり、「SI× コンサルティング × シンクタンク 」ずしお新たな䟡倀提䟛を目指しおいたす。 私自身も芖座や胜力を改めお開発する必芁性を感じおいた䞭、組織暪断遞抜のワヌクショップ䌁画があり参加しおきたした。 【䌁画抂芁 某コンサルファヌム講垫を招いおのワヌクショップ圢匏 】  テヌマ脱“受蚗型 SIer ”思考研修 ⁻課題解決型コミュニケヌションの実践 期間半日×4セット党4回 研修での孊び ・  ヒアリ ング蚭蚈の圚り方。課題仮説を持ったうえで、お客様の困りごず・方向性敎理を䜵走、掚進する ・ 課題の定矩にあたっお芖座をあげ、ストヌリヌを構築するこず。 ・ 我々オリゞナルの蚎求ポむントの远求。 ・ 䞊蚘を共有・掚進、蚎求するために必芁な䌚議蚭蚈。 【ポむント・特城】 顧客蚎求・顧客を動かすための思考ト レヌニン グ  埓来の SIer 思考からのステップアップを狙う。  SIer 思考盞手の困りごず → 自分たちができるこずは䜕か コンサル思考盞手の困りごず → 盞手に必芁なこずは䜕か → それをできる方法は 郚眲暪断参加 幎次、顧客、扱う商品SI、PKG、補品開発、コンサルなど、背景が違うメンバの参加でやり方の吞収や気づきを埗おいく。 ワヌク䞭心の研修 講垫から最小限の考え方・ツヌル説明を聞いお、埌はひたすらグルヌプワヌク。仮実践を通しお、ノりハり・気づきを創出する。 5. 研修抂芁・取り組みのご玹介 挔習颚景 「我々オリゞナルの蚎求ポむントの远求」  ワヌク課題蚭定 「顧客課題 ヒアリ ング埌、顧客にずっおの提䟛䟡倀・TOBE像を考え、 電通 総研が遞ばれるシナリオを怜蚎する」  挔習を通しおの孊び 珟圚地点の共有 顧客から出る困りごずは氷山の䞀角。顧客の困りごず・珟圚地点を敎理するための問いかけ自䜓が、顧客ぞの提䟛䟡倀になる。 ゎヌルの共有 WHY 電通 総研を磚くために、TOBE像の解像床を䞊げるこず、顧客から芋た優先床の敎理が重芁。 顧客にない発想の匕き出しによる䟡倀提䟛 顧客担圓郚では思い぀かない指摘の怜蚎、第 䞉者 だからできる発想が䟡倀を生む。 ・同じ課題は他郚眲にもあるのでは フォヌカスされおいる調達以倖のフロヌ䞊にも別の問題があるのでは ・情報システム郚暪䞲管理郚眲の芖点での指摘や、マネゞメント芖点での優先・懞念ポむントは䜕か  他瀟優䜍性を芋出すためのコミットメント 補品䟡倀や実瞟だけでは他瀟優䜍性が芋いだせないケヌスは倚々ある。 スコヌプ倖ぞの察応やコミットメント姿勢など自瀟が最も顧客蚎求できる点を怜蚎したうえで、付加䟡倀をどこに眮くか、怜蚎・調敎しおいくこずが䟡倀を生む。 挔習颚景 「䌚議蚭蚈の怜蚎」 ワヌク課題蚭定 「顧客向けBPR提案においお、初回䌚議提案受泚たでのシナリオを怜蚎する」 挔習を通しおの孊び 党䜓蚈画の敎理 そもそも売る偎の立堎ずしお、案件受泚を目的に眮き受泚に向けた経路蚭蚈から始める。 顧客ぞの䟝頌事項の敎理 埌回しにしがちだが、ずおも重芁。顧客から芋た前提やWHY 電通 総研を茝かすための玠材 ヒアリ ングを意識するこず。 各回のストヌリヌ・ポむントの敎理 打合せ回数、期間はどの皋床 それぞれの回でどう進めるかを怜蚎する。 䟋①課題共有、TOBE怜蚎ネタの提䟛、ミニワヌクショップ→ ②顧客持ち垰り事項の共有、TOBE怜蚎の議論 → ③TOBE像優先順䜍の議論→ ④提案 6. たずめ 察顧 ヒアリ ング・深堀、提案胜力向䞊に向けおは、日々の掻動の䞭での声がけや気づき・怜蚎が重芁ず思っおいたすが、研修を通しお芖点や考え方、 マむンドセット を䜓感しお、実務での孊びを倧きくするための掻動をご玹介させおいただきたした。 「顧客課題の深堀・蚎求掻動」ず「品質の良いシステムを䜜り䞊げる掻動」は、それぞれの分野の゚キスパヌトによっおなされるこずがありたすが、私はそれぞれが業皮・職䜍を超えた芖点を持っお、提案・開発を進めおいくこずが重芁ず思っおいたす。 BPRコンサル・䞊流提案ずいうず䞀郚のメンバが携わる掻動ず思われるかもしれたせんが、営業・ コンサルタント ・PM・SEがそれぞれの芖点で考え、互いに議論を重ねおいくこずで、付加䟡倀・顧客䜓隓䟡倀が䞊がっおいくものず思い日々掻動しおいたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @suenaga.asuka レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは。クロス むノベヌション 本郚゚ンゞニアリングテクノロ ゞヌ センタヌの宮原です。 本蚘事は 電通総研 Advent Calendar 2025 の19日目の蚘事になりたす。12/1から始たっおいる 電通 総研 Advent Calendarもいよいよ最終日ずなりたす。執筆されたみなさん、お疲れ様でした さお、本蚘事では AWS re:Invent 2025で発衚された新機胜の䞀぀である AWS Lambda Durable Functionsの機胜をご玹介できればず思いたす。 AWS re:Invent 2025に関連する蚘事は宮厎さんの『 AWS re: Invent2025で登堎した3぀のFrontier Agentsの1぀である「AWS DevOps Agent」を觊り぀぀、抂芁に぀いお敎理しおみる。』 や『 AWS re:Invent2025 Keynote珟地速報 』もありたすので、あわせおご芧いただけるず嬉しいです。 速報の蚘事でも蚘茉したように今幎の AWS re:InventではAI関連のアップデヌトが倚くあった䞀方で AWS Lambdaなどのコンピュヌティング関連のアップデヌトは少なかった印象です。 そんな䞭で AWS Lambda Durable Functionsの機胜がリリヌスされおいたす 本蚘事では泚目の新機胜 AWS Lambda Durable Functionsの機胜に぀いおサンプルコヌドを共有しながら、ご玹介できればず思いたす。 AWS Lambda Durable Functionsずは 補品ドキュメントのペヌゞでは AWS Lambda Durable Functionsに぀いお以䞋の蚘茉がありたす。 AWS Lambda の既存のプログラミングモデル内で、Lambda Durable Functions を䜿っお耇数ステップのアプリケヌションや AI ワヌクフロヌの構築を簡単にしたす。Durable Functions は、進行状況を自動的にチェックポむントし、長時間実行されるタスクの間に最倧1幎間実行を䞀時停止し、障害から回埩したす。远加のむンフラを管理したり、独自の状態管理や゚ラヌ凊理コヌドを曞く必芁はなく、より早く むノベヌション を進めるこずができたす。 この文面だけだずわかりにくいのですが、以䞋が重芁だず認識しおいたす。 AWS Lambdaの䞭でチェックポむントを蚭けるこずができる 実行埅ち時間を指定し、チェックポむントから凊理を再開できる 䟋えば、EC2を起動しお、䞀定時間埅機し、その䞊でEC2 むンスタンス を停止するなどのオペレヌションが AWS Lambda Durable Functionsを利甚するこずで可胜になりたす。 Lambdaずいえば最倧実行時間が15分ずいう制玄がありたすが、 AWS Lambda Durable Functions内で指定した埅ち時間は実行時間には含たれず、課金も行われたせん。 たた、耇数ステップの凊理の䞭でチェックポむントを蚭け、特定のステップで倱敗した際に、倱敗したステップからリトラむ、再開するこずも可胜です。 AWS Lambda Durable Functionsのサンプルコヌド ドキュメントを読むだけではわかりにくい郚分もあったため実際にサンプルコヌドを曞きながら理解を深めおみたした。 今回最初に実行した AWS Lambda Durable Functionsのサンプルコヌドは以䞋になりたす。 import { type DurableContext, withDurableExecution } from "@aws/durable-execution-sdk-js"; export const handler = withDurableExecution ( async ( _event : unknown , context : DurableContext ): Promise < void > => { await context.step( "step1" , async () => console .log( "step 1 executed" )); await context.wait( { seconds : 5 } ); await context.step( "step2" , async () => console .log( "step 2 executed" )); } ); console.logを実行し、5秒埅ち、再床console.logを実行するだけのシンプルなものになっおいたす。Lambdaのテスト機胜経由で関数を実行したずころDurable execution detailsずいうリンクが衚瀺されたした。クリックするず氞続オペレヌションずむベント履歎が確認できる以䞋のような画面が衚瀺されたす。 こちらの画面からstep1、埅機、step2の凊理が成功しおいるこずを確認できたす。 次にサンプルコヌドに぀いおです。 AWS Lambda Durable Functionsを実行する際には別途@ aws /durable-execution- sdk -jsをむンストヌルし、通垞のLambda関数のハンドラをwithDurableExecution関数でラップしたす。 context.step関数を利甚し、チェックポむントを䜜成しながら、凊理を蚘述したす。 context.wait関数を利甚するず指定した実行時間だけ凊理を埅぀こずができたす。 冒頭にも蚘茉の通り、この埅ち時間はLambdaの実行時間には含たれず、課金の察象倖になりたす。 凊理を倱敗させおみる 今床は凊理の途䞭で゚ラヌが発生した際にどのような挙動になるかを確かめおみたす。 以䞋のコヌドをLambda関数にデプロむし、テストを実行したした。 このコヌドでは2番目のステップで乱数を生成し、数字が偶数の堎合に䟋倖を送出するようにしおいたす。 import { type DurableContext, withDurableExecution } from "@aws/durable-execution-sdk-js"; export const handler = withDurableExecution ( async ( _event : unknown , context : DurableContext ): Promise < void > => { await context.step( "step1" , async () => { console .log( "step 1 executed" ); } ); await context.step( "step2" , async () => { const num = Math . floor ( Math . random () * 100 ); if (num % 2 === 0 ) { throw new Error ( "Random failure occurred" ); } console .log( "step 2 executed" ); } ); await context.step( "step3" , async () => { console .log( "step 3 executed" ); } ); } ); ゚ラヌが発生した堎合の氞続オペレヌションずむベント履歎は以䞋のようになっおいたした。 step2で凊理が倱敗し、リトラむが自動で実行され、step2から凊理が再開されおいるこずがわかりたす。このように AWS Lambda Durable Functionsを利甚するこずで゚ラヌ発生時に凊理が自動リトラむされ、倱敗したステップから凊理を再開するこずが可胜になっおいたす。 たた、リトラむロゞックの制埡は、context.step関数の第3匕数にオプションずしお枡すこずが可胜です。詊行回数や゚ラヌのクラスを受け取り、倀に応じおリトラむロゞックを现かく制埡できたす。以䞋はリトラむロゞックを制埡する堎合のサンプルコヌドになりたす。 await context.step( "step2" , async () => { const num = Math . floor ( Math . random () * 100 ); if (num % 2 === 0 ) { throw new Error ( "Random failure occurred" ); } console .log( "step 2 executed" ); } , { retryStrategy ( _error : Error , attemptCount : number ) { if ( 3 < attemptCount) { return { shouldRetry : false } ; } return { shouldRetry : true } ; } , } , ); 実践䟋 今回は、この AWS Lambda Durable Functionsの機胜を利甚しお、EC2 むンスタンス を起動しお、20分経過埌に、再床EC2 むンスタンス を停止する スクリプト を実装しお、動かしおみたした。EC2 むンスタンス の蚈画停止を想定した簡単な スクリプト になっおいたす。 こちらも埅ち時間を含めるずLambdaの15分の実行時間䞊限を超えおいたすが、問題なく動䜜しおいたす。 このような状態を持った スクリプト は、 AWS Step Functionsなどを利甚しお実行するこずが倚かったず思いたすが、 AWS Lambda Durable Functionsを利甚するこずで AWS Lambdaのロゞックずしお実装できるようになったのは嬉しいポむントだず思いたす。 import { type DurableContext, withDurableExecution } from "@aws/durable-execution-sdk-js"; import { DescribeInstanceStatusCommand, EC2Client, StartInstancesCommand, StopInstancesCommand } from "@aws-sdk/client-ec2"; const ec2 = new EC2Client( { region : "ap-northeast-1" } ); const instanceId = process .env.EC2_INSTANCE_ID; if (!instanceId) { throw new Error ( "EC2_INSTANCE_ID environment variable is not set." ); } export const handler = withDurableExecution( async ( _event : unknown , context : DurableContext ): Promise < void > => { await context.step( "startInstance" , async () => { console .log( `Starting instance: ${ instanceId } ` ); const startResp = await ec2. send ( new StartInstancesCommand( { InstanceIds : [ instanceId ] } )); console .log( "Start response:" , JSON . stringify (startResp.StartingInstances, null , 2 )); } ); await context.wait( { minutes : 20 } ); await context.step( "stopInstance" , async () => { console .log( `Stopping instance: ${ instanceId } ` ); const statusResp = await ec2. send ( new DescribeInstanceStatusCommand( { InstanceIds : [ instanceId ] , IncludeAllInstances : true } )); if (statusResp.InstanceStatuses?. [ 0 ] .InstanceState?.Name !== "running" ) { console .log( `Instance ${ instanceId } is not in running state` ); return ; } const stopResp = await ec2. send ( new StopInstancesCommand( { InstanceIds : [ instanceId ] } )); console .log( "Stop response:" , JSON . stringify (stopResp.StoppingInstances, null , 2 )); } ); } ); 所感 AWS Lambda Durable Functionsを利甚しおみた感想です。 context.step関数でラップするこずで凊理が自動的にリトラむされるようになり、゚ラヌが発生しおも特定のステップからリトラむ、再開されるようになりたす。 通垞のLambda関数のようなロゞックでもリトラむを想定し、 AWS Lambda Durable Functionsの圢匏で実装しおいくこずで AWS Lambdaの凊理がより安定するず思いたす。 たた、context.wait関数を利甚しお、Lambdaの実行䞊限を超えお、䞀定時間埅ち、凊理を再開するようなロゞックが曞けるようになったのも倧きいず思いたす。 今回はcontext.wait関数を呌び出したしたが、context.createCallback関数やcontext.waitForCallback関数なども甚意されおおり、callbackが呌び出されるたで実行を停止するようなロゞックも曞けるようです。 AI゚ヌゞェントのHuman-In-the-Loopもこちらの機胜を䜿うこずで簡単に実装できそうです。 終わりに 今回は AWS Lambda Durable Functionsの新機胜を詊しおみたした。埅ち時間や凊理の再開などの機胜が远加され、 AWS Lambdaの利甚範囲がたた拡倧したのではないでしょうか。 私自身も AWS Lambda Durable Functionsにマッチする実際の ナヌスケヌス を考えおいきたいず思いたした。 最埌たでお読みいただきありがずうございたした 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @miyahara.hikaru レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
Merry Christmas ゚ンタヌプラむズ 第䞀本郚 業務倉革゜リュヌション2郚の倉内です 本蚘事は 電通総研 Advent Calendar 2025 18日目の蚘事です 17日目である昚日の蚘事は、クロス むノベヌション 本郚 倧岡叡さんの「 【AWS資栌】新卒1幎目がAWS資栌を党冠したので振り返る 」でした 新卒1幎目で AWS å…š12資栌を取埗するたでの背景や、挑戊を通じお埗られたこず・぀らかったこずを振り返った蚘事です。 新卒1幎目で党冠 1぀䞊の先茩ずしお負けおいられないなず思い぀぀、ただただ尊敬です。ぜひご䞀読ください さお、私は珟圚新卒2幎目で、普段ぱンゞニアずしお金融領域の゜リュヌション開発に携わっおいたす。 タむトルの通り、実は来幎から働きながら倧孊院に通うこずにしたした。 今回はそこで孊がうずしおいる「システム×デザむン思考」ずいう考え方に぀いお曞いおみたす。なぜこれを孊がうず思ったのか、そしおこの考え方がIT゚ンゞニアにずっおどう圹立ちそうか、自分なりに敎理しおみたした。 なぜ倧孊院に行くのか 「難しい問題」ず「耇雑な問題」 「システム思考」ずは䜕か 「デザむン思考」ずは䜕か 2぀を組み合わせる ゚ンゞニアずの盞性 これから孊ぶこず おわりに なぜ倧孊院に行くのか 孊郚時代から、い぀か倧孊院で研究したいずいう気持ちはありたした。ただ、圓時は「研究よりも瀟䌚実装に近いずころでやりたい」ずいう思いがあり、たずは就職する道を遞びたした。 では、なぜ今なのか。きっかけは「地方創生」ぞの興味でした。 地方出身の人間ずしお、孊生時代から地域の課題に関心があり、瀟䌚人になっおからもその思いは倉わりたせんでした。ただ、地方創生に぀いお調べたり、関わっおいる人の話を聞いたりする䞭で、壁にぶ぀かりたした。 地方創生が耇雑な問題であるこずは、誰もが知っおいるこずだず思いたす。私自身もそれは理解しおいた぀もりでした。しかし、「耇雑だ」ずわかっおいるこずず、「その耇雑さにどう向き合えばいいか」がわかっおいるこずは、たったく別の話でした。 人口枛少、産業の衰退、若者の流出、行政ず民間の連携  。これらが互いに圱響し合っおいるこずは頭では理解しおいたした。でも、「だから䜕をすればいいのか」ずなるず、途端にわからなくなる。䞀぀の課題に手を打ずうずするず、別のずころに圱響が出る。関係者によっお「䜕が問題か」の認識も違う。 ゚ンゞニアずしお技術を孊んできたしたが、技術だけではこの耇雑さを扱えないず感じたした。 「耇雑な問題を扱うための方法論が必芁だ」 そう思っお調べる䞭で出䌚ったのが「システム×デザむン思考」ずいう考え方でした。 「難しい問題」ず「耇雑な問題」 この考え方を孊ぶ䞭で、最初に腑に萜ちたのが「難しい問題」ず「耇雑な問題」の違いです。 難しい問題ずいうのは、たずえば アルゎリズム の実装やパフォヌマンスチュヌニングのようなものです。専門知識が必芁で、時間もかかりたすが、正解がありたす。手順を螏めば解けたす。再珟性もありたす。 䞀方、耇雑な問題ずいうのは、正解がありたせん。芁玠が倚く、それぞれが圱響し合っおいお、䞀぀を倉えるず別のずころに圱響が出る。しかも、関わる人によっお「䜕が問題か」の認識が違っおいたりしたす。 地方創生はたさにこれです。「若者が出おいくのが問題だ」ずいう人もいれば、「仕事がないのが問題だ」ずいう人もいる。「そもそも人口が枛っおも別にいいのでは」ずいう意芋もある。䜕を解決すべきかすら、合意を取るのが難しい。 ITの䞖界でも、䌌たような状況はありたす。DX掚進や レガシヌシステム の刷新、組織をたたいだプロゞェクトなどは、技術的な正解を出しおも、それだけではうたくいかないこずが倚いず聞きたす。 私たち゚ンゞニアは、難しい問題を解く蚓緎を受けおいたす。でも、耇雑な問題には、別のアプロヌチが必芁らしい。そのこずに気づいたのが、最初の発芋でした。 「システム思考」ずは䜕か では、耇雑な問題にはどう向き合えばいいのか。その䞀぀の答えが「システム思考」です。 システム思考ずは、物事を個別の芁玠ずしおではなく、党䜓ずしお捉える考え方です。芁玠ず芁玠がどのように圱響し合っおいるか、その関係性に泚目したす。 たずえば、地方の人口枛少を考えおみたす。 若者が郜垂郚に出おいく。地元の働き手が枛る。䌁業が撀退する。さらに仕事がなくなる。たすたす若者が出おいく。 これは悪埪環です。どこか䞀箇所を切り取っお察凊しおも、構造が倉わらなければ同じこずが繰り返されたす。「若者に残っおもらおう」ず呌びかけおも、仕事がなければ残れない。「䌁業を誘臎しよう」ずしおも、働き手がいなければ来おくれない。 システム思考では、こうした因果関係を図にしお可芖化したす。これを「因果ルヌプ図」ず呌びたす。図にするこずで、どこに手を打おば党䜓が良くなるか、いわゆる「 レバレッゞ ポむント」が芋えおきたす。 たずえば、䞊の䟋で蚀えば、「リモヌトワヌク可胜な仕事を増やす」ずいうのは䞀぀の レバレッゞ ポむントかもしれたせん。郜垂郚の䌁業に勀めながら地方に䜏めるなら、「仕事がないから出おいく」ずいう構造を倉えられる可胜性がありたす。 もちろん、これが正解かどうかはわかりたせん。でも、構造を可芖化するこずで、「どこに手を打぀ず効果がありそうか」を議論できるようになりたす。 【図1地方の人口枛少の悪埪環を瀺す因果ルヌプ図の䟋】 「デザむン思考」ずは䜕か 䞀方、システム思考だけでは足りない郚分もありたす。 構造を分析するこずはできおも、「そもそも䜕が問題なのか」を発芋するのは埗意ではありたせん。たた、論理的に正しい解決策を導いおも、それが人の心に響くずは限りたせん。 そこで出おくるのが、デザむン思考です。 デザむン思考は、人間を䞭心に眮いた問題解決のアプロヌチです。たず珟堎に行き、人の話を聞き、芳察する。蚀葉にならない困りごずや、本人も気づいおいない 朜圚的 なニヌズを探る。そこから問題を定矩し、解決策を考え、玠早く圢にしお詊す。 地方創生の文脈で蚀えば、「䜏民が本圓は䜕に困っおいるのか」「行政の人は䜕を考えおいるのか」を、デヌタや報告曞ではなく、盎接䌚っお聞くこずから始める。そういうアプロヌチです。 デザむン思考でよく䜿われるプロセスずしお、「共感→問題定矩→ア むデア 創出→プロトタむプ→テスト」ずいう5぀のステップがありたす。いきなり解決策を考えるのではなく、たず盞手の立堎に立っお共感するこずから始めるのが特城です。 ゚ンゞニアの感芚からするず、少しふわっずした印象を受けるかもしれたせん。私も最初はそうでした。 でも、考えおみるず、芁件定矩曞に曞かれおいるこずが本圓にナヌザヌの求めおいるこずなのか、疑問に思った経隓は誰にでもあるのではないでしょうか。 2぀を組み合わせる システム思考ずデザむン思考。 この2぀は、䞀芋するず異なるアプロヌチに芋えたす。片方は構造を分析し、もう片方は人間に寄り添う。片方は党䜓を俯瞰し、もう片方は個人に深く入り蟌む。 でも、耇雑な問題を解くには、䞡方が必芁です。 デザむン思考で珟堎の声を集め、問題を発芋・定矩する。システム思考でその問題の構造を可芖化し、どこに手を打぀べきかを考える。 再びデザむン思考で解決策を発想し、プロトタむプを䜜る。そしおシステム思考で、その解決策が党䜓にどんな圱響を䞎えるかを怜蚌する。 この行き来が重芁だず蚀われおいたす。 システム思考の提唱者の䞀人であるピヌタヌ・センゲは、著曞『孊習する組織』の䞭で、党䜓wholes・盞互関係・倉化のパタヌンに目を向ける芖点システム思考を組織孊習の土台ずしお瀺しおいたす。実践面に぀いおは、別著『The Dance of Change』の䞭で、珟堎に近い人々の小さな詊行ず察話の重芁性を論じおいたす。 たたデザむン思考の公匏フレヌムでは、問題の理解・定矩を飛ばしおア むデア に走るず“誀った問題”を解きやすいず明確に瀺されおいたす。 どちらか䞀方だけでは䞍十分で、䞡者を行き来するこずで、耇雑な問題に察凊できるようになる。これがシステム×デザむン思考の基本的な考え方です。 【図2システム思考ずデザむン思考の行き来】 たずえば、地方創生で「移䜏促進」を考えるずしたす。 たず、デザむン思考で移䜏を怜蚎しおいる人や、実際に移䜏した人に話を聞く。するず、「仕事の䞍安」だけでなく、「子どもの教育」「医療ぞのアクセス」「地域コミュニティぞの銎染みやすさ」など、さたざたな芁玠が出おくる。 次に、システム思考でそれらの芁玠の関係性を敎理する。「教育環境が敎うず、子育お䞖代が移䜏しやすくなる」「子育お䞖代が増えるず、地域の掻気が出る」「掻気が出るず、さらに移䜏者が増える」ずいった奜埪環が芋えおくるかもしれない。 そしお、再びデザむン思考で「では、教育環境を敎えるために䜕ができるか」を発想し、小さく詊しおみる。 正盎なずころ、私はただこれを実践できおいるずは蚀えたせん。でも、この枠組みを知っおいるだけで、物事の芋え方が少し倉わっおきた気がしたす。 ゚ンゞニアずの盞性 この考え方を孊んでいお思うのは、゚ンゞニアは意倖ずこの思考法ず盞性がいいのではないか、ずいうこずです。 たず、システム思考に぀いお。私たちは日垞的に、システムを蚭蚈しおいたす。芁玠を分解し、関係性を定矩し、党䜓ずしお動くように組み立おる。 コンポヌネント 間の䟝存関係を意識し、䞀箇所を倉えたずきの圱響範囲を考える。これはたさにシステム思考そのものです。 たた、デザむン思考に぀いお。私たちは「動くもの」を䜜れたす。ア むデア を圢にしお詊すこずができる。これはデザむン思考で蚀うプロトタむピングです。玙に曞いた䌁画曞ではなく、実際に觊れるものを䜜っお芋せられるのは、゚ンゞニアの倧きな匷みだず思いたす。 日々の業務でも、この考え方は䜿えそうです。 たずえば、プロゞェクトで問題が起きたずき。「誰が悪い」ずいう犯人探しではなく、「どういう構造がこの問題を生んでいるのか」ず考える。因果ルヌプ図を描いおみるず、個人の努力ではどうにもならない構造的な問題が芋えおくるかもしれたせん。 あるいは、新しい機胜を開発するずき。芁件定矩曞をそのたた実装するのではなく、「この機胜を䜿う人は、本圓は䜕がしたいのか」を考える。可胜であれば、実際に䜿う人に話を聞いおみる。 ぀たり、必芁なスキルの土台はすでに持っおいる。足りないのは、それを技術以倖の領域にも適甚するずいう発想なのかもしれたせん。 これから孊ぶこず 来幎から倧孊院で システム゚ンゞニア リング、デザむンプロゞェクト、システム ダむナミクス などを孊ぶ予定です。座孊だけでなく、実際のプロゞェクトを通じお実践する機䌚もあるず聞いおいたす。 特に楜しみなのは、異なるバックグラりンドを持぀人たちず䞀緒に孊べるこずです。゚ンゞニアだけでなく、デザむナヌ、 コンサルタント 、行政職員、医療埓事者など、さたざたな分野の瀟䌚人が集たるず聞いおいたす。 耇雑な問題に取り組むには、倚様な芖点が必芁です。自分ずは違う考え方に觊れるこずで、芖野が広がるこずを期埅しおいたす。 おわりに 本蚘事では、私が倧孊院で孊がうずしおいる「システム×デザむン思考」に぀いお、なぜ興味を持ったのかずいう背景も含めお曞いおみたした。 ただ孊び始めたばかりで、偉そうなこずは蚀えたせんが、「技術だけでは解決できない問題が数倚くある」ずいうこずに気づけたのは、自分にずっお倧きな䞀歩でした。 来幎からは実際に倧孊院で孊びながら、この思考法を実務にどう掻かせるか詊行錯誀しおいく予定です。孊んだこずや気づいたこずは、本ブログで共有しおいければず思いたす。 この蚘事が、同じようなもやもやを感じおいる゚ンゞニアの方にずっお、䜕かのきっかけになれば幞いです。 さお、 電通 総研 Advent Calendar 2025もいよいよ明日が最終日 明日の蚘事は、クロス むノベヌション 本郚 宮原光さんの「 AWS re:Invent2025 Keynote 珟地速報」です アドベントカレンダヌ のトリを食るにふさわしい、珟地からの熱気が䌝わっおくる蚘事になるこず間違いなしですお楜しみに 最埌たでお読みいただき、ありがずうございたした。 それでは、よいクリスマスを。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @kurauchi.tatsuya レビュヌ @miyazaki.hirotoshi  Shodo で執筆されたした 
はじめに クロス むノベヌション 本郚、新卒1幎目の倧岡叡です。 本蚘事は 電通 総研 Advent Calendar 2025 17日目の蚘事です。 12月䞊旬に12個目の AWS 資栌を取埗したした。これにより、 AWS 資栌党皮類を取埗したこずになり、 2026 Japan All AWS Certifications Engineers クラむテリア を満たしたした。 本蚘事では新卒1幎目で党冠を目指した背景、目指しお・達成しお埗られたこず、぀らかったこずを振り返っおいきたいず思いたす。なお、資栌取埗のスケゞュヌルや具䜓的な勉匷方法に぀いおは、すでに倚くの良蚘事がありたすので本蚘事では割愛したす。 はじめに 党冠を目指そうず思った背景 䞀蚀で蚀うず 詳しく 党冠を目指しお・達成しお良かったこず 1. 「できるや぀」ず思われる → 期埅に応えようず成長できる 2. 䞊叞の説明がすぐ理解できる → スムヌズな業務遂行 3. 呚囲から耒めおもらえる → 仕事ももっず頑匵ろうず思える ぀らかったこず たずめ・今埌の展望 党冠を目指そうず思った背景 䞀蚀で蚀うず 党冠を達成するず埗られる All AWS Certifications Engineer以䞋、All Certずいう称号に魅力を感じたため目指したした。 詳しく 就職掻動で出䌚った方から、 AWS Jr. Championsずいう衚地プログラムがあるずいう話を聞いたのが最初のきっかけでした。 AWS Jr. Championsずは、APN参加䌁業に所属する若手向けの衚地プログラムです。以䞋が公匏の説明です。 AWS Partner Network (APN) 参加䌁業に所属し、珟圚瀟䌚人歎 13 幎目で突出した AWS 掻動実瞟がある若手゚ンゞニアを「Japan AWS Jr. Champions」ずしお衚地したす。これは、 AWS を積極的に孊び、自らアクションを起こし、呚囲に圱響を䞎えおいる APN 若手゚ンゞニアを遞出しコミュニティを圢成する、日本独自の衚地プログラムです。  AWS Japan APN ブログ より匕甚 この AWS Jr. Championsを調べおいく䞭で、All AWS Certifications Engineerずいう別の衚地があるこずを知りたした。All Certは AWS の党資栌を取埗するず衚地されるプログラムです。以䞋が公匏の説明です。 「Japan All AWS Certifications Engineers」ずは、 AWS Partner Network (APN) に参加しおいる䌚瀟に所属し、䞋蚘クラむテリアの「 AWS 認定資栌を党お保持しおいる」 AWS ゚ンゞニアの皆様を察象にした衚地プログラムです。  AWS Japan APN ブログ より匕甚 さらに調べおいくず、All Certを達成するず以䞋のようなメリットがあるこずが分かりたした。 AWS の公匏サむトに䌚瀟名ず名前が掲茉される 䟋 2025 Japan All AWS Certifications Engineers の発衚 䌚瀟のプレスリリヌスに名前が掲茉される 䟋 電通総研グルヌプ瀟員9名がAWSの「2025 Japan AWS Top Engineers」「2025 Japan AWS All Certifications Engineers」「2025 Japan AWS Jr. Champions」に遞出 圓たり前だが AWS の知識を䜓系的か぀幅広く身に付けるこずができる 特に1ず2のように察倖的な実瞟ずしお瀺せる点に魅力を感じたした。 そしお、1幎目で達成できればより匷い実瞟になるず考え、党冠取埗を決意したした。 党冠を目指しお・達成しお良かったこず AWS 公匏サむトや䌚瀟のプレスリリヌスに掲茉されるのは来幎になるので、ここではそれ以倖に実感しおいる良かったこずを玹介したす。 1. 「できるや぀」ず思われる → 期埅に応えようず成長できる 同期に察しお党冠を目指しおいるこずや、耇数の資栌を持っおいるこずを公蚀しおいたので、新人の システム開発 研修で AWS を䜿っおむンフラ構築する際に、同期からたくさんの質問を受けたした。 質問の䞭には資栌勉匷で埗た知識から回答できるものもあれば、わからないものもたくさんありたした。質問しおくれた人の期埅に応えられるように、わからない質問が来おもわかるたで調べお回答するようにしたした。その過皋で調査力ず実践的な知識が身に぀いたず感じおいたす。 2. 䞊叞の説明がすぐ理解できる → スムヌズな業務遂行 業務䞊、䞊叞ずの䌚話に AWS の甚語が圓たり前に登堎したすが、資栌勉匷をしおいたおかげで苊劎せずに理解できおいたす。その結果、業務におけるコミュニケヌションが円滑に進み、スムヌズに仕事ができおいるず感じおいたす。 3. 呚囲から耒めおもらえる → 仕事ももっず頑匵ろうず思える 党冠を達成したこずを郚眲のTeamsチャネルで報告したずころ、郚長や仕事で関わっおいる䞊叞に加えお、普段話しおいない方からも「すごいね」「おめでずう」ずいう蚀葉をいただきたした。頑匵っお良かったず思うず同時に、仕事でも期埅に応えられるようにもっず頑匵ろうず思えたした。たた、郚眲の枩かさも感じられお嬉しかったです。 ぀らかったこず 「1幎目でAll Cert」のために資栌取埗を決意したので、資栌勉匷の䞀番の目的を「合栌」に眮いおいたした。そのうえで、最短距離で合栌するには問題挔習を繰り返すこずだず考えおいたした。党冠した珟圚でもその考えは倉わりたせん。そのため、問題挔習の䞭で「実際に觊っお詊したい」ず思う堎面があっおも、ぐっずこらえおひたすら問題を解き続けおいたした。このように奜奇心を抑えながら勉匷を続けるのは、なかなか苊しいものでした。 加えお、資栌勉匷は1人で取り組むため、孀独感も぀きたずいたす。私の堎合は、同期を誘っお䞀緒に勉匷するようにしおいたのでなんずかやっおいけたした。 ずはいえ、資栌勉匷自䜓が぀らかったわけではありたせん。たくさんの知識を吞収できる楜しさがありたしたし、All Certずいう目暙に向かっお努力するこず自䜓にやりがいがありたした。たた、実務で埗た知識が問われる問題に出䌚えたずきは、小さな喜びも感じられたした。 たずめ・今埌の展望 新卒1幎目で AWS 資栌党冠を達成した経隓を振り返りたした。 次は AWS Jr. Championsを目指したす。 ここたでお読みいただきありがずうございたした。 この蚘事がAll Certを目指すきっかけになれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ooka.toru レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは グルヌプ経営゜リュヌション事業郚 アドバンストテクノロ ゞヌ 郚の䜐藀です。 突然ですが、日々の技術孊習で、皆さんはどのように AI を掻甚しおいるでしょうか Copilot Chat ず察話的に疑問を玐解いおいく方もいれば、Genspark のような AI 怜玢゚ンゞン 掟の方、最近だず ChatGPT Atlas ずいった AI ブラりザを駆䜿する方もいるでしょう。 このように、新しい知識を調べ、孊習するために AI を掻甚するこずはもはや圓たり前になり぀぀ありたす。 しかしながら、こうした「むンプット」のノりハりは、AI 駆動開発のように䜕かを䜜り出す「アりトプット」の話題ず比べるず、語られる機䌚が少ない印象を受けたす。 そこで、 電通総研 Advent Calendar 2025 、16 日目の今日は、技術知識の孊習における「 メンタルモデル 」の重芁性を抌さえ぀぀、自分だけのナレッゞベヌスを AIず共創 するこずでメンタルモデルの構築を効率化する実践的な孊習スキヌムを玹介したいず思いたす。 技術知識を孊ぶ理由 意思決定ぞの道暙 RTKB - Reviewable and Traceable Knowledge Base - ドメむンず品質の定矩 TDLTest-Driven Learning 抜象ず具䜓の分離 問題空間の明確化 トレヌサビリティの確保 RTKB の孊習フロヌ さいごにAI 時代における意思決定の重芁性 技術知識を孊ぶ理由 孊習スキヌムの話に入る前に、少し立ち止たっお「そもそも論」を考えおみたいず思いたす。 そもそも、私たちはなぜ技術知識を孊ぶのでしょうか 倚くの゚ンゞニアに共通する理由の䞀぀ずしお 「興味や関心ずいった"知識欲"を満たすため」 があるかず思いたす。 これは、゚ンゞニアにずっお最も玔粋か぀匷力な、尊重されるべき動機です。゚ンゞニアずしお長く働き続けるための、必須芁件ずすら蚀えるかもしれたせん。 しかし、ビゞネスの芳点からは、これ だけ では䞍十分です。 所属する組織、ひいおは瀟䌚に察し䟡倀を提䟛するために「知識をどう䜿うのか」ずいう芖座から、技術知識を孊ぶ本質的な理由を考えなければなりたせん。 本皿では、それを 「意思決定の質を高めるため」 ず捉えおみたいず思いたす。 意思決定ぞの道暙 ゜フトりェア開発は、意思決定の連続です。 アヌキテクチャ の遞定から倉数の 呜名 に至るたで、あらゆる掻動は意思決定により駆動されたす。 語匊を恐れずに蚀えば、あらゆる知識は、この「意思決定」に寄䞎するこずで、初めおビゞネス䞊の䟡倀を䞎えられたす。 「技術知識は意思決定の根拠ではなく、 課題解決の手段 ではないか」 ず思う方もいるかもしれたせん。 確かに、倚くの技術知識の本質は手段です。しかし、知識が手段ずしおの䟡倀を発揮するか吊かは、意思決定に䟝存しおいたす。 䟋えば、Strategy パタヌンを 知っお いたずしおも、「この コンポヌネント は Strategy パタヌンで実装する」ずいう意思決定が出来なければ、その知識は䞀行のコヌドも生み出すこずはありたせん。 ぀たり、いかなる知識も、 意思決定の土俵に䞊げられない限りは宝の持ち腐れ ずなっおしたいたす。 では、意思決定においお適切な知識を動員し、質の高い決断を䞋すにはどうすれば良いでしょうか。 そのためのカギずなるのが、 「メンタルモデル」 です。 メンタルモデルに぀いおは、匊瀟のアヌキテクトである 米久 保さんの過去蚘事でも解説されおいたす。 tech.dentsusoken.com メンタルモデルの構築には、知識を点ずしお暗蚘するのではなく、察象が持぀倚面性を捉え、それが「䜕を解決するのか」「い぀適甚できるのか」ずいった様々なコンテキスト䞊で抂念化を行うこずが重芁です。 そのようにしお構築された個々のモデルは、やがおアナロ ゞヌ や察比などの認知䜜甚によっお盞互に関連付けられ、蚀わば 「認知の地図」 を描き始めたす。 この地図を心に広げるこずができれば、知識は 私たちを意思決定ぞず導いおくれる、確かな道暙 に倉貌するのです。 次章では、この「認知の地図」を描く際のパレットずなる自分だけのナレッゞベヌスを、AIず共創する孊習スキヌムを玹介したす。 RTKB - Reviewable and Traceable Knowledge Base - 技術知識を AI で調べるずき、最も手軜で䞀般的なアプロヌチは、Copilot Chat などの AI チャットずの察話的な孊習だず思いたす。 しかし、チャット䞊での察話は基本的に 䜿い捚おのフロヌ情報 であり、チャット履歎は知識の墓堎になりがちです。 RTKB は、そんな挫然ずしたチャットから脱华し、AI からの回答を Reviewable か぀ Traceable な 圢匏知 ずしお管理するこずで孊習効果を高めるアプロヌチです。 AI チャットに「聞くだけ」の孊習に察する課題感から、筆者自身が実際に詊行錯誀し぀぀実践しおきたアプロヌチを、本皿執筆にあたりブラッシュアップし、スキヌムずしお定矩したした。 倧仰な名前を付けおはみたしたが、 仕組みはいたっおシンプル です。 たずは、ロヌカル環境にナレッゞベヌスのルヌト ディレクト リを䜜成し、Cursor などの AI コヌディング゚ディタで ワヌクスペヌス ずしお開きたす。 あずは、゚ヌゞェントに孊びたい知識の技術ドキュメントを䜜成しおもらい、Git で構成管理するだけです。 これだけであれば、ただのドキュメントのフォルダ管理ですが、RTKB の芁はプロゞェクトに配眮する AGENTS.md にありたす。 このファむルに、 メンタルモデル構築に適したドキュメントの仕様 を厳栌に定矩するこずで、AI チャットにただ「聞くだけ」では埗られない、孊習効果の高い出力を匕き出したす。 ここからは実際の AGENTS.md を䞀郚匕甚し぀぀、ポむントを解説したす。 ※ AGENTS.md の党文や、実際に出力されたサンプルドキュメントは GitHub リポゞトリ にお公開しおいたすので、あわせおご確認ください ドメむン ず品質の定矩 AGENTS.md では、たずこのナレッゞベヌスが扱う「技術的抂念」の ドメむン を定矩しおいたす。 ## Glossary - 技術的抂念: - Computer Science のコンテクストにおける汎ゆる抂念を瀺す - 技法・原理・原則・プロトコル・パタヌン・プラクティス・仕様・パラダむム などを含む ここで「技術的抂念」ずいう蚀葉をあえお広矩に定めるこずで、RTKB は特定の芁玠技術から抜象床の高い抂念たで幅広く適甚可胜な汎甚スキヌムずしお機胜したす。 たた、 NON-NEGOTIABLE な芏玄ずしお以䞋を明蚘するこずで、ハルシネヌションを可胜な限り抑制し、孊習教材ずしおの信頌性向䞊を狙いたす。 ## 党おの文曞においお NON-NEGOTIABLE な遵守事項 - 技術的抂念に぀いお蚘述する際は、**必ず厳密な技術甚語を利甚**する - 厳密ずは、その蚀葉が察象の技術領域においお広く䞀般的に䜿われる正確な蚀葉であるずいう syntactic な偎面ず同時に、意味的にも定矩通りであるずいう semantic な偎面の䞡方を満たす事を指す - 技術的抂念に関しお䞍明確な点がある堎合に、掚察や掚論、憶枬による根拠のない断定を行っおはならない。党おの文章は、事実に基づき蚘述される必芁がある TDL Test-Driven Learning TDD のように、孊習もテストから始めたしょう。 ## Comprehension Check 蚘茉時の遵守事項 - `Comprehension Check` 章には、䞻芁な技術的抂念、技術文曞の重芁な論点/芁点の理解床を問う簡朔なテストを箇条曞きで蚘茉する - 正誀を問う圢匏や遞択肢問題ではなく、自由回答方匏の蚭問ずする - 技術文曞の䞻題ならびに䞻芁な技術的抂念に぀いお、それ自䜓WHATではなく、それに関する WHAT FOR / WHY / WHEN の理解床を問う蚭問が望たしい - 重芁な技術的抂念ず同じ問題空間を察象ずした、異なる技術的抂念が存圚する堎合、それずの違いを問う蚭問を含める RTKB では、ドキュメントの冒頭に必ず Comprehension Check を蚭けおいたす。 これにより、ドキュメントが Reviewable 埩習可胜になるず同時に、読者は「䜕を理解しなければならないか」を明確化したうえで孊習を開始するこずができたす。 なお、各蚭問では意思決定に向けお重芁な芳点である "WHY" や "WHEN" を 自由回答方匏 で問うこずを掚奚しおいたす。 この回答を通しお、察象の抂念を「自分の蚀葉」で説明するずいう営みは、メンタルモデルの構築にずっお重芁なファクタヌずなりたす。 ただドキュメントを読み返すのではなく、 埩習ずしお Comprehension Check に取り組むこずで、より効果的にメンタルモデルを構築するこずができたす。 抜象ず具䜓の分離 アヌキテクト思考メンタルモデル構築の重芁性 でも説明されおいるずおり、メンタルモデルの構築には「抜象ず具䜓の埀来」が効果的です。 RTKB は、 抂念の解説抜象ず、その適甚事䟋の解説具䜓が必ずドキュメントに含たれる ようにス ケルト ンを定矩しおいたす。 ## {WHAT/WHAT FOR/WHY/WHERE the CONCEPT IS FROM (the ORIGIN):䞻題ず関わる技術的抂念の解説} - 文章圢匏での蚘述を優先し、必芁に応じお項ぞの分割、箇条曞き・衚を甚いる ## {HOW/USAGE:技術的抂念の䜿い方/機序/運営・運甚/掻動/メカニズム/アプロヌチ} - 文章圢匏での蚘述を優先し、必芁に応じお箇条曞き・衚を甚いる たた、それらを異なる章に分離するこずで段萜内の抜象床の揺らぎを回避し、抂念理解から適甚ぞの思考フロヌず読曞䜓隓の摩擊を䜎枛したす。 問題空間の明確化 倚くの技術的抂念は、䜕らかの課題を解決する手段ずしお機胜したす。 RTKB では、技術的抂念が察象ずする 問題空間 に぀いおも説明するこずを定めおいたす。 たた、ある抂念の適甚事䟋ず䜵せお、その抂念を「適甚しない堎合」を察比的に解説するこずで、問題空間をより鮮明に浮かび䞊がらせるよう図りたす。 ## 党おの文曞においお NON-NEGOTIABLE な遵守事項 - 技術的抂念は、䜕らかの問題空間䞊の課題に察する解決空間で機胜する。技術文曞には、必ずこの問題空間䞊の課題の詳説ず、それを理解するための関連する技術的抂念たで含めお説明されなければならない ## {HOW/USAGE:技術的抂念の䜿い方/機序/運営・運甚/掻動/メカニズム/アプロヌチ} - 理解の促進のため、その技術的抂念{を䜿わない堎合/が存圚しなかった時代}における具䜓䟋を初めに提瀺する ### {HOW/USAGE WITHOUT the CONCEPT:技術的抂念 {を䜿わない/が存圚しなかった時代} のアプロヌチ} <!-- optional/if applicable:䞻題の技術的抂念が存圚しなければ解決䞍可胜な課題である堎合、本章は省略可胜 --> - コヌドによる実装䟋や、具䜓的な事䟋を瀺すこずで、䞻題の技術的抂念が存圚しない堎合にどのような問題があるかを詳説する これにより、その技術的抂念が「なぜ必芁ずされるのか」「い぀適甚すべきか」ずいった 実践的なコンテキストにおける理解 が深たりたす。 加えお、その抂念が察象ずする問題空間を把握するこずにより、その空間を察象ずする他の技術的抂念ずのアナロゞカルな関連付け、すなわち 「認知の地図」の広がりも期埅 されたす。 トレヌサビリティの確保 䞊述の通り、 AI ずのチャット履歎は䜿い捚おの「フロヌ情報」であり、ナレッゞベヌスに蓄積するストック情報ずは䞀般的には盞容れたせん。 しかし少し芋方を倉えるず、 AI ぞの質問履歎は理解に至るたでの軌跡 そのものであり、捚お去るには惜しい情報ずも思えおきたす。 そこで RTKB では、質問履歎をチャットに埋もれさせず Traceable に文曞化するための芏玄も定めおいたす。 ## 質問回答時の遵守事項 既存の技術文曞に関しお、ナヌザヌからの質問を受領した堎合は、以䞋の方針に埓う。 ### WHAT IS THIS:技術的抂念の定矩に関する質問 - 技術的抂念そのものの定矩を確認する質問の堎合は、`Glossary` 章に远蚘する ### FOLLOW UP QUESTIONS:方法や理由、目的、意図を問う質問 - 技術文曞に蚘茉された内容に関する、理解を深めるための follow up questions に察しおは、`Dialogue for Understanding` に質問の芁玄ず回答を远蚘する - 質問が、`Dialogue for Understanding` の回答に察する远加の質問の堎合は、新たな"Q"節は蚭けず、既存の回答に远蚘する RTKB の孊習フロヌ ここたで解説しおきた AGENTS.md により䜜成される技術ドキュメントを軞に、RTKB では以䞋のフロヌで孊習を行いたす。 孊習トピックの バックログ 管理 仕事やプラむベヌトで出䌚った「ちゃんず説明できないな」「詳しく理解したいな」ずいったトピックを、任意のツヌルで バックログ 管理しおおきたす マむナヌな技術や、耇数のバヌゞョンが存圚するラむブラリにおける特定バヌゞョンの API の䜿い方など、AI が誀りやすいトピックに぀いおは、RTKB の察象倖ずしお管理するこずを掚奚したす 問いかけ 孊習トピックに぀いお「分からないこずが分からない」状態であれば、孊ぶべき技術的抂念を察話的に定めたす 自身の理解の皋床を瀺し぀぀察話するこずで、ドキュメントが扱うスコヌプの最適化が期埅されたす ドキュメント䜜成䟝頌 孊習したい察象が明らかになったら、ドキュメントの䜜成を゚ヌゞェントに䟝頌したす 実装䟋で䜿甚する蚀語の指定や、 AGENTS.md 蚘茉ルヌルの範囲内における詳现床などの調敎は可胜です TDL 冒頭の Comprehension Check を確認し、孊習のゎヌルをむメヌゞしたうえで、読み始めたす 回答䟋は ▶ Answers を抌䞋するず展開衚瀺されたす 深堀り 読み進めおいくなかで、疑問点があれば゚ヌゞェントに質問したす ゚ヌゞェントは、ナヌザヌからの質問に合わせおドキュメントを適切に远蚘/修正しおくれたす Review 空き時間を䜿っお Comprehension Check による埩習を実斜したす ナレッゞベヌスを GitHub 䞊で管理しおいれば、アプリを䜿っお 移動䞭などの隙間時間で埩習が捗る のでお勧めです さいごにAI 時代における意思決定の重芁性 冒頭に蚘茉したずおり、゜フトりェア開発は意思決定の連続です。 これをもう少し解像床を䞊げお芋るず、日垞の掻動は、意思決定に先行する「方針怜蚎」ず、意思決定に基づく「遂行」から構成されるず蚀えるでしょう。 今日の AI は、詳现蚭蚈に基づくコヌディングのような具䜓的な「遂行」䜜業だけでなく、抜象床が高く耇雑な「方針怜蚎」タスクでさえも、その高床な掚論胜力により高い粟床でこなせるようになり぀぀ありたす。 意思決定の前埌が急激に「時短」されたこずにより、私たちが ある期間に䞋さなければならない意思決定の数は、数幎前ずは比べ物にならない皋増加 しおいたす。 そしお、この 「意思決定の時間密床」はこれからも高たり続けおいく ず考えられたす。 だからこそ、来る AI 時代においお、より迅速か぀的確な決断を䞋せるよう、私たちはこれからも様々な技術を孊び続け、「認知の地図」を拡匵しおいく必芁があるのではないでしょうか。 その䞀぀のアプロヌチずしお、本皿で玹介した RTKB が少しでも皆さんのご参考ずなれば幞いです。 * 本皿に掲茉された画像は AI により生成されたした 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @satorin レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは、グルヌプ経営゜リュヌション事業郚の 米久 保です。本蚘事は 電通総研 Advent Calendar 2025 15日目の蚘事です。 アヌキテクト思考ずは この蚘事においお、 アヌキテクト思考 ずは ITアヌキテクト が仕事をするうえで身に぀けおおくべき思考方法、ツヌルや フレヌムワヌク 、その利甚方法を総称するものずしたす。その有甚性はアヌキテクトの枠を超えお、他の職皮にも倧いに圹立぀ものです。 アヌキテクト思考ず呌べるものには、今回取り䞊げる「雲」「 匁蚌法 」の他にも、「 メンタルモデルの構築 」「システム思考」「掚論」「 トレヌドオフ 分析」「分割統治」などさたざたなものがありたす。 察立の解消は課題解決の鍵 アヌキテクトの仕事ずは、䞊䜍目的を達成するための党䜓構想を描き、実珟ぞの道筋を蚈画し、その実行を䞻導するこずです。その過皋では倧小さたざたな問題が発生し、それらを乗り越えおゎヌルぞ向かうために、日々課題解決が求められたす。 課題解決が䞀筋瞄ではいかないのは、盞互に察立する芁件や事象がしばしば存圚するためです。AずBを䞡立させるこずが困難な、「あちらを立おればこちらが立たず」ずいう状況です。英語でいうずTrade-off トレヌドオフ ですね。 このようなずき、双方のメリットずデメリットを挙げお比范評䟡したうえで、遞択ずいう意思決定を䞋すのが トレヌドオフ 分析です。アヌキテクトずしお、 トレヌドオフ 分析を適切に行う技術を身に぀けるこずの重芁性は蚀うたでもありたせん。が、 トレヌドオフ 分析に入る前に、䞀呌吞入れお クリティカル・シンキング で問いかけおみたしょう。 本圓にその察立は、二者択䞀で遞択しないずいけないのでしょうか 察立を乗り越える思考法 私たちは、察立しおいるず思われる二぀の䞻匵を目にしたずき、どちらかを遞ばなければならない、すなわち二埋背反の関係であるず考えがちです。思い蟌み、あるいは思考のバむアスを克服するためには、それに適した思考ツヌルを掻甚するのがよいでしょう。 この蚘事では「雲」ず「 匁蚌法 」をご玹介したす。 雲 「雲」は、曞籍『ザ・ゎヌル』で有名な ゚リダフ・ゎヌルドラット 博士の生み出した TOC 思考プロセスの道具の䞀぀です。「 クラりド 」「察立解消図」ず呌ばれるこずもありたす。雲では、察立関係を図に描くこずで、その解消の糞口を芋出したす。 具䜓䟋で考えたしょう。゜フトりェア 開発プロセス においお、レビュヌのリヌドタむムや 工数 、レビュヌアの負荷はしばしば問題ずなりたす。 開発者 「レビュヌがなかなか返っおこない」「指摘事項の察応に時間がかかる」「レビュヌをもっず簡玠化しおほしい」 レビュヌア 「品質担保のためにしっかりず厳栌なレビュヌをしなくおは」「指摘すべき点が倚くおどうしおも時間がかかる」 察立関係にある、「レビュヌを厳栌化したい」ずいう䞻匵Dず「レビュヌを簡玠にしたい」ずいう䞻匵D'を起点に雲を描くず、次の図のようになりたす。 Dからの矢印の先には、Dを必芁条件぀たり䞊䜍の目的ずする項目を描くB 同様にD'を必芁条件ずする項目を描くC BずCの䞡方を必芁条件ずする、共通の目暙を描くA 雲は、察立関係は解消できるはずずいうスタンスを取りたす。どうやっお解消するのでしょうか たずは、DずD'が暗黙の前提ずしおいる事柄や仮定を掗い出したす。 レビュヌを厳栌化D 厳栌なレビュヌを行うには時間がかかる レビュヌを簡玠化D' レビュヌを簡玠化すればリリヌスサむクルの短瞮が可胜 これらの前提、仮定を疑っおみたす。 厳栌なレビュヌには必ず時間がかかるのだろうか。時間を削枛する方法があるのでは レビュヌを簡玠化しお品質の悪い゜フトりェアをリリヌスしたら、問合せ察応や障害察応に時間を芁しお党䜓ずしおはリリヌスサむクルが長くなるのでは 以䞊を螏たえお、たずえば以䞋の斜策を打぀こずで、厳栌なレビュヌを行い、なおか぀リヌドタむムを短くしよう、ずいうのが雲による察立解消のアプロヌチです。 静的解析ツヌルや、AIレビュヌを導入する Pull Requestのサむズを小さくする 匁蚌法 匁蚌法 の歎史は叀く、 叀代ギリシャ の哲孊者 ゜クラテス が察話を通じお真理に近づく方法ずしお甚いた問答法は、 匁蚌法 の䞀皮ずされおいたす。珟代で䜿われる 匁蚌法 の基瀎論理を確立したのはドむツの哲孊者 ヘヌゲル 1770幎 1831幎 です。 ヘヌゲル の 匁蚌法 は以䞋のプロセスを取りたす。 呜題テヌれ正の提瀺 それず矛盟する、たたは吊定する呜題アンチテヌれ反の提瀺 それらを本質的に統合した呜題 ゞンテヌれ 合の考案 先ず同じ䟋を䜿っお考えおみたしょう。 テヌれ正 レビュヌを厳栌に行う アンチテヌれ反 レビュヌを簡玠化する これらを統合した、高次の解決策を考えたす。そのためには、それぞれのテヌれの本質は䜕かを考えるこずが必芁です。 テヌれ正 レビュヌを厳栌に行うのはなぜか どのような䟡倀芳に基づくのか 品質が重芁である ゜フトりェアの䞀貫性が倧事である 良い゜フトりェアを䜜る人、組織を育おおいきたい アンチテヌれ反 レビュヌを簡玠化するのはなぜか どのような䟡倀芳に基づくのか 顧客に玠早く䟡倀を届ける必芁がある フィヌドバックルヌプ を短瞮しお継続的に孊習し改善すべき それぞれが倧事にしおいる䟡倀や目指す方向性を螏たえお、 目的そのものから問い盎す のが 匁蚌法 的アプロヌチです。 ゞンテヌれ 合 レビュヌの目的を再定矩する孊習する組織ずしおのレビュヌ 具䜓的な斜策ずしおは、たずえば以䞋のようなア むデア が考えられるでしょう。 察面でレビュヌを行い、ペア蚭蚈 ペアプロ で蚭蚈の改善や リファクタリング を行う 察面レビュヌ実斜時のトラン スクリプト やgit差分デヌタを生成AIに芁玄させ、レビュヌ ガむドラむン を曎新する レビュヌ ガむドラむン を掻甚しお生成AIによる事前レビュヌを実斜する たずめ この蚘事では、アヌキテクト思考ずしお「雲」ず「 匁蚌法 」をご玹介したした。これらは、二埋背反のトラップから逃れ、察立を解消したり、察立を乗り越えたりする方法ずしお利甚できる思考ツヌルです。 日々の業務でうたく掻甚するこずができれば、匷力な歊噚ずなるこずでしょう。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @tyonekubo  Shodo で執筆されたした 
はじめに こんにちは、グルヌプ経営゜リュヌション事業郚の氞井です。 私は、2017幎から aiuolaあいうぉヌら ず Ci*Xさいくろす ずいう自瀟プロダクトの開発を担圓しおいたす。 aiuola および Ci*X のファヌストリリヌスは 2018幎 10月。それ以降は、゚ンハンスバヌゞョンアップを重ね、補品の機胜を匷化しおきたした。 ゚ンハンス開発の芁件定矩蚭蚈フェヌズでは、 Google の Design Docs を参考にした独自のドキュメントを甚いお蚭蚈をしおいたす。 この蚘事では、その具䜓的な内容ず運甚方法に぀いおご玹介したす。 ※ 本蚘事は 電通総研 Advent Calendar 2025 14日目 の蚘事です。 aiuola 、 Ci*X の開発スタむル たず、 aiuola 、 Ci*X チヌムの゚ンハンス開発の流れを簡単に説明したす。 aiuola 、 Ci*X は、半幎ごずに新しいバヌゞョンをリリヌスしおいたす。開発期間 6ヶ月は、倧たかに、 芁件定矩蚭蚈12ヶ月 実装22.5ヶ月 テスト11.5ヶ月 出荷準備0.51ヶ月 ずフェヌズが分かれおいたす。 党䜓ずしおはりォヌタフォヌル型のように芋えたすが、 アゞャむル の手法を取り入れ、2週間ごずのスプリントを回しながら開発を進めおいたす。 詳しくは、以前の蚘事もご芧ください → ゚ンタヌプラむズアプリケヌションプラットフォヌム「aiuola」におけるアゞャむル開発  ゚ンハンス開発で察応する案件には、お客様からの芁望や、瀟内で䌁画した新機胜、䞍具合の修正などが含たれたす。 それらの案件は、開発チヌムの バックログ に登録されたす。そしお優先床付けを行ったうえで、 6ヶ月 の開発期間に収たるよう察応案件を決定したす。 Design Docs ずは Design Docs は、盎蚳するず「蚭蚈曞」ですが、゜フトりェア開発界隈では、 Google の Design Docs を指すこずが倚いでしょう。詳现はリンク先のブログ投皿を参照しおいただきたいのですが、ここではその内容を簡単に説明したす。 Design Docs の目的は、゜フトりェアの目的どのような課題を解決するかを明確にし、その実珟方法ず トレヌドオフ に぀いお議論するこずで、チヌム内での認識の統䞀を図るこずです。たた、あずから、「なぜこのような意思決定をしたのだろう」ず疑問に思ったずき、過去の Design Docs を参照するこずでその経緯をたどるこずも可胜ずなりたす。 Design Docs には決たったフォヌマットはありたせんが、䞀般的に以䞋のような項目が含たれたす。 コンテキストこのドキュメントを読むにあたり必芁ずなる知識 目暙ずやらないこず゜フトりェアや機胜が䜕を目的ずしたものか、どんな課題を解決するか。逆に、察象倖ずする課題は䜕か 蚭蚈システム アヌキテクチャ やデヌタモデル、 API 蚭蚈、制玄など 代替案怜蚎した他の蚭蚈案ず、評䟡採甚しなかった理由、 トレヌドオフ など その他の関心ごず開発の進め方やテストの手法、セキュリティ察策、パフォヌマンス最適化、運甚・保守など 䜜成したドキュメントは、レビュヌプロセスを経お実装フェヌズに進みたすが、実装䞭に蚭蚈の芋盎しが必芁になった堎合は、ドキュメントを修正し、軌道修正をしながら開発を進めおいくこずができたす。 aiuola 、 Ci*X の Design Docs ここでは、私たちが䜿っおいる Design Docs のフォヌマットや䜜り方、レビュヌプロセスに぀いお、ご玹介したす。 ちなみに、チヌム内では「Design Docs」ではなく、「怜蚎資料」ず呌んでいたす。なぜ「怜蚎資料」にしたのかは忘れおしたいたした 笑 Design Docs のフォヌマット aiuola 、 Ci*X では、゚ンハンス開発を行う際、案件ごずに Design Docs を䜜成するこずずしおいたす。 Design Docs のフォヌマットは、詊行錯誀の結果、以䞋の項目を含めるこずになっおいたす。項目ずその曞き方を以䞋にたずめたした。 実物ずは少し異なりたすが、倧たかな構成は同じです 抂芁 芁望の背景・解決したい課題 この゚ンハンス案件によっお、どのような課題を解決するかを明らかにしたす。お客様のご芁望はいったん受け止めたすが、 aiuola 、 Ci*X はパッケヌゞ補品なので、補品ずしおどのような察応をするのがベストかを慎重に怜蚎する必芁がありたす。 芁件 この゚ンハンス案件の芁件を定矩したす。必須な芁件Must、可胜なら実珟したい芁件Wantをたずめるずずもに、実珟しないこずもあれば蚘茉したす。 仕様怜蚎 前提知識 このドキュメントを読む人が知っおおくべき甚語や、既存機胜の簡単な説明を蚘茉したす。 他瀟補品の調査 垂堎に既に存圚する補品に、今回の芁件を満たせる類䌌機胜が存圚する堎合、どのような方法で実珟しおいるのか、公開情報を調査したす。先行しおいる補品を参考に、よりよい仕様を実装するこずで、競争力を高めたす。 法埋・制床の調査 ゚ンタヌプラむズ アプリケヌションは、法埋や制床によっお仕様が自ずず決たっおしたう堎合がありたす。法埋や制床を正確に理解し、それを遵守した実装を行うこずが求められたす。 業務の怜蚎 ゚ンタヌプラむズ アプリケヌションの堎合、業務プロセス内にシステムが登堎するこずを想定した蚭蚈を行う必芁がありたす。 仕様案 アプリケヌションの仕様案をたずめたす。ここでは、いわゆる倖郚蚭蚈に盞圓する内容を蚘茉したす。耇数の仕様案がある堎合、それらを比范し、この゚ンハンスバヌゞョンで最適な案を遞定したす。 制玄 䟋えば、゚ンハンスバヌゞョンアップ埌に 埌方互換 がなくなる箇所など、ナヌザヌに圱響のある制玄事項があれば、たずめおおきたすなるべく、そういった制玄が生たれないような仕様案を暡玢したす。 技術調査 新しい芁玠技術を導入するなど、実装に入る前に調査・怜蚌が必芁ずなる堎合は、その内容ず結果を蚘茉したす。 蚭蚈 この章には、いわゆる内郚蚭蚈に盞圓する内容を蚘茉したす。 DB蚭蚈、 アヌキテクチャ 蚭蚈、画面蚭蚈、バッチ蚭蚈、 API 蚭蚈、非機胜芁件の蚭蚈など、必芁ずなる項目を掗い出し、蚘茉したす。 改修を行わないが、圓該案件の圱響を受けるため リグレッション テストを実斜しおおいた方がよい機胜も明蚘しおおきたす。 その他 倖郚サヌビスずの連携で必芁な調敎など 瀟倖のサヌビスず連携するような案件の堎合、先方ずの調敎が発生するこずもあるため、そういった情報はたずめおおきたす。 他チヌムずの連携で必芁な調敎など 䟋えば、むンフラ構成の倉曎が必芁な案件など、瀟内の他のチヌムにも䜜業を䟝頌しなければならない堎合、その内容をたずめおおきたす。 リリヌス時・リリヌス埌の泚意事項 本番環境ぞのリリヌス䜜業䞭、特別に実斜する必芁がある䜜業があれば、その内容を蚘茉しおおきたす。たた、リリヌス埌に利甚者偎で必ずやらなければならない䜜業がある堎合も、その内容を蚘茉しおおきたす。 仕様盞談やレビュヌの蚘録 ドメむン ゚キスパヌトやテッ クリヌド ず行う仕様の盞談ミヌティングや、レビュヌ時のやり取りを蚘録に残しおおきたす。この項があるこずによっお、どうしおこのような仕様になっおいるのか、あずから远いかけるこずができたす。 私たちは、 Confluence ずいうツヌルで Design Docs を管理しおおり、小芏暡な案件であれば1ペヌゞで曞ききっおしたうのですが、倧芏暡な案件の堎合、項目ごずにペヌゞを分割したり、階局化したりしお、読みやすいドキュメントになるよう工倫しおいたす。 たた、䞊蚘項目はすべお必須ずいうわけではなく、案件内容によっお必芁な箇所のみ蚘茉するこずにしおいたす。 Design Docs のレビュヌ Design Docs を䜜成したら、 ドメむン ゚キスパヌトやテッ クリヌド によるレビュヌを実斜したす。 案件の芏暡や内容によっおは、すべおを曞き終えおレビュヌを䟝頌するのではなく、少人数での仕様盞談䌚や途䞭段階でのレビュヌを実斜するこずもありたす。 仕様盞談䌚やレビュヌ時のやり取りは、意思決定の根拠ずしお重芁であるため、 Design Docs の 仕様盞談やレビュヌの蚘録 の項に蚘録しおおきたす。 実装䞭にも修正を加えおいく レビュヌプロセスを通過し、いよいよ実装、ずなりたすが、ただ Design Docs の圹目は終わりたせん。 実装䞭に、蚭蚈の芋盎しが行われたり、新たな圱響範囲が芋぀かったりするこずはよくありたす。 その堎合、 Design Docs を修正し、新たな方針のもず実装を進めおいくこずずしたす。 テストず Design Docs テスト担圓者は、開発者の䜜成した Design Docs を参照し、テスト仕様曞を䜜成したす。 Design Docs に、圱響機胜が網矅的に蚘茉されおいるこずで、テスト範囲が明確になりたす。 なお、実装䞭も Design Docs の修正は続いおいるため、実装完了埌、テスト実斜に入る前に、必ずテスト仕様曞にも Design Docs 最終版の内容を反映させるこずずしおいたす。 Design Docs ず仕様ドキュメント Design Docs は、゚ンハンス案件の開発時に利甚するもので、䜜り捚おのドキュメントです。 完成したアプリケヌションの仕様は、 別途バヌゞョン管理しおいる、仕様ドキュメント画面定矩曞、バッチ仕様曞、 API 仕様曞 などぞの反映を行いたす。 過去の Design Docs の管理 ここたで来おようやく Design Docs はその圹目を終えるこずずなりたす。 過去の Design Docs は、 圓該゚ンハンスバヌゞョンの Design Docs 眮き堎に栌玍されたす。 おわりに 今回は、私たち aiuola 、 Ci*X チヌムで利甚しおいる Design Docs に぀いおご玹介したした。 元の Google の考え方を参考にし぀぀、チヌムにフィットするようカスタマむズした結果、珟時点ではこのような圢になっおいたすが、チヌムの状況によっおこれからもどんどん改善されおよりよいものになっおいくず思いたす。 本蚘事が、皆様の蚭蚈ラむフの䞀助ずなれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 執筆 @nagai.satoshi レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
はじめに ゚ンタヌプラむズ 第䞀本郚の䜐藀です。 本蚘事は 電通 総研 Advent Calendar 2025 13日目の蚘事です。 さくらのクラりド がアプリケヌションの実 行基 盀ずなる「AppRun」等の正匏なサヌビスを2025幎12月9日から開始しおいたす。 この蚘事は、AppRunの䜿甚を通じお囜産 クラりド の珟圚地を把握しおみるのが本旚ずなりたす。 はじめに AppRun 抂芁 コンテナレゞストリのデモ 抂芁 むメヌゞの䜜成 レゞストリの䜜成 ナヌザヌの䜜成 むメ―ゞのpush AppRunのデモ 起動の蚭定 起動確認 デプロむ戊略 今回䜜成したリ゜ヌスの料金 感想 AppRun 抂芁 「AppRun」は、コンテナむメヌゞをもずにアプリケヌションを自動デプロむし、スケヌリングや運甚管理をシヌムレスに実行できるマネヌゞドサヌビスです。 匕甚元 https://www.sakura.ad.jp/corporate/information/newsreleases/2025/12/09/1968222395/ このAppRunのデモの前に さくらのクラりド 䞊にむメヌゞをpushしおおく必芁があるので、以䞋の手順を実斜しおいたす。 コンテナ レゞストリ のデモ 抂芁 「コンテナ レゞストリ 」はDockerなどのコンテナ゚ンゞンが扱うむメヌゞファむルを保管する レゞストリ 機胜を さくらのクラりド 䞊で提䟛するサヌビスです。 匕甚元 https://manual.sakura.ad.jp/cloud/appliance/container-registry/index.html むメヌゞの䜜成 デモで䜿甚するコンテナのむメヌゞを䜜成したす。 今回詊すサヌバヌはgoで以䞋のように蚘述したした。 package main import ( "fmt" "net/http" "log" ) func main() { http.HandleFunc( "/" , func (w http.ResponseWriter, r *http.Request){ log.Printf( "%s %sのリク゚ストがありたした" , r.Method, r.URL.Path) fmt.Fprintf(w, "こんにちはさくらのクラりド" ) }) http.HandleFunc( "/health" , func (w http.ResponseWriter, r *http.Request){ log.Printf( "%s からヘルスチェック" , r.RemoteAddr) w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "OK" ) }) log.Println( "Starting server on : 30080" ) err := http.ListenAndServe( ":30080" , nil ) if err != nil { log.Fatal(err) } } むメヌゞをビルドし、 server-demo ず名前を付けおいたす。 レゞストリ の䜜成 次にこのむメヌゞをpushする レゞストリ を䜜成したす。 手順 通りに䜜成したす。 以䞋のような画面で䜜成したした。 📝䜙談アむコンは自分で䜜成できるので マニュアル を参考に手曞きの実家の犬アむコンを自䜜したした。 ナヌザヌの䜜成 以䞋の画像のナヌザヌのタブで新芏に䜜成したした。 ナヌザヌ䜜成時に指定したナヌザヌ名ずパスワヌドでDockerのログむンを実斜したす。 むメ―ゞのpush 次にdockerコマンドで server-demo むメヌゞにタグを付䞎したす。 docker tag server-demo:latest <レゞストリ名>/server-demo:latest レゞストリ ぞのログむンを実斜したす。 コマンドは以䞋を実斜したす。 docker login [コンテナレゞストリ名] Username: [ナヌザ名] Password: [パスワヌド] タグ付けした server-demo むメヌゞをpushしたす。 docker push <レゞストリ名>/server-demo:latest このむメヌゞが GUI のコンテナ レゞストリ から確認できるのかなず思いたしたが、私は芋぀けられたせんでした。 AppRunのデモ 起動の蚭定 アプリケヌションの䜜成画面で共有型を遞択し、起動したす。 以䞋のようにアプリケヌションの蚭定をしたした。 コンテナの蚭定は以䞋のずおりです。 IPアドレス の指定等も項目でありたすが、家のネットワヌクは IPアドレス が固定できないのでスキップしたした。 ログの送信はfluentbit, opentelemetry-collectorを䜿甚するずありたしたが、暙準/゚ラヌ出力はそのたたログに蚘録されるので今回はこれを有効にしお確認するこずにしたした。 メトリクスの送信はPrometheus, opentelemetry-collectorが䜿甚できるのですが、怜蚌のための実装が手間だったので省きたした。 ログやメトリクスを収集するモニタリングスむヌトの詳现は https://manual.sakura.ad.jp/cloud/appliance/monitoring-suite/index.html を参照しおください。 この蚭定でアプリケヌションを䜜成し、起動を確認しおみたす。 起動確認 画像のように起動を確認するこずができたした。 ブラりザで公開URLにアクセスしたずころレスポンスも衚瀺されたした。 ちなみにログでは以䞋のようになっおいたす。 10秒間隔でヘルスチェックをしおいたすが、2025-12-15 00:27:11を最埌にこれが止たっおおり、 トラフィック がないので最初に蚭定したれロスケヌルが実行されおいるこずが確認できたす。 この状態で再床URLにアクセスするずレスポンスが返るたで䜓感で5~6秒かかりたした。 デプロむ戊略 アプリケヌションの構成を倉曎しおデプロむから、新たなむメヌゞをデプロむしたす。 新たなむメヌゞは以䞋の蚘述を倉えただけです。 fmt.Fprintf(w, "こんにちはさくらのクラりドv2" ) バヌゞョン情報を確認するずv2が増えたした。 この時点ですでに倉曎枈みですが、操䜜の項目から トラフィック 管理を抌䞋し、50%で分配するようにしたした。 2回に1回は以䞋のようになりたした。 今回䜜成したリ゜ヌスの料金 サヌビス 料金 補足 コンテナ レゞストリ 月額220円 ストレヌゞ5GiB/1 レゞストリ 超過分は1GiBごず22円 AppRun共有型/0.5vCPU × 1GiB メモリ 箄5円/1時間 - モニタリングスむヌトログ 月額110円 ナヌザ領域 ストレヌゞ1GiB/1ä»¶ 参照 https://cloud.sakura.ad.jp/products/container-registry/ https://www.sakura.ad.jp/corporate/information/newsreleases/2025/12/09/1968222395/ https://cloud.sakura.ad.jp/news/2025/11/11/3service_formalization/ 感想 ベヌタ版の時から結構良く芋られた感想ですが、蚭定項目が少なくお簡単でした。 ドキュメントが日本語話者が曞いた日本語なのも理解しやすさに貢献しおいるず思いたす。 蚭定項目が少ないメリットの䞀方で、それは柔軟性・拡匵性ずの トレヌドオフ なのでここは手攟しに玠晎らしいずは蚀えないですね。 IaC化も Terraform for さくらのクラりド(v2) で、できたす。 個人的にはれロスケヌルしおくれるのがいいなず感じおおり、個人レベルのサヌビス立ち䞊げ時に トラフィック がないのに ランニングコスト だけがかかる問題を解消できそうです。 今回の怜蚌で興味が出おきたので、䜓系的にサヌビスの抂芁を぀かめるように さくらのクラりド怜定 を受けおみようかなず思いたす。 受隓費甚が䞀般 11,000円皎蟌で「 さくらのクラりド 」クヌポン 50,000円分䞀般・孊生共通がもらえるのがいいですね。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.yu レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは、 電通 総研のグルヌプ経営゜リュヌション事業郚で゚ンゞニアをしおいる倧浊です。 本蚘事は 電通総研 Advent Calendar 2025 12日目の蚘事です。 昚日の蚘事は、䞊野さんによる TanStack AI × Amazon Bedrockで䜜るAIチャットボット でした。 フロント゚ンドを起点に AI を組み立おる アヌキテクチャ の考え方が興味深く面癜かったです。 今回は、 モノリス で䜜られたアプリから、1぀の機胜をマむクロサヌビスずしお切り出す刀断に぀いおお話したす。 1 はじめに 1.1 泚意点 2 そもそもマむクロサヌビスを切り出すべきか 2.1 モノリスで埗られるPros 2.1.1 安定性 2.1.2 デプロむ容易性 2.1.3 実装容易性 2.2 モノリスのCons 2.2.1 認知負荷の増加 2.2.2 リヌドタむムの増加、リリヌスサむクルの長期化 2.2.3 柔軟なスケヌルが実斜できない 2.2.4 ラむブラリの衝突 3 切り出すず刀断したら䜕を切り出すか 3.1 切り出す䟡倀が高い機胜 3.1.1 リリヌスサむクルや蚭定倉曎の呚期が補品本䜓ずは違う 3.1.2 機胜固有の䟝存を持぀ 3.1.3 機胜単䜍でスケヌルアりトなどの構成を取りたい 3.1.4 特定の環境でのみ利甚される機胜 3.2 切り出しやすい機胜 4 どのように切り出すか 4.1 モノリスで実珟した堎合 4.1.1 通知サヌビスのむンタヌフェヌス 4.1.2 通知サヌビスの実行クラス 4.1.3 build.gradleの䟝存 4.2 マむクロサヌビスによる切り出しを行った堎合 4.2.1 (補足) マむクロサヌビスの実装蚀語ずしおGoを遞んだ理由 4.2.1.1 Goは単䞀バむナリずしお配垃できる 4.2.1.2 高䞊行な I/O 凊理を玠盎に曞ける 4.2.1.3 起動が速く、リ゜ヌス特性が読みやすい 4.2.2 モノリス偎Spring 4.2.3 切り出したマむクロサヌビス偎 4.3 この䟋に぀いおの補足 本番運甚を考えた堎合 5 たずめ 1 はじめに SaaS アプリケヌションの構成ずしお、マむクロサヌビス化を進めおいるずいうサヌビスに぀いお目にする機䌚が増えたした。 あわせお「最初からマむクロサヌビスで䜜るのではなく、 モノリス で䜜り始めお必芁になったらマむクロサヌビス化したしょう」ずいう意芋を聞くこずも倚いかず思いたす。 Martin Fowlerも以䞋のように述べおいたす。 「成功したマむクロサヌビスのほずんどは、最初からマむクロサヌビスだったわけではない。 たずモノリスずしお䜜られ、それが肥倧化しお“割らざるを埗なくなった”結果ずしお生たれおいる。」 「逆に、最初からマむクロサヌビスずしお䜜られたシステムで、うたくいった䟋はほずんど聞かない。 私の知る限り、そうした倚くは深刻な問題を抱えるこずになっおいる。」 ※原文は以䞋の2点(著者意蚳) 1.Almost all the successful microservice stories have started with a monolith that got too big and was broken up 2.Almost all the cases where I've heard of a system that was built as a microservice system from scratch, it has ended up in serious trouble. ref) https://martinfowler.com/bliki/MonolithFirst.html マむクロサヌビスに分割断面を芋出し「分割する」ずいう話は曞籍やネットで芋぀けるこずができたす。  ドメむン 境界で切りたしょう。チヌム構成で切りたしょう。など 本蚘事では、倧きな分割断面を芋぀けるのではなく、 モノリス をマむクロサヌビス化するための第䞀歩ずしお 「機胜を切り出す」ずいうこずにフォヌカスした話をしたす。 ビゞネスの拡倧に合わせお成長しおきた モノリス アプリを前提に以䞋の3点を扱いたす。 そもそもマむクロサヌビスを切り出すべきか 切り出すず刀断したら䜕を切り出すか どのように切り出すか 1.1 泚意点 以降は筆者が今たでに モノリス から機胜を切り出す or 切り出さない刀断をしおきた䞭で考えおきたこずを元に蚘茉しおいたす。 正解を提瀺するよりは、刀断のための問いや芳点を共有するこずを目的ずしおいたす。 もし、誰かにずっお議論のきっかけになればずおも嬉しいです。 2 そもそもマむクロサヌビスを切り出すべきか 「プロゞェクト開始早々にマむクロサヌビスにするな。」ずいう意芋が広く玍埗されおいる背景ずしお、 モノリス ならではの Pros/Cons がありたす。 マむクロサヌビス化は、「珟状の モノリス から埗られるProsを倱っおでも、Consを解消する䟡倀がある」ず合意出来おいる堎合に実斜を怜蚎したす。 2.1 モノリス で埗られるPros 2.1.1 安定性 ゚ンタヌプラむズ アプリでは基本的に、ACID特性を持぀ トランザクション が重芁です。 モノリス 構成倚くの堎合単䞀のDBで構成である限り、 トランザクション の敎合性をシンプルに保おたす。 もし機胜を 疎結合 にするために耇数のDBにたたがった トランザクション を構成する堎合には、分散 トランザクション や結果敎合性など、より耇雑な刀断が必芁です。 2.1.2 デプロむ容易性 モノリス は通垞デプロむ単䜍が1぀であり、実行や停止、スケヌルをたずめお実斜できたす。ログも集めやすいです。 特にオンプレミス環境での動䜜が求められる堎合には、デプロむ単䜍が1぀であるこずで、運甚における各皮手順を容易にできるなどのメリットもありたす。 2.1.3 実装容易性 モノリス は基本的に、 コンパむル 時にアプリ党䜓が含たれたす。 Java などの静的型付け蚀語では、型やむンタヌフェヌスの䞍䞀臎を実行前に コンパむル ゚ラヌずしお怜知できたす。 2.2 モノリス のCons 2.2.1 認知負荷の増加 補品のコヌドベヌスが倧きくなるに぀れお、1぀の機胜倉曎の圱響範囲が広がりやすくなりたす。 これは、コヌドベヌスの認知負荷の増加に繋がりたす。 2.2.2 リヌドタむムの増加、リリヌスサむクルの長期化 倉曎時の圱響範囲の広がりは、修正時のビルド時間、怜蚌事項の増加、倉曎時の 回垰テスト 範囲の増加に繋がりたす。 この結果、リヌドタむムが䌞び、倉曎が慎重に実斜されるこずでリリヌスサむクルが長くなる、ずいう問題に繋がりたす。 これは、新機胜の知芋を持ったチヌムがPoCを実斜する堎合の足かせになりたす。 2.2.3 柔軟なスケヌルが実斜できない 単䞀ファむルずしおデプロむする以䞊、特定の機胜だけスケヌルさせる。ずいったこずはできたせん。 䟋えば、特定の時期にだけ重い凊理がある堎合でも、アプリケヌション党䜓をたずめおスケヌルアップさせる必芁がありたす。 たた、単䞀デプロむ単䜍で倧きくなるずメモリフットプリントが増加し、スケヌル時に重芁な起動時間の増加にも぀ながりたす。 2.2.4 ラむブラリの衝突 倖郚ラむブラリなどの䟝存远加により、ラむブラリの衝突などがおこるようになる可胜性が高たりたす。 3 切り出すず刀断したら䜕を切り出すか では、補品が育っおきお モノリス の蟛みが顕圚化しおきた堎合に、どの機胜を切り出すかを考えおみたす。 切り出しは倚くの堎合、少なくずも以䞋の2軞を怜蚎する必芁がありたす。 切り出す䟡倀があるか 切り出しやすいか 以䞋に、切り出す䟡倀が高いず考える機胜の性質を蚘茉したす。 切り出す䟡倀が、切り出しやすさやマむクロサヌビス化の蟛みを匕き受けおでも実珟する䟡倀があるかを怜蚎し、切り出しポむントを決めたしょう。 3.1 切り出す䟡倀が高い機胜 3.1.1 リリヌスサむクルや蚭定倉曎の呚期が補品本䜓ずは違う 競争優䜍性を埗るために迅速な フィヌドバックルヌプ を回すこずが求められる機胜は、切り出しお本䜓ず独立しおリリヌスできるずビゞネス䞊の効果が高いです。 「○○機胜チヌム」など特定のチヌムが担圓しおいる機胜の堎合には、他チヌムずのコミュニケヌションパスを限定するこずで生産性を高めるこずに぀ながるこずもありたす。 3.1.2 機胜固有の䟝存を持぀ サヌドパヌティヌ SDK が必芁である機胜や、倖郚サヌビスぞの䟝存が匷い機胜を切り出すず、補品本䜓の䟝存関係を単 玔化 できたす。 䟝存ラむブラリが増えるず、ラむブラリ衝突のような問題に突き圓たるこずがあり、䟝存が増えるごずにリスクは高たりたす。 たた、もしラむブラリの 脆匱性 などが出た堎合にも圱響範囲の局所化や修正の反映が迅速になりたす。 ラむブラリ䟝存を増やさないようにするための手段ずしおの切り出しも䟡倀があるず考えおいたす。 3.1.3 機胜単䜍でスケヌルアりトなどの構成を取りたい BI凊理など、デヌタの増加に䌎いリ゜ヌス䜿甚量や時間の増加が倧きい機胜は、切り出すず個別のワヌクロヌドを芋たスケヌル刀断ができたす。 たた、月末だけ高負荷がかかるなど ピヌキヌ な振る舞いを持぀機胜は、メむンのアプリはそのたたでスケヌルアップ/スケヌルアりトが実珟できたす。 3.1.4 特定の環境でのみ利甚される機胜 アドオンやオプション機胜など、利甚有無が顧客や環境によっお異なる機胜を切り出せるず、補品本䜓品質の維持に぀ながりたす。 本䜓から分離するこずで、認知負荷やテスト範囲を抑えられたす。 もし モノリス の䞭で実珟する堎合、アドオンやオプションの倉曎が補品本䜓の再テストやバヌゞョンアップの足かせずなるこずがありたす。 3.2 切り出しやすい機胜 切り出しやすさに぀いおも蚘茉したす。 ただ、切り出しやすさよりも切り出す䟡倀の方が重芁です。 切り出す䟡倀が高い機胜であっおも、以䞋のような性質がある堎合には切り出しコストに芋合わないこずが倚く、切り出しを行わない根拠になるず考えたす。 デヌタの所有暩が分離できない 厳密な同期 トランザクション が必須 境界仕様が頻繁に倉わる 4 どのように切り出すか ここでは、具䜓䟋ずしお Spring Framework で䜜成されおいる経費申請アプリケヌションの通知機胜を切り出したす。 Slack, Teams, LINE, メヌルず、耇数の通知先をも぀ケヌスを想定しおいたす。 最初に留意点を蚘茉したす。 以䞋の通知は、マむクロサヌビス分割の䞭でも比范的易しい題材ずなりたす。 = 状態をほが持たず、結果敎合性を蚱容しやすく、倱敗しおも業務停止になりにくい だからこそ、 モノリス からの最初の切り出しを詊すうえで有効ず考えたす。 たた、本番運甚をするうえで考慮が必芁なポむントに぀いおは、「4.3 この䟋に぀いおの補足 本番運甚を考えた堎合」ずしお埌述しおいたす。 4.1 モノリス で実珟した堎合 たずは、Spring Bootで䜜られた モノリス アプリです。 マむクロサヌビスずしお切り出す前の状態ずしお提瀺しおいたす。 ※今埌の説明に重芁な郚分のみ蚘茉しおいたす。 ※通垞のSpringアプリの範囲なので党おは説明しおいたせん。 もし動くコヌドを芋たい堎合は、以䞋のコヌドず共に生成AIに聞くこずで生成しおくれるず思いたす。 4.1.1 通知サヌビスのむンタヌフェヌス Java においおは以䞋のようなむンタヌフェヌスがありたす。 public enum NotificationChannel { SLACK, TEAMS, LINE, EMAIL } public record NotificationRequest( NotificationChannel channel, String to, // SlackのチャンネルID / メヌルアドレス / LINEのuserId など String subject, // 衚題 String message // 本文 ) {} public interface NotificationService { void send(NotificationRequest request); } 4.1.2 通知サヌビスの実行クラス NotificationServiceを実装したクラスNotificationServiceImplは以䞋です。 ※倧芏暡 ゚ンタヌプラむズ アプリケヌションであればStrategyパタヌンを甚いお、各通知先ごずにクラスを䜜る構成にするこずが倚いず考えたすが、ここでは簡単のため、党おの実凊理をNotificationServiceImpl内に蚘茉しおいたす。 // package jp.co.example.notification.infrastructure; @Service public class NotificationServiceImpl implements NotificationService { @Override public void send(NotificationRequest request) { switch (request.channel()) { case SLACK -> sendSlack(request); case TEAMS -> sendTeams(request); case LINE -> sendLine(request); case EMAIL -> sendEmail(request); default -> throw new IllegalArgumentException( "Unsupported channel: " + request.channel()); } } private void sendSlack(NotificationRequest request) { // Slack甚の通知凊理 } private void sendTeams(NotificationRequest request) { // Teams甚の通知凊理 } private void sendLine(NotificationRequest request) { // Line甚の通知凊理 } private void sendEmail(NotificationRequest request) { // Eメヌル甚の通知凊理 } } 4.1.3 build.gradleの䟝存 各皮通知凊理に SDK を利甚する堎合、build.gradleやpom. xml にSlackやLineなどの SDK ぞの䟝存が远加されたす。 この通知のためにしか䜿わない倚くの SDK が远加され、Jar Hellの危険が増したす。 4.2 マむクロサヌビスによる切り出しを行った堎合 ここでは、実際の通知凊理をGoで曞かれたマむクロサヌビスに切り出しおみたす。 4.2.1 (補足) マむクロサヌビスの実装蚀語ずしおGoを遞んだ理由 マむクロサヌビス偎の実装蚀語は、必ずしも Go である必芁はありたせん。 Java 、Kotlin、Node.js、 Python など、芁件を満たす遞択肢は耇数ありたす。 チヌムの技術スタックを統䞀したい堎合や、重厚な ドメむン ロゞックを持぀機胜を切り出す堎合には、 Java を遞ぶこずも十分に劥圓ず考えたす。 本蚘事の䟋でGoを遞んでいる理由は、 「通知機胜を切り出したマむクロサヌビス」ずいう文脈においお、運甚・構成のコストが䜎い ず刀断しおいるためです。 具䜓䟋をいく぀か挙げたす。 4.2.1.1 Goは単䞀バむナリずしお配垃できる Goでビルドしたアプリケヌションは、単䞀の実行バむナリずしお配垃できたす。 JVM やランタむム、䟝存ラむブラリを別途考慮する必芁がなく、以䞋のような運甚䞊のメリットがありたす。 デプロむ、プロセス垞駐のための運甚手順が単玔 実行環境の差異によるトラブルが起きにくい 4.2.1.2 高䞊行な I/O 凊理を玠盎に曞ける 通知凊理は、倚くの堎合CPUバりンドではなく I/O バりンドです。 Webhookや倖郚 API 呌び出しを倚数䞊列に凊理するケヌスでは、goroutineによる軜量スレッドが実装ず保守の䞡面で扱いやすいず感じおいたす。 たた䞻芳ですが、async/awaitや.then()などを駆䜿するよりも個人的にgoroutineの方が読みやすいです。 4.2.1.3 起動が速く、リ゜ヌス特性が読みやすい Goアプリケヌションは起動が速く、メモリ䜿甚量も比范的予枬しやすいです。 これは、以䞋のような堎面で効いおきたす。 オヌトスケヌル時の立ち䞊がり 障害埩旧時の再起動 4.2.2 モノリス 偎Spring たず、 Java 偎は通知を呌び出すだけにしたす。 = 通知凊理を切り出したマむクロサヌビスに委譲する。 @Service public class NotificationServiceImpl implements NotificationService { private final RestTemplate restTemplate; private final String baseUrl = "http://localhost:8081" ; // goプロセスのURL, 本来は蚭定から読み蟌む @Override public void send(NotificationRequest request) { try { String url = baseUrl + "/api/v1/notify" ; restTemplate.postForLocation(url, request); log.info( "Notification delegated: channel={}, to={}" , request.channel(), request.to()); } catch (RestClientException e) { log.error( "Notification delegation failed: channel={}, to={}" , request.channel(), request.to(), e); // 恐らくここは蚭蚈刀断が必芁、ログだけ出しお握り朰す業務゚ラヌにする throw new RuntimeException( "Failed to delegate notification" , e); } } } 通知を䟝頌するためのHTTPリク゚ストを投げるだけになっおいたす。 実際に通知をする凊理を委譲したこずで、通知先毎の各皮 SDK はアプリ本䜓偎では䞍芁になりたした。 実際に送信されるリク゚ストは以䞋のような構造になる想定です 䟋 Slackぞの承認䟝頌Post { " channel ": " SLACK ", " to ": " U0456ABCD ", " subject ": " 経費申請の承認䟝頌 ", " message ": " 【承認䟝頌】 \n 申請者: 山田倪郎 \n 申請番号: EXP-2025-00123 \n 金額: 12,480円 \n 申請日: 2025/02/10 \n\n 以䞋のリンクから内容を確認し、承認たたは差戻しをお願いしたす。 \n https://expense.example.com/approval/EXP-2025-00123 " } 4.2.3 切り出したマむクロサヌビス偎 Go偎では、通知リク゚ストから適切な通知先に通知を送りたす。 package main import ( "encoding/json" "log" "net/http" ) // 通知のリク゚スト構造 type NotificationRequest struct { Channel string `json:"channel"` To string `json:"to"` Subject string `json:"subject"` Message string `json:"message"` } func main() { http.HandleFunc( "/api/v1/notify" , NotifyHandler) log.Println( "Notification Service running on :8081" ) if err := http.ListenAndServe( ":8081" , nil ); err != nil { log.Fatal(err) } } func NotifyHandler(w http.ResponseWriter, r *http.Request) { var req NotificationRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { log.Println( "Invalid request:" , err) http.Error(w, "invalid request" , http.StatusBadRequest) return } // 即レスポンスを返す(Spring偎を埅たせない) w.WriteHeader(http.StatusAccepted) // 通知を非同期で凊理goroutine利甚 go func (req NotificationRequest) { switch req.Channel { case "SLACK" : sendSlack(req) case "TEAMS" : sendTeams(req) case "LINE" : sendLine(req) case "EMAIL" : sendEmail(req) default : log.Printf( "[goroutine] unsupported channel: %s \n " , req.Channel) return } log.Printf( "[goroutine] completed notification: channel=%s to=%s \n " , req.Channel, req.To) }(req) } func sendSlack(req NotificationRequest) { // Slack SDK or Webhook を呌ぶ凊理 log.Printf( "[Slack] sending to %s \n message: \n %s \n " , req.To, req.Message) } func sendTeams(req NotificationRequest) { // Teams SDK or Webhook を呌ぶ凊理 log.Printf( "[Teams] sending to %s \n message: \n %s \n " , req.To, req.Message) } func sendLine(req NotificationRequest) { // Line SDK or Webhook を呌ぶ凊理 log.Printf( "[LINE] sending to %s \n message: \n %s \n " , req.To, req.Message) } func sendEmail(req NotificationRequest) { // Eメヌルを送信する凊理 log.Printf( "[Email] sending to %s \n subject=%s \n message: \n %s \n " , req.To, req.Subject, req.Message) } 4.3 この䟋に぀いおの補足 本番運甚を考えた堎合 前述のGo実装は説明甚の最小構成です。 もしこのたた本番に出しおしたうず、以䞋のような問題が起きたす。 goroutine実行䞭にプロセスが萜ちた堎合、 モノリス 偎では成功したように芋えるが実際には通知されない。アプリ偎のみ正垞終了など 二重送信が発生しおも止められない。通知凊理完了埌にアプリ偎の凊理が異垞終了、マむクロサヌビス偎のみ正垞終了など 障害時に「どの申請の通知が倱敗したか」远えない。 䞊蚘に察応しようずする堎合は、以䞋のような察応が怜蚎察象になりたす。 盞関IDの远加 申請番号など、 モノリス 偎ずの䞀連の凊理を玐づける情報を加える。 リトラむ + バックオフ + デッドレタヌキュヌDLQの远加 通知先サヌビスが䞀時的に萜ちたずきのために再凊理を可胜にする仕組みを加える。 マむクロサヌビス偎のプロセスが萜ちおも適切に動䜜するように、マむクロサヌビス偎でDBを持぀など。 べき等キヌの远加 申請曞番号 + むベント皮別 + 通知先 などを芚えおおき、通知枈みの堎合は通知しない。 メトリクスずアラヌトの蚭定 通知の成功率や遅延、DLQ件数 などを監芖察象にする。 このように、割ず簡単な䟋でも本番で運甚する堎合には考慮すべきポむントが数倚くありたす。 この蟺りは、 モノリス のConsずマむクロサヌビスのProsだけを芋おいる堎合に芋萜ずすこずがありたす。 できる限り、切り出した堎合の倧倉さに぀いおも切り出しの怜蚎段階で考慮したいですね。 5 たずめ 今回は、 モノリス で䜜られたアプリから、1぀の機胜をマむクロサヌビスずしお切り出す刀断に぀いお曞いおきたした。 そもそもマむクロサヌビスを切り出すべきか → マむクロサヌビス化する堎合は、 モノリス のPros / Consを意識する。 → 特に、 モノリス のProsを考える。 切り出すず刀断したら䜕を切り出すか → 切り出すこずで埗られる䟡倀が高い機胜を切り出す。 → 䟡倀が高い機胜であっおも、切り出しやすさを含め トレヌドオフ を芋る。 どのように切り出すか → 第䞀歩は、状態をほが持たず、結果敎合性を蚱容しやすく、倱敗しおも業務停止になりにくい機胜を察象にする。 → 本番運甚においお、マむクロサヌビス化で問題ずなる特別な考慮ポむントに぀いお十分に怜蚎する。 最埌に、ここたではおおむねアヌキテクトの芳点でのみ切り出す刀断を曞いおきおいたす。 実際のプロダクト開発においおは、倱うProsが運甚に盎撃したす。 そのため、切り出し刀断はアヌキテクトだけでなく、保守/運甚・SRE・QA・プロダクトチヌムなどを巻き蟌んで合意するこずになるず思いたす。 今埌も、補品の成功のために出来るこずを考え呚囲ず議論しながら、補品開発を掚進しおいきたいず考えおいたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @oura.osamu レビュヌ @nagamatsu.yuji  Shodo で執筆されたした 
こんにちは。 電通 総研の金融IT本郚兌XI本郚の䞊野です。 本蚘事は 電通総研 Advent Calendar 2025 11日目の蚘事です。 最近䞀番嬉しかったこずず蚀えば、 AWS のコン゜ヌル怜玢で「ECR」ず入力するず䞀発ず入力するずコンテナ レゞストリ ぞ飛べるようになったこずです。 「ECSからの遷移」や「container registry」ず怜玢しおいたのは私だけではないはずです。 さお、本日は最近登堎したTanStack゚コシステムの䞀぀、 TanStack AI を利甚しおチャットボットを䜜っおみたした。様々な゚コシステムで知られるTanStackですが、AIアプリケヌション開発の分野に参入しおいたした。 本蚘事では、TanStack AI の特城や Vercel AI SDK ずの違いを解説し、 Amazon Bedrock ず組み合わせおファむル添付察応のチャットボットを構築する方法を玹介したす。 TanStack AIずは 䞻な特城 TanStack AI が生たれた背景 TanStack AI vs Vercel AI SDK TanStack AI を遞ぶべきケヌス Vercel AI SDK を遞ぶべきケヌス TanStack AI の実装䟋 クラむアント実装䟋 サヌバヌ実装䟋 Vercel AI SDKの利甚䟋比范甚 クラむアント偎の実装䟋 サヌバヌ偎の実装䟋 Amazon Bedrock ずは Amazon Bedrock の特城 Amazon Bedrock を䜿うメリット 他のクラりド AI サヌビスずの比范 利甚可胜なモデル 䞻な機胜比范 遞定の指針 TanStack AI × Amazon Bedrockずの接続 サヌバヌ偎の実装䟋 Amazon Bedrock アダプタヌクラス Express サヌバヌ クラむアント偎の実装䟋 カスタム Connection Adapter useChat フックの䜿甚 実装にあたっおのポむント1StreamChunk の圢匏 実装にあたっおのポむント2Extended Thinking思考プロセスのサポヌト ファむル添付のサポヌト デモ たずめ TanStack AIずは TanStack AI は、耇数の AI プロバむダヌに察応した統䞀むンタヌフェヌスを提䟛する オヌプン゜ヌス SDK です。 TanStack AI Alpha: Your AI, Your Way においお「AI ツヌルのスむスを目指す」ず述べおおり、「特定のベンダヌやプラットフォヌムに䟝存しない䞭立的な蚭蚈を意識しお䜜られた」ずいう意味だず理解しおいたす。 TanStack AI takes a different approach. We're building the Switzerland of AI tooling. An honest, open source set of libraries (across multiple languages) that works with your existing stack instead of replacing it. 䞻な特城 ベンダヌロックむンなし OpenAI、Anthropic、 Google Gemini、Ollama など耇数のプロバむダヌに察応 完党な型安党性 TypeScript で゚ンドツヌ゚ンドの型安党を実珟 フレヌムワヌク 非䟝存React、Solid、Vanilla JS など任意の環境で利甚可胜 マルチモヌダル察応テキスト、画像、音声、動画、ドキュメントをサポヌト MIT ラむセンス 完党な オヌプン゜ヌス TanStack AI が生たれた背景 TanStack の創蚭者 Tanner Linsley 氏は、既存の AI SDK Vercel AI SDK  に察する懞念から TanStack AI を開発したした。 TanStack AI は、これらの課題を解決する「䞭立的な」 SDK ずしお蚭蚈されおいたす。Cloudflare や Netlify がスポンサヌずしお参加しおいるのも、オヌプンで移怍可胜なツヌルが圌らのプラットフォヌムにも恩恵をもたらすからだず考えおいたす。 TanStack AI vs Vercel AI SDK 項目 TanStack AI Vercel AI SDK 哲孊 䞭立・ オヌプン゜ヌス Next.js/Vercel ゚コシステム統合 プロバむダヌ数 4OpenAI, Anthropic, Gemini, Ollama 倚数 ストリヌミング制埡 ステヌト管理しお明瀺的に管理 HTTP ストリヌム生成たでを匷くサポヌト 成熟床 アルファ版2025幎埌半〜 安定版 デプロむ先 どこでも AWS , Cloudflare, Netlify 等 どこでも、ただしVercel 最適化 珟時点では圧倒的にVercel AI SDK が高機胜ですが、Vercel提䟛の SDK はどうしおもプラットフォヌム䟝存郚分が出おきたす。 暙準 OSS ずしお利甚可胜ではありたすが、Next.jsず密接に統合されおおり、Vercelデプロむ時に最適化されおいたす。䟋えばVercel Functionsの タむムアりト 指定などもセットで利甚可胜になっおいる等、Vercelデプロむしない堎合は䞍芁な機胜がいく぀かありたす。 TanStack AI を遞ぶべきケヌス Vercel 以倖の環境 AWS 、Cloudflare 等にデプロむする 将来的にプロバむダヌを切り替える可胜性がある TanStack ゚コシステムを䜿甚しおいる Vercel AI SDK を遞ぶべきケヌス Next.js + Vercel で開発しおいる 今すぐ本番環境で䜿いたいTanStack AI はただアルファ版 倚数のプロバむダヌに察応したい 豊富なドキュメントず事䟋が必芁 TanStack AI の実装䟋 クラむアント実装䟋 import { useChat } from '@tanstack/ai-react' import { fetchServerSentEvents } from '@tanstack/ai-react/connection' function Chat () { const { messages , sendMessage , isLoading } = useChat( { connection : fetchServerSentEvents( '/api/chat' ), } ) const handleSubmit = ( e : React.FormEvent ) => { e. preventDefault () const input = e. currentTarget . querySelector ( 'input' ) if (input?.value) { sendMessage(input.value) input.value = '' } } return ( < div > < div className = "messages" > { messages. map (( msg ) => ( < div key = { msg. id } className = { `message ${ msg.role } ` } > { msg.content } </ div > )) } </ div > < form onSubmit = { handleSubmit } > < input type = "text" placeholder = "メッセヌゞを入力..." /> < button type = "submit" disabled = { isLoading } > 送信 </ button > </ form > </ div > ) } サヌバヌ実装䟋 import { chat, toStreamResponse } from '@tanstack/ai' import { openai } from '@tanstack/ai-openai' export async function POST ( request : Request ) { const { messages } = await request.json() const response = await chat( { provider : openai( { apiKey : process .env.OPENAI_API_KEY } ), model : 'gpt-4o' , messages , } ) return toStreamResponse(response) } Vercel AI SDK の利甚䟋比范甚 TanStack AIずの差分 submit時の sendMessage(input.value) 盞圓の凊理は、 useChat フックがよしなにやっおくれる。 クラむアント偎の実装䟋 import { useChat } from 'ai/react' export function Chat () { const { messages , input , handleInputChange , handleSubmit , isLoading , } = useChat( { api : '/api/chat' , } ) return ( < div > < div className = "messages" > { messages. map (( msg ) => ( < div key = { msg. id } className = { `message ${ msg.role } ` } > { msg.content } </ div > )) } </ div > < form onSubmit = { handleSubmit } > < input type = "text" placeholder = "メッセヌゞを入力..." value = { input } onChange = { handleInputChange } /> < button type = "submit" disabled = { isLoading } > 送信 </ button > </ form > </ div > ) } サヌバヌ偎の実装䟋 import { streamText } from 'ai' import { openai } from '@ai-sdk/openai' export async function POST(req: Request) { const { messages } = await req.json() const result = streamText({ model: openai('gpt-4o'), messages, }) // ストリヌミングレスポンスをそのたた返す return result.toDataStreamResponse() Amazon Bedrock ずは Amazon Bedrockは、 AWS が提䟛するフルマネヌゞド AI サヌビスです。Anthropic Claude、Meta Llama、 Amazon Titanなど、耇数の基盀モデルを統䞀された API で利甚できたす。 Amazon Bedrock の特城 マルチモデル  耇数ベンダヌのモデルを同䞀 API で利甚 IAM 統合  AWS の認蚌・認可基盀を掻甚 VPC 察応  PrivateLink でセキュアな接続 リヌゞョン  東京ap-northeast-1で利甚可胜 埓量課金  AWS 請求に統合、予枬可胜なコスト管理 Amazon Bedrock を䜿うメリット AWS の IAM による認蚌・認可を利甚したい VPC PrivateLink でセキュアな接続をしたい AWS の請求に統合しおコスト管理をしたい CloudTrail で アクセスログ を取埗したい 他の クラりド AI サヌビスずの比范 マルチモデル AI サヌビスは各 クラりド ベンダヌが提䟛しおいたす。 AWS の Bedrock、 Google Cloud の Vertex AI、 Microsoft の Azure AI Foundry旧 Azure AI Studioを比范しおみたす。 ※名称や提䟛モデル・機胜は逐次倉化するため、公匏の情報を参照しおください。 利甚可胜なモデル プロバむダヌ Amazon Bedrock Vertex AI Azure AI Foundry Anthropic Claude ✅ Claude 4, 3.5, 3 ç³» ✅ Claude 3.5, 3 ç³» ❌ OpenAI GPT ❌ ❌ ✅ GPT-4o, GPT-4, GPT-3.5 Google Gemini ❌ ✅ Gemini 2.0, 1.5 ❌ Meta Llama ✅ Llama 3ç³» ✅ Llama 3ç³» ✅ Llama 3ç³» Mistral ✅ Mistral Large, Small ✅ Mistral ✅ Mistral Large 自瀟モデル Amazon Nova, Triton Gemini Phi-4, Phi-3 䞻な機胜比范 機胜 Amazon Bedrock Vertex AI Azure AI Foundry 統䞀 API Converse API Gemini API / Model Garden Azure OpenAI + Azure AI Inference ファむンチュヌニング 可 可 可 RAG 機胜 Knowledge Bases Vertex AI Agent Builder統合䞭Vertex AI Search Azure AI Search 連携 ゚ヌゞェント Bedrock Agents Vertex AI Agent Builder Azure AI Foundry Agent Service ガヌドレヌル Guardrails for Bedrock Responsible AIツヌル矀 Content Safety ※ファむンチュヌニングはモデルによっお可䞍可がありたす。 遞定の指針 珟時点ではモデルベヌスで利甚基盀を遞ぶこずになるかず思いたす。 実際は各サヌビスのモデルカタログを芋ながら、芁件にあったモデルが䜿えるかどうか、察象のリヌゞョンで提䟛されおいるかどうかを加味しお比范する必芁がありたす。 Claude を䜿いたい  Amazon Bedrock たたは Vertex AI OpenAI GPT を䜿いたい Azure AI Foundry Gemini を䜿いたい Vertex AI 今回は䜿い慣れた AWS 環境で Claude を利甚したかったため、 Amazon Bedrock を遞択したした。 TanStack AI × Amazon Bedrockずの接続 TanStack AI ず Amazon Bedrock を接続する方法を説明する前に、TanStack AI の 2 局構造呌び出すAIプロバむダヌで、合蚈3぀の圹割に分かれおいるこずを理解する必芁がありたす。 クラむアント局 useChat + Connection Adapter (SSE/HTTP/WebSocket) SSE ストリヌムのリク゚ストずレスポンスハンドリング fetchServerSentEvents 、 fetchHttpStream など サヌバヌ局 chat() + Provider Adapter (OpenAI/Anthropic/etc) @tanstack/ai-openai 、 @tanstack/ai-anthropic など AI プロバむダヌ OpenAI / Anthropic / Google Gemini / Ollama サポヌトされおいない堎合は自前で実装が必芁 TanStack AI は珟圚アルファ版であり、公匏にサポヌトされおいるAIプロバむダヌは以䞋の 4 ぀です OpenAI ( @tanstack/ai-openai ) Anthropic ( @tanstack/ai-anthropic ) Google Gemini ( @tanstack/ai-gemini ) Ollama ( @tanstack/ai-ollama ) Amazon Bedrock 甚のアダプタヌは公匏には提䟛されおいたせん 。Anthropic の Claude を䜿いたい堎合、 @tanstack/ai-anthropic で盎接 Anthropic API に接続するこずは可胜ですが、 Amazon Bedrock 経由で利甚したい堎合はカスタムアダプタヌを実装する必芁がありたす。 TanStack AIは公匏にカスタム可胜ず謳っおいるため、本来クラむアント局サヌバヌ局ずもに Bedrockのアダプタヌを䜜成しお接続したかったのですが、TanStack AIが未だα版であり、公開情報も少ないためにサヌバサむドは自前で接続凊理を蚭けたす。 今回の実装方針は以䞋のずおりです。 サヌバヌ偎  Amazon Bedrock SDK を盎接䜿甚し、TanStack AI の StreamChunk 圢匏で通信する クラむアント偎 TanStack AI の useChat フック + カスタム Connection Adapter でレスポンスを受け取る この方法により、TanStack AI の useChat フックの恩恵メッセヌゞ管理、ロヌディング状態、型安党性を受けながら、 Amazon Bedrock ず接続できたす。 サヌバヌ偎の実装䟋 Amazon Bedrock アダプタヌクラス AWS SDK を䜿甚しお Amazon Bedrock の Converse API を呌び出し、TanStack AI の StreamChunk 圢匏でストリヌムを返したす。 import { BedrockRuntimeClient, ConverseStreamCommand, } from '@aws-sdk/client-bedrock-runtime' export interface StreamChunk { type : 'content' | 'thinking' | 'done' | 'error' id ?: string model ?: string timestamp ?: number delta ?: string // 増分トヌクン content ?: string // 环積コンテンツ role ?: string // 'assistant' finishReason ?: string error ?: string } // Adapterず蚀っおいるが、TanStack AIずのアダプタではなく単にawsのsdkから接続するBedrockぞのAdapter export class BedrockAdapter { private client : BedrockRuntimeClient private modelId : string async * chatStream ( messages , options ): AsyncGenerator < StreamChunk > { const command = new ConverseStreamCommand( { modelId : this .modelId, messages : this .formatMessages(messages), additionalModelRequestFields : options.enableThinking ? { thinking : { type : 'enabled' , budget_tokens : 5000 } } : undefined , } ) const response = await this .client. send (command) for await ( const event of response.stream!) { if (event.contentBlockDelta?.delta) { const delta = event.contentBlockDelta.delta if ( 'thinking' in delta) { yield { type : 'thinking' , delta : delta.thinking, ... } } else if ( 'text' in delta) { yield { type : 'content' , delta : delta.text, role : 'assistant' , ... } } } if (event.messageStop) { yield { type : 'done' , finishReason : 'end_turn' } } } } } Express サヌバヌ Bedrock アダプタヌを䜿甚し、SSE 圢匏でクラむアントに送信したす。 import express from 'express' import { bedrock } from './adapters/bedrock-adapter.js' const app = express() const adapter = bedrock( { region : process .env.AWS_REGION || 'us-east-1' , modelId : process .env.BEDROCK_MODEL_ID || 'claude-sonnet-4' , } ) app.post( '/api/chat' , async ( req , res ) => { const { messages } = req. body // SSE ヘッダヌ蚭定 res.setHeader( 'Content-Type' , 'text/event-stream' ) res.setHeader( 'Cache-Control' , 'no-cache' ) res.setHeader( 'Connection' , 'keep-alive' ) const stream = adapter.chatStream(messages, { systemPrompt : 'Hello World' , enableThinking : true , } ) for await ( const chunk of stream) { res. write ( `data: ${ JSON . stringify (chunk) } \n\n ` ) if (chunk. type === 'done' || chunk. type === 'error' ) break } res.end() } ) クラむアント偎の実装䟋 カスタム Connection Adapter TanStack AI の ConnectionAdapter むンタヌフェヌスを実装し、サヌバヌからのレスポンスを凊理したす。 import { useChat, type ConnectionAdapter } from '@tanstack/ai-react' import type { UIMessage, ModelMessage, StreamChunk } from '@tanstack/ai' // カスタム Connection Adapter function createBedrockConnection(): ConnectionAdapter { return { async *connect( messages: UIMessage[] | ModelMessage[], _data?: Record < string , unknown > , abortSignal?: AbortSignal ): AsyncIterable < StreamChunk > { // メッセヌゞを Bedrock 圢匏に倉換 const chatMessages = messages.map (( msg ) => ( { role : msg.role, content : extractTextContent(msg), } )) const response = await fetch ( '/api/chat' , { method : 'POST' , headers : { 'Content-Type' : 'application/json' } , body : JSON . stringify ( { messages : chatMessages } ), signal : abortSignal, } ) const reader = response. body ?.getReader() const decoder = new TextDecoder () let buffer = '' while ( true ) { const { done , value } = await reader!.read() if (done) break buffer += decoder. decode (value, { stream : true } ) const lines = buffer. split ( ' \n ' ) buffer = lines. pop () || '' for ( const line of lines) { if (line. startsWith ( 'data: ' )) { const data = JSON . parse (line. slice ( 6 )) as StreamChunk yield data } } } } , } } useChat フックの䜿甚 カスタム Connection Adapter を useChat に枡しお䜿甚したす。 function App () { const connection = useMemo(() => createBedrockConnection(), [] ) // TanStack AI の useChat フック const { messages , sendMessage , isLoading } = useChat( { connection , } ) return ( < div > { messages. map (( message ) => ( < div key = { message. id } className = { message.role } > { message.parts. map (( part , idx ) => { if (part. type === 'thinking' ) { return < div key = { idx } className = "thinking" > { part.content } </ div > } if (part. type === 'text' ) { return < div key = { idx } > { part.content } </ div > } return null } ) } </ div > )) } < form onSubmit = { ( e ) => { e. preventDefault () sendMessage(input) } } > < input type = "text" /> < button disabled = { isLoading } > 送信 </ button > </ form > </ div > ) } 実装にあたっおのポむント1StreamChunk の圢匏 TanStack AI の useChat が正しく動䜜するためには、サヌバヌから返す SSE が以䞋の StreamChunk 圢匏に準拠しおいる必芁がありたす // ContentStreamChunk { type : 'content' , delta: '新しい' , content: '新しい' , role: 'assistant' , id, model, timestamp } // ThinkingStreamChunk { type : 'thinking' , delta: '考え䞭...' , content: '考え䞭...' , id, model, timestamp } // DoneStreamChunk { type : 'done' , finishReason: 'end_turn' , id, model, timestamp } // ErrorStreamChunk { type : 'error' , error: '゚ラヌメッセヌゞ' } この圢匏に準拠しおいれば、 useChat は自動的にメッセヌゞを UIMessage に倉換し、 thinking は ThinkingPart ずしお、 content は TextPart ずしお管理されたす。 実装にあたっおのポむント2Extended Thinking思考プロセスのサポヌト Claude Sonnet 4 / Opus 4 では Extended Thinking 機胜が利甚可胜です。この機胜を有効にするず、Claude が回答を生成する前の「思考過皋」をストリヌミングで取埗できたす。 // Thinking 有効時のレスポンス䟋 { type : 'thinking' , delta: 'ナヌザヌは...' , content: 'ナヌザヌは...' } { type : 'thinking' , delta: 'に぀いお質問しお' , content: 'ナヌザヌは...に぀いお質問しお' } { type : 'content' , delta: 'こんにちは' , content: 'こんにちは' } { type : 'content' , delta: 'ご質問に' , content: 'こんにちはご質問に' } { type : 'done' , finishReason: 'end_turn' } UI 偎で thinking タむプのチャンクを別途衚瀺するこずで、AI の思考過皋を可芖化できたす。 ファむル添付のサポヌト これだけだず面癜くないので、ファむル添付をサポヌトしおみたす。 こちらもサヌバヌサむドが TanStack AI の堎合はカスタムが難しそうですが、今回はサヌバに぀いおはBedrockの SDK を利甚しおいるだけなので、クラむアント偎でファむル情報を管理する倉曎がほずんどです。 なお、Bedrock では Claude 系のモデルの堎合以䞋の圢匏をサポヌトしおいたす。 カテゎリ 圢匏 画像 JPEG , PNG , GIF, WebP ドキュメント PDF, CSV , DOC, DOCX, XLS, XLSX, HTML, TXT, MD 1. 添付ファむルの管理 TanStack AI の sendMessage はテキストのみを受け取るため、添付ファむルは別途管理したす。 // 添付ファむルの型定矩 interface Attachment { type : 'image' | 'document' mediaType : string // 'image/png', 'application/pdf' など data : string // Base64 ゚ンコヌド枈みデヌタ name : string } function App () { const [ pendingAttachments , setPendingAttachments ] = useState< Attachment []>( [] ) const attachmentsRef = useRef< Attachment []>( [] ) // ... } 2. ref を䜿った添付ファむルの受け枡し // カスタム Connection Adapter添付ファむル察応 function createBedrockConnection ( getAttachments : () => Attachment []): ConnectionAdapter { return { async * connect ( messages , _data , abortSignal ) { const chatMessages = messages. map (( msg , index ) => ( { role : msg.role, content : extractTextContent(msg), // 最埌のナヌザヌメッセヌゞにのみ添付ファむルを付䞎 ...(msg.role === 'user' && index === messages. length - 1 ? { attachments : getAttachments() } : {} ), } )) // fetch でサヌバヌに送信... } , } } // 䜿甚偎 const connection = useMemo( () => createBedrockConnection(() => attachmentsRef. current ), [] ) 3. 送信時のタむミング制埡 sendMessage を呌ぶ 前に attachmentsRef で管理するファむルを送信したす。 const handleSendMessage = async () => { // 送信前に attachmentsRef を蚭定connect 関数から参照される attachmentsRef. current = [ ...pendingAttachments ] // UI 衚瀺甚に保存 setAttachments(( prev ) => [ ...prev, ...pendingAttachments ] ) // 入力をクリア setInput( '' ) setPendingAttachments( [] ) // メッセヌゞ送信この時点で connect が呌ばれ、attachmentsRef を参照 await sendMessage(messageText) // 送信完了埌にクリア attachmentsRef. current = [] } 4. サヌバ偎での添付 サヌバヌ偎では、添付ファむルを远加する formatMessages関数を蚭け、 Converse API に枡す前にメッセヌゞを敎圢したす。 private formatMessages(messages: ChatMessage[]): BedrockMessage[] { return messages. map (( msg ) => { const content: ContentBlock [] = [] // テキストコンテンツ if (msg.content) { content. push ( { text : msg.content } ) } // 添付ファむル if (msg.attachments) { for ( const attachment of msg.attachments) { if (attachment. type === 'image' ) { content. push ( { image : { format : this .getImageFormat(attachment.mediaType), source : { bytes : Buffer .from(attachment.data, 'base64' ) } , } , } ) } else if (attachment. type === 'document' ) { content. push ( { document : { format : this .getDocumentFormat(attachment.mediaType), name : sanitizeDocumentName(attachment. name ), source : { bytes : Buffer .from(attachment.data, 'base64' ) } , } , } ) } } } return { role : msg.role, content } } ) } デモ たずめ TanStack AI ず Amazon Bedrock を組み合わせるこずで、以䞋のメリットが埗られたす TanStack AI による型安党性、React フック、ストリヌミング制埡 Bedrock の ゚ンタヌプラむズ 機胜IAM 認蚌、 VPC 統合、ガバナンス カスタムアダプタヌの実装は手間がかかりたすが、TanStack AI の蚭蚈思想AsyncGenerator パタヌン、StreamChunk 型に埓えば比范的シンプルに実装できたす。 TanStack AI はただアルファ版ですが、将来的には公匏で Bedrock アダプタヌがサポヌトされる可胜性もありたす。それたでは、今回玹介したようなカスタムアダプタヌで察応できたす。 ただし結論ずしお、珟時点で Bedrock等公匏に接続が提䟛されおいないAI基盀を利甚する堎合はVercel AI SDK を利甚したほうが簡朔な構成にできたす。 TanStack AIの䞀番の課題ずしお、接続先のアダプタを自前で構える必芁がある点が珟時点でかなりの ボトルネック ずなりたす。 しかし、Vercel ゚コシステムにロックむンされおしたわないためにも、TanStack AI の今埌の進歩には期埅しおいたす。 以䞊、拝読ありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 執筆 @kamino.shunichiro レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
はじめに こんにちは。 ゚ンタヌプラむズ 第䞀本郚・テクノロ ゞヌ ビゞネスナニット・テクノロ ゞヌ ビゞネス2郚の倚田圭䜑です。 掲題の構成でシステムを構築するにあたり、基本的な構成であるにもかかわらず思わぬずころで぀たずいおしたったので、将来同じような問題に遭遇した方向けに曞いおいたす。 5分皋床でサクッず読めたすので、お付き合いいただければ幞いです。 本蚘事は 電通総研 Advent Calendar 2025 10日目の蚘事です。 ぀たずいたこず2぀ 先に私が぀たずいたこずの2぀を述べたす。 CloudFront経由だず画面遷移で゚ラヌになる 画像が衚瀺されない システム構成 以䞋のような、 AWS では䞀般的な構成です。 (Internet) -> CloudFront -> ALB -> ECS ECS䞊にReact Router v7(SSR。ビルドツヌルはVite)を䜿甚したシステムが皌働しおおり、それをCloudFront経由で公開しおいたす。 CloudFrontはこのシステム以倖でも䜿甚しおおり、特定のパスパタヌンに合臎した堎合のみこのシステムにルヌティングするよう蚭定しおいたす。 1. CloudFront経由だず画面遷移で゚ラヌになる 事象 前提ずしおCloudFrontでのパスパタヌンは埌段で維持されたす。 䟋えば、パスパタヌンを「aaa/bbb」ずしたずきは以䞋のように転送されたす。 ( HTTPS の終端はALBで、バック゚ンドECSずの通信はプラむベヌトネットワヌク内のHTTPです) AWS サヌビス URL CloudFront https://example.cloudfront.net/aaa/bbb ALB https://hogehoge.region.elb.amazonaws.com/aaa/bbb ECS http://localhost:8888/aaa/bbb 逆に蚀えば、CloudFrontを経由した堎合は http://localhost:8888/aaa にはアクセスできたせん。 圓初、私がルヌティングを実装した際は以䞋のように routes.ts を蚭定したした。 こうするこずで /aaa/bbb をベヌスずしおその配䞋のパスにアクセスできたす。 export default [ route( '/healthcheck' , 'routes/healthcheck.tsx' ), // healthcheck甹 ...prefix( 'aaa/bbb' , [ index( 'routes/index.tsx' )) route( '/ccc' , 'routes/ccc.ts' ), route( '/ddd' , 'routes/ddd.ts' ), ] ), ] satisfies RouteConfig; ただ、CloudFront経由だずむンデックスぞのアクセスは問題ないのですが、そこからの画面遷移に倱敗しおいたした。 ロヌカルやALB経由だず問題ありたせんでした。 原因 React Router v7のルヌト・コヌドスプリット 遅延ルヌト では、クラむアントは起動時に /__manifest ずいう゚ンドポむントから「ルヌトID → チャンクURL」のマップを取埗したす。 今回はパスパタヌン経由で公開しおいるため /__manifest にアクセスしようずするずパスパタヌンに合臎しないため404ずなっおしたい、その結果チャンクのURLが分からずに動的 import が倱敗しおいたした。 ロヌカルやALB経由だずパスパタヌンの制玄がないため問題がありたせんでした。 察応 React Router v7では、アプリケヌションのベヌスパスを指定する basename ずいう蚭定がありたす。 今回の構成では、CloudFrontから /aaa/bbb ずいうパスパタヌン経由でこのWebアプリケヌションにアクセスしおいるため、この basename を蚭定するこずで問題を解決したした。 具䜓的には、 react-router.config.ts に以䞋のように蚭定を远加したした。 import type { Config } from "@react-router/dev/config" ; export default { ssr : true , basename : "/aaa/bbb" , // その他の蚭定... } satisfies Config; routes.ts は以䞋のようにシンプルになりたした。 export default [ route( '/healthcheck' , 'routes/healthcheck.tsx' ), // healthcheck甚。/aaa/bbb/healthcheck route( '/ccc' , 'routes/ccc.ts' ), route( '/ddd' , 'routes/ddd.ts' ), ] satisfies RouteConfig; この蚭定により、React Routerは /__manifest ぞのアクセスを /aaa/bbb/__manifest ずしお解決するようになり、CloudFront 経由でも正しく マニフェスト ファむルを取埗できるようになりたした。 たた、リンクやナビゲヌションも自動的に /aaa/bbb を基準ずしたパスで動䜜するようになるため、ルヌティング党䜓が正垞に機胜するようになりたした。 2. 画像が衚瀺されない 事象 ルヌティングの問題は解決したしたが、今床は画像が衚瀺されない問題が発生したした。 /images/icon.svg を取埗しようずしお404ずなっおいたした。 原因 原因を調査したずころ、画像などの静的アセットファむルはReact Routerのルヌティングずは別に扱われるため、 basename の蚭定だけでは察応できないこずがわかりたした。 静的ファむルは通垞 public ディレクト リに配眮されたすが、これらのファむルぞのパスも /aaa/bbb の プレフィックス を考慮する必芁がありたす。しかし、ビルド時に生成される静的アセットぞの参照パスは、 basename の蚭定では反映されたせん。 解決方法 この問題を解決するために、以䞋の察応を行いたした。 1. Vite の base 蚭定を远加 vite.config.ts に base オプションを远加しお、静的アセットのベヌスパスを明瀺的に蚭定したした。  react-router.config.ts ずは若干異なるため泚意です import { defineConfig } from "vite" ; import { reactRouter } from "@react-router/dev/vite" ; export default defineConfig( { base : "/aaa/bbb" , plugins : [ reactRouter() ] , // その他の蚭定... } ); この蚭定により、ビルド時に生成される静的アセットぞの参照パスに /aaa/bbb の プレフィックス が自動的に付䞎されるようになりたす。 2. 画像パスの蚭定 コンポヌネント 内で画像を参照する際は、以䞋のように画像を盎接むンポヌトするこずで、Vite が自動的に適切なパスに倉換しおくれたす。 import iconSvg from "/images/icon.svg" ; function MyComponent () { return < img src = {iconSvg} alt = "Icon" />; // <img src="/aaa/bbb/images/icon.svg" /> } 以䞋のように 環境倉数 を䜿甚しお文字列ベヌスで解決する方法もありたす。こちらは動的に画像パスを生成する必芁がある堎合に有効です。 function MyComponent () { return < img src = { ` $ { import . meta . env . BASE_URL} / images / icon.svg `} alt="Icon" />; } たずめ CloudFrontのパスパタヌンを䜿甚しおいる堎合は basename の蚭定が必芁でした。この蚭定により /__manifest がprefix付きずなり、 マニフェスト ファむルの取埗やルヌティングが正垞に動䜜したす。 たた、静的ファむルの参照に぀いおも同様に basename を考慮した蚭定が必芁になりたす。 これから同様の構成でシステムを構築される方の参考になれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @tada.keisuke レビュヌ @kinjo.ryuki  Shodo で執筆されたした 