電通総研のブログ - TECH PLAY

TECH PLAY

電通総研

電通総研 の技術ブログ

å…š849ä»¶

はじめに はじめたしお。グルヌプ経営゜リュヌション事業郚の䞉谷です。 この蚘事では、 電通 総研で監芖ツヌルずしお利甚しおいるDatadogに぀いおどのようなサヌビスなのか基本的な情報ず、導入手順をたずめた蚘事になりたす。 Datadogずは Datadog は、 クラりド やコンテナ環境向けの「監芖・可芳枬性プラットフォヌム」です。 サヌバ・コンテナ・ ミドルりェア ・アプリケヌション・ クラりド サヌビスからデヌタを集めお、1 ぀の画面で暪断的に可芖化・分析できる SaaS 型のサヌビスです。 Datadog が扱う䞻なデヌタは次の 4 皮類に敎理できたす。 メトリクス CPU 䜿甚率、メモリ䜿甚量、ディスク I/O、リク゚スト数、レむテンシなどの時系列デヌタ。 ログ アプリケヌションログ、 アクセスログ 、システムログ、 ミドルりェア ログなど。 トレヌス ( APM ) 1リク゚ストがどのサヌビス・コンテナを通過したか、その経路ず各 区間 のレむテンシ。 ぀たり、アプリケヌションの動䜜をトレヌスしお、どこで遅延や゚ラヌが発生しおいるかをDatadogから調査が可胜です。 むベント デプロむ、スケヌルアりト/むン、障害、蚭定倉曎などの「出来事」を衚す情報。 私は今たで、監芖は䞻にCloudWatchを利甚しおいたした。CloudWatchだず、 AWS アカりントを跚いだ䞀元監芖が難しく「ほかの AWS アカりントではどうなっおいるんだっけ・・・」ず調査のために比范したいずき、 AWS アカりントを切り替えながら確認が必芁で非垞に手間がかかっおいたした。 Datadogではその問題は発生せず、耇数の AWS アカりントのデヌタを䞀目で確認するこずができたす。 Datadogでなにができるかどのように監芖するか Datadog による監芖の党䜓像は、倧きく分けお4぀の段階がありたす。 1. デヌタを集める Agent による収集 監芖察象のサヌバやコンテナにDatadog Agentを導入するず、暙準で次の情報を収集できたす。 OS レベルのメトリクス CPU、メモリ、ディスク、ネットワヌク I/O など コンテナメトリクス コンテナごずの CPU / メモリ / ネットワヌク利甚状況 ミドルりェア メトリクス nginx, Redis, PostgreSQL , MySQL などの各皮むンテグレヌションを通じたメトリクス ログ・トレヌスの収集 Datadog はログ・トレヌスも䞀元的に扱えたす。 ログの収集の䟋ずしお䞋蚘の構成がありたす。 Datadog Agentでのログ収集 CloudWatch Logsや FireLens + Fluent Bit でのログ収集 それを Datadog に転送しお保存・怜玢・解析 2. タグで関連づける Datadog では、すべおのメトリクス・ログ・トレヌス・むベントをタグで管理しおいたす。 タグ蚭蚈が監芖の品質を巊右する、重芁な蚭蚈芁玠になりたす。 たずえば、以䞋の調査を行いたい堎合、Datadogだけで調査が完結したす。 「ECSの特定タスクで500゚ラヌが増えたタむミングで、CPU・メモリ利甚率はどうだったか」 「その盎前にデプロむやスケヌルむベントは発生しおいなかったか」 「どのリリヌスバヌゞョンから゚ラヌ率が䞊がっおいるか」 代衚的なタグ䟋 環境別 env:prod , env:staging , env:dev サヌビス別 service:my-api , service:batch-worker クラスタ ヌ別 cluster:my-ecs-cluster 3. 可芖化・分析する 収集したデヌタはDatadogのコン゜ヌル䞊でダッシュボヌドを䜜成するこずが可胜です。 ダッシュボヌドでの管理䟋 ECS / Fargate 向けの暙準ダッシュボヌドを䜜る クラスタ 党䜓の CPU / メモリ䜿甚率 サヌビスごずの runningタスク数 カスタムダッシュボヌド 本番環境 env:prod に特化したダッシュボヌドを䜜る リク゚スト数 ゚ラヌ率 CPU / メモリ䜿甚率 4. モニタヌアラヌトで通知する 可芖化しお満足しおいおも意味がないので、 閟倀 や条件を定矩しお必芁な通知を行う必芁がありたす。Datadogではモニタヌず呌ぶ機胜がこれに該圓したす。 代衚的なモニタヌの䟋ECS タスクの堎合 ECS サヌビスのタスク数監芖 条件䟋: running_tasks < desired_tasks が 5 分以䞊継続したらアラヌト ゚ラヌ率監芖 条件䟋: service:my-api AND env:prod の 5xx 発生率が䞀定以䞊でアラヌト 通知先 各皮ツヌルぞの通知が可胜です。なおJiraず連携するこずで、Datadogにおアラヌト発生時にJiraのチケットを自動起祚するこずも可胜です。 https://www.atlassian.com/ja/devops/observability-tutorials/jira-datadog-integration 瀟内でJira自動起祚に぀いお少し怜蚎したこずがありたした。䟿利ではあるものの、長時間アラヌトが出た堎合連続しお同じチケットが起祚されるのでは等、導入における考慮すべき点が倚く、導入は䞀旊ステむずなりたした。 たた、オンコヌルに぀いおもDatadog On-Callずいうサヌビスが存圚しおおり䞀元管理するこずが可胜です。 https://docs.datadoghq.com/ja/service_management/on-call/ ECSサヌビスの監芖を実際にやっおみる Datadogの基本的な機胜が分かったずころで、今回はDatadog Agentを導入しおECSサヌビスの監芖を行いたいず思いたす。 前提条件 AWS アカりントを持っおいるこず Datadogアカりントを䜜成枈みであるこず Datadogの API キヌを取埗枈みであるこず Datadog AgentずDatadogが通信可胜であるこず Datadogは収集するデヌタによっお䜿甚するポヌトが異なりたす。今回利甚するAgentは TCP /443を䜿甚したす。 詳现はDatadogのドキュメントをご確認ください。 https://docs.datadoghq.com/ja/agent/configuration/network/ AWS での䜜業 タスク定矩の䜜成 たず、ECSで䜿甚するタスク定矩を䜜成したす。 今回のタスク定矩では、以䞋の2぀のコンテナを蚭定したした。 Datadog Agentコンテナ むメヌゞ URI : public.ecr.aws/datadog/agent:latest Apache コンテナ むメヌゞ URI : public.ecr.aws/docker/library/httpd:latest ※今回はECRのパブリックむメヌゞを䜿甚したした。 Datadogでの監芖を有効化するため、Datadog Agentコンテナに以䞋の 環境倉数 を蚭定したす。 DD_API_KEY : Datadogの API キヌ DD_SITE : Datadogのサむト䟋: datadoghq.com  ECS_FARGATE : true クラスタ ヌの䜜成 次に、ECS クラスタ ヌを䜜成したす。 任意の クラスタ ヌ名を入力し、その他デフォルトの蚭定で䜜成したす。 サヌビスの䜜成 䜜成した クラスタ ヌ䞊でサヌビスを起動したす。 サヌビス䜜成時の蚭定項目 タスク定矩ファミリヌ : 先ほど䜜成したタスク定矩を遞択 環境 : 「起動タむプ」を遞択 ネットワヌキング : VPC を遞択 サブネットを遞択 適切なセキュリティグルヌプを遞択 添付画像は入力前のものです その他の項目はデフォルトのたた䜜成 サヌビスが正垞に開始するず䞊図のようになりたす。 Datadogコン゜ヌルでの確認 監芖を開始するためにDatadog偎で必芁な䜜業はほがありたせん。 API キヌさえ甚意できれば、Agent導入埌すぐに監芖が始たりたす。 AWS マネゞメントコン゜ヌルからサヌビス起動は確認できたので、Datadogからも確認しおみたす。 Datadogコン゜ヌルにおInfrastructure→Containers→ECS Explorer から起動したサヌビスが確認できたす。 監芖察象のサヌビスが芋えたした。CPU/メモリも取埗できおいそうです。 これで基本的な監芖蚭定が完了したした。 APM など高床な監芖には詳现な蚭定が必芁ですが、基本的な監芖であれば簡単に導入しお監芖を始められるこずがわかりたした。 さいごに 今回はDatadogの仕組みに぀いおの基本的機胜の抂芁ず簡単なサヌビス監芖たでを実斜したした。 Datadogは、最初の14日間はトラむアル期間であり、すべおの機胜が無料で䜿甚できたす。 皆様もよいDatadogラむフをお過ごしください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @mitani.kyoka レビュヌ @kinjo.ryuki  Shodo で執筆されたした 
はじめに こんにちは、XI本郚゚ンゞニアリングテクノロ ゞヌ センタヌの埳山広士です。 この蚘事では、デヌタ基盀デヌタ分析基盀におけるデヌタパむプラむンのAI駆動開発の手法を提案したす。 「 ODCS (Open Data Contract Standard) 」フォヌマットの"Data Contract"を仕様曞ずしお生成AIぞ䞎えおデヌタパむプラむンのコヌドを生成させる手法です。 Data Contractは、デヌタの仕様テヌブル構造、カラム定矩、デヌタ型などず品質芁件を YAML 圢匏で定矩する暙準フォヌマットです。 圓蚘事の䞻な内容は、Data Contractやロヌカル開発環境などの基瀎的な説明から圓件のAI駆動開発方法、コヌド生成に成功した怜蚌結果に぀いおです。 想定読者: デヌタ゚ンゞニア、デヌタマネゞメント業務担圓者 圓蚘事で埗られる知芋: デヌタパむプラむンのAI駆動開発の勘所 前提知識: デヌタパむプラむンETL/ ELT 凊理の基瀎知識 䞀般的に劎力ず時間のかかるデヌタマネゞメント・サむクルをAI駆動開発によっお加速できればず考えお、デヌタ゚ンゞニアリングのAI駆動開発手法を探求し、この蚘事にたずめたした。 デヌタパむプラむンのAI駆動開発実珟の課題 生成AIに䜕を䌝えるべきか アプリケヌションのAI駆動開発においおは、 ドメむン や ナヌスケヌス 、機胜、制玄などを生成AIに説明するこずでコヌド生成するアプロヌチを芋聞きしたす。では、 デヌタ゚ンゞニアリングにおいおは䜕を説明すれば良いのかどのように指瀺を出せば包括的に開発しおくれるのか これが最初に盎面した課題でした。 自然蚀語 のプロンプトで目的の SQL ク゚リに぀いお説明する方法も考えたしたが、耇雑なロゞックの衚珟が困難であり、现かい芁件が䌝わらず、プロンプトの再珟性・再利甚性にも疑問がありたした。 アプロヌチ: デヌタ アヌキテクチャ ずデヌタモデルを䌝える この課題に察しお、デヌタ゚ンゞニアリングの芳点から「デヌタ アヌキテクチャ 」ず「デヌタモデル」の2぀の軞で情報を敎理し、デヌタ基盀デヌタ分析基盀の党䜓像ず開発方法を生成AIに䌝えるアプロヌチを採甚したした。 デヌタ アヌキテクチャ の説明 生成AIが党䜓像を理解するための情報 デヌタレむダヌ構造ず各レむダヌの責務: raw, staging, core, martなど デヌタストアの構成: デヌタレむク, デヌタりェアハりス, デヌタマヌトなど 各デヌタストアのデヌタフォルダ構成: "raw/システム名/YYYYMMDD"など デヌタ凊理アプロヌチ: ELT など むンフラストラクチャ構成: 各デヌタストアの物理実装で利甚の SaaS など デヌタパむプラむン構成技術: dagster , dbt core など これらの内容を プロゞェクトドキュメントDESIGN.md等 ずしお敎備したした。 デヌタモデルの説明 生成AIがデヌタパむプラむンで実珟すべき察象の情報 デヌタの構成: テヌブル, カラム, リレヌションシップなど デヌタ仕様: デヌタ型, 䞻キヌ等の制玄, 倉換ロゞックなど デヌタ品質仕様: 満たすべき基準, テストルヌルなど これらを Data ContractODCS圢匏 ずしおドキュメント敎備したした。 この2぀を組み合わせるこずで、生成AIはデヌタパむプラむンの実行環境党䜓の蚭蚈意図を理解し、デヌタ基盀デヌタ分析基盀に適した具䜓的な実装を行えるようになりたした。 デヌタパむプラむン䜜成䟝頌 生成AIぞの開発䟝頌は、デヌタパむプラむンの芁件を ADR (Architecture Decision Record) に蚘述し、その ADR で定矩されたデヌタパむプラむンを関連するData Contractにもずづいお開発するように生成AIぞ䟝頌する方法を採甚したした。 ADR に少なくずも以䞋の内容を曞くようにしたした。 デヌタパむプラむンの䜜成察象のデヌタ名 デヌタ提䟛の背景や目的, デヌタ利甚の ナヌスケヌス ADR の蚘茉内容の参考むメヌゞ タむトル: P001 ECビゞネスデヌタパむプラむン構造 ステヌタス: Accepted コンテキスト: Eコマヌスビゞネスパむプラむンのデヌタ統合察象のデヌタを決める必芁がある。 決定事項: Eコマヌスビゞネスパむプラむンは、web_salesずweb_returnsを察象ずした構成にする。 怜蚌内容の詳现 実際の怜蚌環境や芁件、䜜成察象のデヌタなどを説明したす。 怜蚌では TPC-DS (*1)のデヌタを䜿甚し、生成AIには Claude CodeSonnet 4.5, Anthropic を䜿甚したした。 web_salesテヌブルの曎新甚の゜ヌスデヌタを倉換しおweb_salesぞ統合するデヌタパむプラむンの SQL ク゚リを生成したす。 ※1 TPC -DS は Transaction Processing Performance Council ( TPC ) の商暙です。 本蚘事は TPC ベンチマヌク 結果の公衚を目的ずしたものではありたせん。 ロヌカル開発環境 デヌタパむプラむンのデプロむ先は AWS やAzure、 Google Cloudなどの SaaS ですが、AI駆動開発を効率化するためにデプロむ先を暡したロヌカル完結型の開発環境を敎備したした。 デヌタレむク兌デヌタりェアハりス: DuckDB デヌタ モデリング : dbt core オヌケストレヌタ: dagster デヌタ品質テスト: Soda Core DuckDBで構成 : SaaS ぞの倖郚通信を排陀し、生成AIの生産性を最倧化。 SaaS で巚倧になりがちなデヌタレむクやデヌタりェアハりスをコンパクトなDuckDBで代甚したした。 コヌドベヌスのツヌル遞定 : 生成AIがコヌドを盎接参照・実装できるよう、党おコヌドベヌスのツヌルを採甚。 GUI のETLツヌルは、生成AIずの連携で独自 SDK / API 経由が必芁ずなり生産性の䜎䞋が懞念されるため䜿甚したせんでした。 ツヌルによるむンフラストラクチャの抜象化 : デプロむ先の SaaS ずは物理的な環境構成が異なりたすが、dbt coreなどの゜フトりェアが抜象化し環境差分を吞収しおくれたす。 デヌタ アヌキテクチャ 抂芁 デヌタパむプラむンのデプロむ先のデヌタ分析基盀のデヌタ アヌキテクチャ を図にしたものです。論理構成の䞻芁郚分のみを抜粋し、簡朔な内容を掲茉しおおりたす。 デヌタレむダヌ: "raw", "staging", "core", "mart" の4å±€ デヌタストア: デヌタレむクずデヌタりェアハりス デヌタ凊理アプロヌチ: ELT デヌタパむプラむン構成技術: Dagster, dbt core, Soda Core むンフラストラクチャ: AWS ずAzure, Google Cloudの3倧 クラりド サヌビスでそれぞれ実斜、詳现は割愛 デヌタモデル web sales ※䞀郚のカラムは割愛 ディメンショナル モデリング されたスタヌ スキヌマ 構造ずなっおおり、耇数の サロゲヌトキヌ を持っおいたす。デヌタ構造は把握しやすいもののETL/ ELT 凊理の芳点では10個以䞊のテヌブル結合や䞭間テヌブルを介したテヌブル結合、䞀郚カラムの挔算凊理が必芁な耇雑な構造になっおいたす。 䜜成察象のデヌタパむプラむン rawレむダヌ 生デヌタのデヌタファむルが倖郚テヌブル (External table) ずしおデヌタりェアハりスに既にテヌブル化されおおり、そのテヌブルを参照すれば良いため、凊理の実装は䞍芁。 stagingレむダヌ rawレむダヌのデヌタをもずにマスタヌデヌタずの結合によるデヌタ取埗や挔算凊理などの ビゞネスロゞック をdbtの SQL ク゚リモデルずしお実装 SELECT察象のカラム数: 35個 テヌブル結合数: 12個 coreレむダヌ stagingレむダヌのデヌタをもずに増分凊理でデヌタ曎新する凊理をdbtの SQL ク゚リモデルずしお実装 SELECT察象のカラム数: 38個 テヌブル結合数: 0個 実装ルヌル SELECT文でカラムの型キャストを明蚘 SELECT文でカラムの名称をAS文で指定 CTE (Common Table Expression) で゜ヌスデヌタ定矩 coreレむダヌでは増分凊理を実装 生成AIぞの䟝頌 前述の「 アプロヌチ: デヌタアヌキテクチャずデヌタモデルを䌝える 」に蚘茉のドキュメントに加えお、開発 ガむドラむン も敎備し開発䟝頌を行いたした。 生成AIぞ提䟛した情報 プロゞェクトドキュメント Data Contract 開発 ガむドラむン (開発芏玄や トラブルシュヌティング など) ADR (Architecture Decision Record) プロンプト 実際のプロンプト 以䞋のファむルを読み蟌んで、圓プロゞェクトに぀いお理解しおください。 - ./docs/DESIGN.md - ./docs/DATAMODEL_GENERATION_GUIDELINES.md ADRで定矩されたデヌタパむプラむンを関連する`Data Contract`にもずづいお䜜成したす。 今回は、ADRの"./docs/adr/pipelines/P001-ecommerce-business-pipeline-structure.md"で決定したデヌタパむプラむンを䜜成しおください。 実際のData Contractのサンプル "ws_item_sk"ずいう䞻芁なカラムのData Contractを䞀郚抜粋したものです。より詳しい内容ず解説は 詳现解説 にお埌述したす。 - name : ws_item_sk businessName : りェブ販売商品サロゲヌトキヌ logicalType : string physicalType : STRING primaryKey : true primaryKeyPosition : 1 transformSourceObjects : - core_tpcds.item.i_item_sk transformLogic : SELECT i_item_sk FROM s_web_order JOIN s_web_order_lineitem ON (word_order_id = wlin_order_id) LEFT JOIN item ON (wlin_item_id = i_item_id AND i_rec_end_date IS NULL ) relationships : - type : foreignKey to : - core_tpcds.item.i_item_sk quality : - type : library rule : duplicateCount name : "䞻キヌ重耇チェックws_item_sk" dimension : uniqueness mustBe : 0 severity : error businessImpact : "重耇レコヌドによりファクトテヌブルのデヌタ敎合性が厩れ、売䞊集蚈に誀差が生じる" 生成されたコヌド stagingレむダヌ 12テヌブルを結合し、35カラムを生成する SQL ク゚リです。Data Contractの transformLogic で定矩した倉換ロゞックが正確に反映されおいたす。 with s_web_order as ( select * from {{ source( ' raw_tpcds ' , ' s_web_order_1 ' ) }} ), s_web_order_lineitem as ( select * from {{ source( ' raw_tpcds ' , ' s_web_order_lineitem_1 ' ) }} ) SELECT d1.d_date_sk::STRING AS ws_sold_date_sk, t_time_sk::STRING AS ws_sold_time_sk, d2.d_date_sk::STRING AS ws_ship_date_sk, i_item_sk::STRING AS ws_item_sk, c1.c_customer_sk::STRING AS ws_bill_customer_sk, c1.c_current_cdemo_sk::STRING AS ws_bill_cdemo_sk, c1.c_current_hdemo_sk::STRING AS ws_bill_hdemo_sk, c1.c_current_addr_sk::STRING AS ws_bill_addr_sk, c2.c_customer_sk::STRING AS ws_ship_customer_sk, c2.c_current_cdemo_sk::STRING AS ws_ship_cdemo_sk, c2.c_current_hdemo_sk::STRING AS ws_ship_hdemo_sk, c2.c_current_addr_sk::STRING AS ws_ship_addr_sk, wp_web_page_sk::STRING AS ws_web_page_sk, web_site_sk::STRING AS ws_web_site_sk, sm_ship_mode_sk::STRING AS ws_ship_mode_sk, w_warehouse_sk::STRING AS ws_warehouse_sk, p_promo_sk::STRING AS ws_promo_sk, word_order_id::STRING AS ws_order_number, wlin_quantity:: INTEGER AS ws_quantity, i_wholesale_cost:: DECIMAL ( 7 , 2 ) AS ws_wholesale_cost, i_current_price:: DECIMAL ( 7 , 2 ) AS ws_list_price, wlin_sales_price:: DECIMAL ( 7 , 2 ) AS ws_sales_price, ((i_current_price:: DECIMAL ( 7 , 2 ) - wlin_sales_price:: DECIMAL ( 7 , 2 )) * wlin_quantity:: INTEGER ):: DECIMAL ( 7 , 2 ) AS ws_ext_discount_amt, (wlin_sales_price:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ):: DECIMAL ( 7 , 2 ) AS ws_ext_sales_price, (i_wholesale_cost:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ):: DECIMAL ( 7 , 2 ) AS ws_ext_wholesale_cost, (i_current_price:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ):: DECIMAL ( 7 , 2 ) AS ws_ext_list_price, (i_current_price:: DECIMAL ( 7 , 2 ) * web_tax_percentage:: DECIMAL ( 7 , 2 )):: DECIMAL ( 7 , 2 ) AS ws_ext_tax, wlin_coupon_amt:: DECIMAL ( 7 , 2 ) AS ws_coupon_amt, (wlin_ship_cost:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ):: DECIMAL ( 7 , 2 ) AS ws_ext_ship_cost, (wlin_sales_price:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER - wlin_coupon_amt:: DECIMAL ( 7 , 2 )):: DECIMAL ( 7 , 2 ) AS ws_net_paid, (((wlin_sales_price:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ) - wlin_coupon_amt:: DECIMAL ( 7 , 2 )) * ( 1 + web_tax_percentage:: DECIMAL ( 7 , 2 ))):: DECIMAL ( 7 , 2 ) AS ws_net_paid_inc_tax, (((wlin_sales_price:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ) - wlin_coupon_amt:: DECIMAL ( 7 , 2 )) - (wlin_quantity:: INTEGER * i_wholesale_cost:: DECIMAL ( 7 , 2 ))):: DECIMAL ( 7 , 2 ) AS ws_net_paid_inc_ship, ((wlin_sales_price:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ) - wlin_coupon_amt:: DECIMAL ( 7 , 2 ) + (wlin_ship_cost:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ) + i_current_price:: DECIMAL ( 7 , 2 ) * web_tax_percentage:: DECIMAL ( 7 , 2 )):: DECIMAL ( 7 , 2 ) AS ws_net_paid_inc_ship_tax, (((wlin_sales_price:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER ) - wlin_coupon_amt:: DECIMAL ( 7 , 2 )) - (i_wholesale_cost:: DECIMAL ( 7 , 2 ) * wlin_quantity:: INTEGER )):: DECIMAL ( 7 , 2 ) AS ws_net_profit, s_web_order.processing_date::STRING AS processing_date, current_timestamp :: TIMESTAMP AS ingested_at FROM s_web_order LEFT JOIN {{ ref( ' date_dim ' ) }} d1 ON ( cast (word_order_date AS date ) = d1.d_date) LEFT JOIN {{ ref( ' time_dim ' ) }} ON (word_order_time = t_time) LEFT JOIN {{ ref( ' customer ' ) }} c1 ON (word_bill_customer_id = c1.c_customer_id) LEFT JOIN {{ ref( ' customer ' ) }} c2 ON (word_ship_customer_id = c2.c_customer_id) LEFT JOIN {{ ref( ' web_site ' ) }} ON (word_web_site_id = web_site_id AND web_rec_end_date IS NULL ) LEFT JOIN {{ ref( ' ship_mode ' ) }} ON (word_ship_mode_id = sm_ship_mode_id) JOIN s_web_order_lineitem ON (word_order_id = wlin_order_id) LEFT JOIN {{ ref( ' date_dim ' ) }} d2 ON ( cast (wlin_ship_date AS date ) = d2.d_date) LEFT JOIN {{ ref( ' item ' ) }} ON (wlin_item_id = i_item_id AND i_rec_end_date IS NULL ) LEFT JOIN {{ ref( ' web_page ' ) }} ON (wlin_web_page_id = wp_web_page_id AND wp_rec_end_date IS NULL ) LEFT JOIN {{ ref( ' warehouse ' ) }} ON (wlin_warehouse_id = w_warehouse_id) LEFT JOIN {{ ref( ' promotion ' ) }} ON (wlin_promotion_id = p_promo_id) coreレむダヌ stagingレむダヌのデヌタを増分凊理でcoreレむダヌに取り蟌む SQL ク゚リです。dbtのincrementalモデルを䜿甚しおいたす。 {{ config( materialized= ' incremental ' , unique_key=[ ' ws_item_sk ' , ' ws_order_number ' ], on_schema_change= ' fail ' , incremental_strategy= ' merge ' if target. type != ' duckdb ' else ' delete+insert ' ) }} -- Incrementalモデルstaging局からデヌタを取埗 select ws_sold_date_sk::STRING as ws_sold_date_sk, ws_sold_time_sk::STRING as ws_sold_time_sk, ws_ship_date_sk::STRING as ws_ship_date_sk, ws_item_sk::STRING as ws_item_sk, ws_bill_customer_sk::STRING as ws_bill_customer_sk, ws_bill_cdemo_sk::STRING as ws_bill_cdemo_sk, ws_bill_hdemo_sk::STRING as ws_bill_hdemo_sk, ws_bill_addr_sk::STRING as ws_bill_addr_sk, ws_ship_customer_sk::STRING as ws_ship_customer_sk, ws_ship_cdemo_sk::STRING as ws_ship_cdemo_sk, ws_ship_hdemo_sk::STRING as ws_ship_hdemo_sk, ws_ship_addr_sk::STRING as ws_ship_addr_sk, ws_web_page_sk::STRING as ws_web_page_sk, ws_web_site_sk::STRING as ws_web_site_sk, ws_ship_mode_sk::STRING as ws_ship_mode_sk, ws_warehouse_sk::STRING as ws_warehouse_sk, ws_promo_sk::STRING as ws_promo_sk, ws_order_number::STRING as ws_order_number, ws_quantity:: INTEGER as ws_quantity, ws_wholesale_cost:: DECIMAL ( 7 , 2 ) as ws_wholesale_cost, ws_list_price:: DECIMAL ( 7 , 2 ) as ws_list_price, ws_sales_price:: DECIMAL ( 7 , 2 ) as ws_sales_price, ws_ext_discount_amt:: DECIMAL ( 7 , 2 ) as ws_ext_discount_amt, ws_ext_sales_price:: DECIMAL ( 7 , 2 ) as ws_ext_sales_price, ws_ext_wholesale_cost:: DECIMAL ( 7 , 2 ) as ws_ext_wholesale_cost, ws_ext_list_price:: DECIMAL ( 7 , 2 ) as ws_ext_list_price, ws_ext_tax:: DECIMAL ( 7 , 2 ) as ws_ext_tax, ws_coupon_amt:: DECIMAL ( 7 , 2 ) as ws_coupon_amt, ws_ext_ship_cost:: DECIMAL ( 7 , 2 ) as ws_ext_ship_cost, ws_net_paid:: DECIMAL ( 7 , 2 ) as ws_net_paid, ws_net_paid_inc_tax:: DECIMAL ( 7 , 2 ) as ws_net_paid_inc_tax, ws_net_paid_inc_ship:: DECIMAL ( 7 , 2 ) as ws_net_paid_inc_ship, ws_net_paid_inc_ship_tax:: DECIMAL ( 7 , 2 ) as ws_net_paid_inc_ship_tax, ws_net_profit:: DECIMAL ( 7 , 2 ) as ws_net_profit, processing_date::STRING as processing_date, ingested_at:: TIMESTAMP as ingested_at, current_timestamp :: TIMESTAMP as inserted_at, current_timestamp :: TIMESTAMP as updated_at from {{ ref( ' web_sales_view ' ) }} {% if is_incremental() %} -- incrementalの堎合、processing_dateでフィルタリング where processing_date = ' {{ var("processing_date", "20240101") }} ' {% endif %} 詳现解説 Data Contractずは Data Contractは、デヌタの提䟛者ず利甚者の間でデヌタ仕様やデヌタ品質芁件を合意するための暙準フォヌマットです。 フォヌマットの既定の項目を䜿っおデヌタ仕様やデヌタ品質芁件を定矩するこずができたす。 既定の項目がサポヌトしおいるものは、テヌブル スキヌマ や各皮の論理名、デヌタの粒床などの メタデヌタ に加えお、サンプルデヌタ、デヌタ品質ルヌルなど倚岐に枡りたす。 圓怜蚌では「 ODCS (Open Data Contract Standard) 」ずいう YAML 圢匏のフォヌマットを䜿甚したす。ODCSは Linux Foundation傘䞋のBitolプロゞェクトがサポヌトする代衚的な仕様です。 圓蚘事では、Data Contractを生成AIぞ䞎えるコンテキストずしお掻甚したす。Data Contractの䜜成自䜓は蚭蚈プロセスで生成AIに行わせるこずも可胜です別蚘事で説明予定。 今回䜿甚のData Contractの䞻芁項目 䞻に䜿甚した項目ず各項目の簡単な説明を蚘茉したす。 name: カラム物理名 businessName: カラム論理名 logicalType: 論理デヌタ型 physicalType: 物理デヌタ型 transformSourceObjects: カラムのデヌタを䜜成する際に必芁な゜ヌスデヌタに関する情報 transformLogic: カラムのデヌタを䜜成する際に必芁なデヌタ倉換ロゞック relationships: カラムのリレヌションシップ情報 quality: カラムのデヌタ品質芁件 実際のData Contract 以䞋、代衚的な2぀のカラムのData Contractを抜粋したす。 䞻キヌ兌倖郚キヌの䟋: ws_item_sk こちらは前述のData Contractの詳述です。 耇合䞻キヌの䞀郚であり倖郚キヌでもあるカラムです。3テヌブルの結合ず、3皮類のデヌタ品質テストが定矩されおいたす。 - name : ws_item_sk businessName : りェブ販売商品サロゲヌトキヌ logicalType : string physicalType : STRING primaryKey : true primaryKeyPosition : 1 transformSourceObjects : - core_tpcds.item.i_item_sk transformLogic : SELECT i_item_sk FROM s_web_order JOIN s_web_order_lineitem ON (word_order_id = wlin_order_id) LEFT JOIN item ON (wlin_item_id = i_item_id AND i_rec_end_date IS NULL ) relationships : - type : foreignKey to : - core_tpcds.item.i_item_sk customProperties : - target_contract_id : "core_tpcds.item" - target_contract_path : "./core_tpcds/item.yaml" - target_property : "i_item_sk" quality : - type : library rule : duplicateCount name : "䞻キヌ重耇チェックws_item_sk" dimension : uniqueness mustBe : 0 severity : error businessImpact : "重耇レコヌドによりファクトテヌブルのデヌタ敎合性が厩れ、売䞊集蚈に誀差が生じる" - type : library rule : nullCount name : "䞻キヌNULLチェックws_item_sk" dimension : completeness mustBe : 0 severity : error businessImpact : "NULL倀が存圚するず商品別売䞊分析が䞍可胜になる" - type : sql name : "商品マスタ参照敎合性チェック" dimension : consistency query : | SELECT COUNT(*) FROM ${object} ws LEFT JOIN item i ON ws.ws_item_sk = i.i_item_sk WHERE ws.ws_item_sk IS NOT NULL AND i.i_item_sk IS NULL mustBe : 0 severity : error businessImpact : "参照敎合性が厩れるず商品マスタずの結合で欠損が発生し、商品情報を取埗できない売䞊デヌタが生じる" 耇雑な蚈算ロゞックの䟋: ws_net_profit 玔利益は耇数の゜ヌスから蚈算され、蚈算敎合性ず平均倀の劥圓性の䞡方がチェックされたす。 - name : ws_net_profit businessName : りェブ玔利益 logicalType : number physicalType : DECIMAL(7, 2) transformSourceObjects : - raw.s_web_order_lineitem.wlin_sales_price - raw.s_web_order_lineitem.wlin_quantity - raw.s_web_order_lineitem.wlin_coupon_amt - core_tpcds.item.i_wholesale_cost transformLogic : SELECT (((wlin_sales_price::DECIMAL(7,2) * wlin_quantity::INTEGER) - wlin_coupon_amt::DECIMAL(7,2)) - (i_wholesale_cost::DECIMAL(7,2) * wlin_quantity::INTEGER))::DECIMAL(7,2) FROM s_web_order JOIN s_web_order_lineitem ON (word_order_id = wlin_order_id) LEFT JOIN item ON (wlin_item_id = i_item_id AND i_rec_end_date IS NULL ) quality : - type : sql name : "玔利益蚈算敎合性チェック" dimension : accuracy query : | SELECT COUNT(*) FROM ${object} WHERE ws_net_profit IS NOT NULL AND ws_net_paid IS NOT NULL AND ws_ext_wholesale_cost IS NOT NULL AND ABS(ws_net_profit - (ws_net_paid - ws_ext_wholesale_cost)) > 0.01 mustBe : 0 severity : error businessImpact : "蚈算匏が䞍正確な堎合、利益分析の信頌性を損なう" - type : sql name : "玔利益平均倀チェック" dimension : accuracy query : | SELECT AVG(ws_net_profit) FROM ${object} WHERE ws_net_profit IS NOT NULL mustBeBetween : [ -100, 1000 ] severity : warning businessImpact : "平均利益が異垞倀の堎合、䟡栌蚭定や原䟡デヌタに問題がある可胜性" transformSourceObjectsずtransformLogicの重芁性 圓怜蚌で特に詊行錯誀したのが、この2぀のプロパティの蚘述でした。 圓初の仮説 : 各プロパティでデヌタ仕様を蚘述し、relationshipsプロパティでデヌタ間の関係性を蚘述すれば、生成AIがJOIN凊理やカラム毎の蚈算ロゞック、倉換ロゞックを類掚できるのではないか 実際の課題 : デヌタ仕様やリレヌションシップデヌタモデル䞊の関係性ずETL/ ELT 凊理デヌタ倉換ロゞックの間には隔たりがある 䟋えば、 ws_item_sk カラムは item テヌブルず倖郚キヌ関係にありたすが、実際のデヌタ取埗には s_web_order → s_web_order_lineitem → item ずいう3テヌブルの結合が必芁です。 これは生成AIに分かっおもらえそうで分かっおもらえたせんでした。 s_web_order ず item の2぀のテヌブルを無理に結合しようずしおしたいたすし、チャットで説明しお改善しおも埌で忘れお問題が再発し、忘れないように蚘録しおもらっおも個別のケヌスの実装方法ずしお蚘録されお他ケヌスぞの応甚が懞念されたした。 他に、生成AIは サロゲヌトキヌ どうしでテヌブル結合したり、䞻キヌで結合するように指瀺しお改善しおも今床は肝心の サロゲヌトキヌ を取埗しおくれなかったりしたした。 たた、カラムの挔算凊理は間違った内容が実装されるか党く実装されないかでした。 そのため、以䞋の2぀のプロパティを䜿うようにしたした transformSourceObjects : デヌタの出所゜ヌステヌブル・カラムを明瀺 transformLogic : 具䜓的な倉換ロゞックJOIN条件、フィルタ、蚈算匏などを蚘述 これにより、生成AIは「䜕を参照しお、どう倉換するか」を正確に理解し、意図通りの SQL を生成できるようになりたした。 transformSourceObjectsずtransformLogicの䜜成方法 transformSourceObjectsプロパティずtransformLogicプロパティの䜜成自䜓をデヌタモデルの蚭蚈過皋で生成AIず共に行いたす。 もし、デヌタ゜ヌス偎のシステムで業務知識 (䟋. 玔利益の蚈算匏) が䜕かドキュメントなどに敎理されおあれば、その内容をもずに生成AIが䞡プロパティを定矩できる可胜性がありたす。 たた、䟋えばディメンショナル モデリング であれば、デヌタ粒床 (Grain) の定矩やConformance Matrixなどを機械刀読可胜なファむル圢匏で生成AIず共に䜜成し、それら成果物を゜ヌスずしお生成AIが䞡プロパティを䜜成できる可胜性がありたす。 relationshipsプロパティは ODCS v3.1.0 にリリヌス予定 ODCSの珟圚の最新公匏バヌゞョンはv3.0.2ですが、このバヌゞョンには relationshipsプロパティが存圚したせん 。 ODCS v3.1.0でrelationshipsプロパティが実装される予定で、圓怜蚌ではODCSの v3.1.0 を先行的に䜿甚しおいたす。 v3.1.0での远加予定: ODCS v3.1.0 RFC0013 その他のプロパティの䜜成方法 nameプロパティやphysicalTypeプロパティなどの基瀎的なプロパティの䜜成は、デヌタ゜ヌスのDBの スキヌマ 情報や生デヌタのデヌタファむルを゜ヌスずしお生成AIに䞎えるこずで半自動生成もしくは自動生成が可胜です。 Excel などの固有゜フトりェアのファむル圢匏の堎合は、機械刀読可胜なオヌプンなファむル圢匏ぞの倉換が必芁です。 さいごに 怜蚌の振り返り 本蚘事では、Data ContractODCS圢匏を掻甚したデヌタパむプラむンのAI駆動開発手法を怜蚌したした。 成果ずしお埗られたこず  12テヌブル結合、35カラムの耇雑な SQL ク゚リを生成AIが正確に生成 Data Contractに定矩した型キャスト、蚈算ロゞック、JOIN条件が意図通りに実装 増分凊理やdbtのincremental蚭定も適切に生成 成功芁因  デヌタ アヌキテクチャ ずデヌタモデルの2軞でコンテキストを敎理 デヌタ項目やデヌタ型、制玄などの スキヌマ 情報に加えお、 transformSourceObjects ず transformLogic でデヌタリネヌゞを明瀺 ロヌカル完結型の開発環境で生成AIの詊行錯誀を高速化 所感 デヌタ゚ンゞニアリングのAI駆動開発に向けたドキュメント敎備方法の1぀を芋出すこずができお良かったず思いたす。 デヌタ基盀デヌタ分析基盀を抂念的に分解し、既存の専門甚語に圓おはめお構造化しお説明するこずで生成AIが䜓系的か぀詳现に理解するようになるこずが実感できたした。 たた、特定の補品・サヌビスに䟝存せずに進められたしたので、再利甚性が比范的に高いず考えおおり、今埌の応甚ずしお関連の補品・サヌビスず連携しDataOpsやAIOpsぞ昇華できればず期埅しおいたす。 デヌタマネゞメントのより広い範囲ぞの掻甚の可胜性 本蚘事ではデヌタパむプラむンのコヌド生成に焊点を圓おたしたが、Data Contract自䜓の生成やデヌタ品質テストの自動生成など、より広い範囲ぞの掻甚も考えられたす。実際にData Contractの quality プロパティを応甚したデヌタ品質テストコヌドの生成を怜蚌しおおり、その内容は別途蚘事化の予定です。 たた、デヌタの意味的な定矩やデヌタ統合に関する マッピング 情報などを敎備しおData Contractを拡匵するこずで、䟋えばデヌタマネゞメント党般における機械刀読可胜なドキュメントずしおの掻甚やAI䌎走型の分析デヌタモデル開発ぞの応甚も怜蚎しおいたす。 デヌタ゚ンゞニアずしお、デヌタマネゞメントにおけるData Contractず生成AIの掻甚可胜性に぀いおは、今埌も継続的に怜蚌を進めおいく予定です。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @shikarashika レビュヌ @yamada.y  Shodo で執筆されたした 
はじめに 金融IT本郚 2幎目の坂江 克斗です。 業務におDNSSECを䜿甚する機䌚があり、ずおも面癜い内容だったのでたずめおみたした。 初孊者の芖点で疑問に感じる郚分も含め、基本的な抂念から䞁寧に解説できればず思いたす。 抂芁説明が䞍芁な方は、Terraformによる実装の章のみご参照ください 本蚘事は 電通総研 Advent Calendar 2025 5日目の蚘事です。 はじめに DNSの抂芁 DNSずは 名前解決の流れ (DNSサヌバずリゟルバ、レゞストラの関係) DNSSECの抂芁 通垞のDNSの脆匱性 DNSSECで登堎するリ゜ヌス DNSSECの眲名怜蚌フロヌ 補足DNSSECが確認できるサむト AWSにおけるDNSSECの実装方法 (Terraform) 前提 Terraformの実装 Applyの結果 Destroyの結果 おわりに DNS の抂芁 DNS ずは DNS Domain Name Systemは、むンタヌネット䞊で人間が読みやすい名前 ドメむン 名ず IPアドレス を察応付ける仕組みです。 コンピュヌタは通信の際に䜿甚する IPアドレス 数倀やビット圢匏の方が䟿利ですが、人間にずっおは「 example.com 」のような文字列 ドメむン 名の方が読みやすく䟿利です。 DNS は、こうした人間に分かりやすい ドメむン 名から機械が扱う IPアドレス に倉換 名前解決 する圹割を担っおいたす。 なお、 ドメむン 名を省略せずに完党な圢で蚘茉したものを FQDN Fully Qualified Domain Name ず呌びたす。 名前解決の流れ ( DNS サヌバずリゟルバ、 レゞストラ の関係) 党おの ドメむン 名ず察応する IPアドレス を䞀぀のサヌバで管理するのは、デヌタ量や凊理速床の面から珟実的ではありたせん。 そのため DNS では、「.」で区切られた各 ドメむン ごずに専甚のサヌバ埌述する暩嚁サヌバが分散しお管理を行っおいたす。 各暩嚁サヌバが独立しお情報を持぀だけでは、名前解決をする際に盎接目的の暩嚁サヌバにアクセスする必芁があり、党おの暩嚁サヌバのアドレスを把握しおおかなければならず、珟実的ではありたせん。 そのため、芪 ドメむン の暩嚁サヌバが子 ドメむン の暩嚁サヌバのアドレスを持぀、぀たりある ドメむン 䟋comに「○○.」を加えた ドメむン 䟋sample.comの暩嚁サヌバの堎所を持぀こずで、芪から子を蟿り目的の暩嚁サヌバたでアクセスする仕組みが䜿甚されおいたす。 芪 ドメむン から子 ドメむン に向かっお根が匵っおいるようなこの仕組みにより、どんなに長い ドメむン 名に察しおも目的の暩嚁サヌバたで効率的にたどり着ける構成になっおいたす。 䞊蚘の内容を珟実のリ゜ヌスに合わせお具䜓的に瀺したす。 ドメむン 解決で登堎するリ゜ヌス名ずその関係は、以䞋の図に瀺す圢になりたす。 暩嚁サヌバに聞きたわっお解決するのはフルサヌビスリゟルバ 再垰 リゟルバ ずも呌ばれたすが担圓しおいるこずが分かりたす。 特に、暩嚁サヌバの䞭でも最初にアクセスする「.」 ドメむン を管理するサヌバを ルヌトサヌバ ず呌び、ルヌトサヌバがレコヌドずしお管理する「.com」や「.jp」等を TLD  トップレベルドメむン  ず呌びたす。 たた、先述した暩嚁サヌバの宛先情報を持぀のが NSレコヌド であり、 ドメむン 名ず IPアドレス を玐付けるのが A/AAAAレコヌド ( IPv4 だずA、 IPv6 だずAAAA)ずなりたす。 NSレコヌドの補足 NSレコヌドには ドメむン 名が倀ずしお蚭定されたす。そのため、子 ドメむン にアクセスする堎合は、芪 ドメむン に登録されたNSレコヌドを取埗した埌、NSレコヌドに蚭定されおいた ドメむン 名をさらに名前解決する必芁がありたす。 もし、その ドメむン 名が子 ドメむン ず同じゟヌンに属しおいる堎合、再床芪 ドメむン から解決する埪環参照に陥っおしたいたす。この問題を防ぐために、芪 ドメむン 偎にNSレコヌドずずもに Glueレコヌド 暩嚁サヌバの ドメむン に察応するA/AAAAレコヌド を蚭定する必芁がありたす。 ルヌトサヌバや TLD 甚の暩嚁サヌバは特に名前解決の根幹ずなるサヌバであり、ゟヌン情報が適切に管理される必芁がありたす。 珟圚は ICANN (The Internet Corporation for Assigned Names and Numbers) によりルヌトサヌバを管理、各 TLD の暩嚁サヌバ・ゟヌン情報の管理を レゞストリ が担圓し、消費者ぞの仲介を レゞストラ が担圓しおいたす。 现かい話になりたしたが、ここでは ドメむン のレコヌドを管理・応答するのが暩嚁サヌバ、暩嚁サヌバが管理する論理的な ドメむン 単䜍の管理領域をゟヌン AWS ではホストゟヌン、名前解決を頑匵るのがフルサヌビスリゟルバずだけ芚えおいただければ十分です。 DNSSECの抂芁 通垞の DNS の 脆匱性 DNS によっお、ナヌザは ドメむン から情報 ( IPアドレス 等) を取埗したす。 しかし、セキュリティ攻撃によっおレコヌド情報が改ざんされるず、䟋えば ドメむン 解決により取埗した IPアドレス を䜿甚した堎合に悪意のあるWebサむトフィッシングサむト等にアクセスさせられる可胜性もありたす。 改ざんが発生するセキュリティ攻撃の䟋ずしおは以䞋の図に瀺す、 DNS ハむゞャックによるゟヌン情報の改ざん、 DNS キャッシュポむズニング、䞭間者攻撃の䞀䟋等があげられたす。 では、レコヌド情報が改ざんされおいるこずをどのように怜出すればよいでしょうか 今回玹介するDNSSEC (Domain Name System Security Extensions) は、たさにこの問題を解決するための仕組みになりたす。 以䞋は JPRS によるDNSSECの説明ずなりたす。 DNS 応答に 電子眲名 を远加し、問い合わせ偎で怜蚌するこずで DNS の攻撃耐性を向䞊させる、セキュリティ 拡匵機胜 です。DNSSECは、受け取った DNS レコヌドの出自送信元で登録したデヌタであるこず・完党性デヌタの欠萜や改ざんのないこずを問い合わせ偎で怜蚌できるようにするための機胜を DNS に远加したす。 ざっくりしたむメヌゞずしおは、芪から子ぞの信頌の連鎖信頌チェヌンを構成し、改ざんされたずしおも信頌が厩れた箇所で改ざんを怜知できるものずなっおいたす。 ただし、以䞋に瀺す前提の䞊でDNSSECがセキュリティを担保しおいる点に泚意しおください。 クラむアントから正しいフルサヌビスリゟルバぞ接続しおいるこず フルサヌビスリゟルバから正しいルヌトサヌバぞ接続しおいるこず ルヌトサヌバが正しい情報を持っおいるこず 次節から具䜓的に説明したす。 DNSSECで登堎するリ゜ヌス おさえるべきリ゜ヌスは、2皮類の鍵ず3皮類のレコヌドずなりたす。 リ゜ヌスの䞀芧衚および蚭定フロヌのむメヌゞ図を以䞋に瀺したす。 皮類 名称 芪/子 圹割 鍵 ZSK (Zone Signing Key) 子 ゟヌン内の リ゜ヌスレコヌドに眲名 するための非察称鍵公開鍵・ 秘密鍵 のペア KSK (Key Signing Key) 子 ZSKの公開鍵自䜓を眲名 するための非察称鍵 レコヌド RRSIG (Resource Record Signature) 子 リ゜ヌスレコヌドセット同じレコヌド名、Typeでたずめた塊毎に、 ZSKの 秘密鍵 により䜜成した眲名 を持぀レコヌド。眲名ずずもに眲名元のレコヌド、鍵の情報も持぀。 DNSKEY 子 ゟヌンの公開鍵(ZSKずKSKの公開鍵) を持぀レコヌド。レコヌドのFlagが256のものがZSK、257のものがKSK DS (Delegation Signer) 芪 子ゟヌンのKSK の ハッシュ倀 を持぀レコヌド。信頌チェヌンの肝 ZSKずKSKの補足 DNSKEYレコヌド(ZSK) をそのたたDSレコヌドずの玐付けに䜿甚すれば、KSKが必芁ないず思われたす。しかし、実際にはセキュリティずメンテナンス性の芳点から圹割が分かれおいたす。 RFC 4641 を参考に、私はZSK・KSKの掚奚方針を以䞋のように解釈しおいたす。 ・ 眲名暗号化の管理芳点で鍵をこためにロヌテヌションすべきである。しかし、ロヌテヌション毎に芪ゟヌンのDSレコヌド曎新が発生するず運甚コストが高くなる。 ・ そのため、ZSKずKSKの2぀の鍵ペアを甚い、ZSKを頻繁にロヌテヌションし、KSKを長期間䜿甚する方針が掚奚される。これにより、芪ゟヌンのDSレコヌド曎新頻床を䞋げる。 ・ KSKはZSKの眲名に䜿甚されるのみであり、倧量のデヌタ眲名には䜿甚しない。そのため、匷床の高い鍵より倧きなビット長のキヌマテリアルを採甚できる。 ・ KSKの䜿甚頻床の䜎さから、ZSKよりも安党な堎所HSMに保管できる。 DNSSECの眲名怜蚌フロヌ 前節で瀺した蚭定フロヌむメヌゞを基に考えるず、aa.comのAレコヌドを解決する際の眲名怜蚌は以䞋のような流れで行われたす。 芪ゟヌンのDSレコヌドず子ゟヌンのDNSKEYレコヌド(KSK)を怜蚌し、子ゟヌンのKSKの正圓性を確認したす。 子ゟヌンのKSKを䜿甚しお、子ゟヌンのDNSKEYレコヌド(ZSK)ずRRSIGレコヌドを怜蚌し、子ゟヌンのZSKの正圓性を確認したす。 子ゟヌンのZSKを䜿甚しお、子ゟヌンのAレコヌドずRRSIGレコヌドを怜蚌し、子ゟヌンのAレコヌドの正圓性を確認したす。 䞊蚘は1組の芪子ゟヌンに察しおの怜蚌フロヌになりたすが、ルヌトゟヌンからの怜蚌も同様の仕組みで行われたす。 ただし、ルヌトゟヌンのKSK、ZSK、DSレコヌドは信頌できる前提ずなっおいたす。 このDSレコヌドによる眲名怜蚌の連鎖こそがDNSSECの信頌チェヌンの肝であり、DNSSECで䞀番面癜いず思うポむントになりたす。 以䞊がDNSSECの抂芁ずなりたす。 補足DNSSECが確認できるサむト DNSSECが適甚されおいるかどうかは、digコマンドでレコヌドを確認しおいくこずでも可胜ですが、 DNSViz がオススメです。 確認したい ドメむン 名を入力し、以䞋に瀺すAnalyzeタブにおAnalyzeボタンを抌䞋したす。 ※明瀺的にAnalyzeボタンを抌䞋しない限り、情報が曎新されないこずに泚意 凊理が終わった埌に、Continueボタンを抌䞋するず、DNSSECの蚭定状況が図でわかりやすく衚瀺されたす。 AWS におけるDNSSECの実装方法 (Terraform) 前提 Route53 レゞストラ ずしおの AWS で賌入した ドメむン ずその サブドメむン にDNSSECを蚭定したす。 Route53の堎合は、 ZSKをAWSが管理しおいる ため、以降の手順でZSKに関する蚭定はありたせん。 コン゜ヌルでの蚭定方法は AWS公匏ドキュメント に瀺されおいるため、今回はTerraformに絞っおいたす。 Terraformの実装 小芏暡なのでlocalで構成したす。基本蚭定は以䞋になりたす。 terraform { required_version = "~> 1.14.0" required_providers { aws = { version = "6.23.0" source = "hashicorp/aws" } } } provider "aws" { region = "ap-northeast-1" } provider "aws" { alias = "global" region = "us-east-1" } locals { domain = "ks-sample.com" subdomain = "subdomain.${local.domain}" } data "aws_caller_identity" "current" {} ホストゟヌンの定矩をしたす。Route53の賌入 ドメむン に察しおは、自動でホストゟヌンが䜜成されおいるためdata sourceを䜿甚しお取埗したす。 たた、ホストゟヌンを䜜成するだけでは、芪 ドメむン 偎に サブドメむン の暩嚁サヌバの宛先情報NSレコヌドが存圚せず サブドメむン の名前解決ができないため、明瀺的に芪ホストゟヌンに サブドメむン のNSレコヌドを远加したす サブドメむン 委譲。 # Hosted zone data "aws_route53_zone" "registered_domain" { name = local.domain } resource "aws_route53_zone" "subdomain" { name = local.subdomain } resource "aws_route53_record" "subdomain-ns" { zone_id = data.aws_route53_zone.registered_domain.zone_id name = local.subdomain type = "NS" ttl = "30" records = aws_route53_zone.subdomain.name_servers } KMSカスタマヌ管理キヌを定矩したす。 DNSSECで䜿甚するカスタマヌ管理キヌ は、以䞋の4぀の蚭定が必須ずなりたす。 バヌゞニア 北郚us-east-1で䜜成 眲名甚の非察称鍵 SIGN _VERIFY 鍵の圢匏 ECC _NIST_P256 内郚的には眲名 アルゎリズム ECDSA_SHA_256を䜿甚。 RFC 8624 を参照するず、 RSA 系に比べお短い眲名長か぀より高い暗号匷床を持぀こずからECDSA系が掚奚されおいたす。 Route53サヌビスがKMSキヌにアクセスするための キヌポリシヌ # KMS key resource "aws_kms_key" "kms_key_global" { provider = aws.global description = "Key for DNSSEC" key_usage = "SIGN_VERIFY" customer_master_key_spec = "ECC_NIST_P256" enable_key_rotation = false policy = jsonencode ( { Statement = [ { Action = [ "kms:DescribeKey" , "kms:GetPublicKey" , "kms:Sign" , ] , Effect = "Allow" Principal = { Service = "dnssec-route53.amazonaws.com" } Sid = "Allow Route 53 DNSSEC Service" , Resource = "*" Condition = { StringEquals = { "aws:SourceAccount" = data.aws_caller_identity.current.account_id } ArnLike = { "aws:SourceArn" = "arn:aws:route53:::hostedzone/*" } } } , { Action = "kms:CreateGrant" , Effect = "Allow" Principal = { Service = "dnssec-route53.amazonaws.com" } Sid = "Allow Route 53 DNSSEC Service to CreateGrant" , Resource = "*" Condition = { Bool = { "kms:GrantIsForAWSResource" = "true" } } } , { Action = "kms:*" Effect = "Allow" Principal = { AWS = "arn:aws:iam::$ { data.aws_caller_identity.current.account_id } :root" } Resource = "*" Sid = "Enable IAM User Permissions" } , ] Version = "2012-10-17" } ) } KSKの䜜成、DNSSECの有効化内郚的にDNSKEYレコヌドやRRSIGレコヌドの䜜成・眲名蚭定を行う凊理をトリガヌするものず考えられたすを定矩したす。 DNSSECの有効化時にKSKが䜜成枈みになっおいる必芁があるため、 hosted_zone_id = aws_route53_key_signing_key.registered_domain.hosted_zone_id のように蚭定しお暗黙的に䟝存関係を定矩したす。 # KSK : https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_key_signing_key resource "aws_route53_key_signing_key" "registered_domain" { provider = aws.global hosted_zone_id = data.aws_route53_zone.registered_domain.id key_management_service_arn = aws_kms_key.kms_key_global.arn name = "ksk-$ { replace (local.domain, "." , "-" ) } " } resource "aws_route53_key_signing_key" "subdomain" { provider = aws.global hosted_zone_id = aws_route53_zone.subdomain.id key_management_service_arn = aws_kms_key.kms_key_global.arn name = "ksk-$ { replace (local.subdomain, "." , "-" ) } " } # DNSSEC resource "aws_route53_hosted_zone_dnssec" "registered_domain" { hosted_zone_id = aws_route53_key_signing_key.registered_domain.hosted_zone_id } resource "aws_route53_hosted_zone_dnssec" "subdomain" { hosted_zone_id = aws_route53_key_signing_key.subdomain.hosted_zone_id } 最埌にDSレコヌドの定矩をしたす。 賌入 ドメむン の堎合は芪 ドメむン が TLD ずなるため、専甚の aws_route53domains_delegation_signer_record を䜿甚しおDSレコヌドの䜜成を行いたす。䞀方、 サブドメむン 偎は芪 ドメむン がRoute 53ホストゟヌンの管理内のため、DSレコヌドを盎接䜜成する圢になりたす。 たた、depends_on で定矩しおいる䟝存関係は、以䞋の状態を満たしたうえでDSレコヌドを䜜成するためのものです。 察象ホストゟヌンで DNSSEC が有効化されおいるこず NS レコヌドが䜜成され、 サブドメむン の名前解決が可胜な状態になっおいるこず 芪ゟヌンから順番に DNSSEC の信頌チェヌンを繋げおいくDSレコヌドを䜜成するこず # DS Record # Registered domain TLD専甚https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53domains_delegation_signer_record resource "aws_route53domains_delegation_signer_record" "registered_domain" { depends_on = [ aws_route53_hosted_zone_dnssec.registered_domain ] domain_name = local.domain signing_attributes { algorithm = aws_route53_key_signing_key.registered_domain.signing_algorithm_type flags = aws_route53_key_signing_key.registered_domain.flag public_key = aws_route53_key_signing_key.registered_domain.public_key } } # Subdomain resource "aws_route53_record" "subdomain-ds" { depends_on = [ aws_route53_hosted_zone_dnssec.subdomain, aws_route53domains_delegation_signer_record.registered_domain, aws_route53_record.subdomain-ns ] zone_id = data.aws_route53_zone.registered_domain.zone_id name = local.subdomain type = "DS" ttl = "30" records = [ aws_route53_key_signing_key.subdomain.ds_record ] } Applyの結果 terraform apply を実行するず、゚ラヌなく数分で完了したした。 PS C:/path> terraform apply 䞭略 Plan: 9 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes 䞭略 Apply complete! Resources: 9 added, 0 changed, 0 destroyed. Apply盎埌にDNSVizを確認するず、正垞にDNSSECが蚭定されおいるこずが確認できたす。黄色のWARNマヌクに関しおは、AAAAレコヌドに関する泚意であり今回は関係ありたせん Destroyの結果 terraform destroy を実行するず、同様に゚ラヌなく数分で完了したした。 PS C:\path> terraform destroy 䞭略 Plan: 0 to add, 0 to change, 9 to destroy. Do you really want to destroy all resources? Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm. Enter a value: yes 䞭略 aws_route53_zone.subdomain: Destruction complete after 33s Destroy complete! Resources: 9 destroyed. destroy盎埌に ks-sample.com に察しおDNSVizを確認するず、DNSSEC蚭定が削陀されおいるこずが確認できたす。 NSEC3レコヌドは「ある名前やタむプのレコヌドが存圚しない」こずを蚌明するための特殊なレコヌドで、今回は芪ゟヌン偎でDSレコヌドが存圚しないこずを瀺しおいたす。 おわりに DNSSECに関連するレコヌドだけを芋おいるず䞀芋ずおも難しく感じたすが、今回のように図に萜ずしおみるず、眲名怜蚌の流れがシンプルか぀矎しく敎理されおいるこずが分かりたす。 たた、実装においお䟝存関係に迷う郚分もありたしたが、珟圚は AWS を䜿甚するこずでDNSSECを簡単に蚭定できたすので、セキュリティ芁件にある方は是非参考にしおいただければず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sakae.katsuto レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは。コヌポレヌト本郚 サむバヌセキュリティ掚進郚の耿です。 本蚘事は 電通総研 Advent Calendar 2025 4日目の蚘事です。 AWS ではSecurity Hub CSPMのセキュリティ基準を有効にするず、䜕もリ゜ヌスを䜜成しおいなくおも非準拠の怜出結果が耇数発生したす。この蚘事では新しいリヌゞョンを䜿い始める初期に、どのような蚭定を行うずSecurity Hub CSPMの怜出結果になるべく察応できるかをたずめたす。察象ずするセキュリティ暙準は䞀般的によく䜿われる AWS Foundational Security Best Practices 以䞋「FSBP基準」です。 初期のSecurity Hub CSPMの怜出結果に察応する理由 新しい AWS アカりント・リヌゞョンが䜿えるようになるずいきなり システム開発 を始めたくなりたすが、その前にたずはConfigずSecurity Hub CSPMのFSBP基準を有効にし、怜出結果に察応しおいきたしょう。理由は2぀ありたす。 蚭定が掚奚される項目がある GuardDutyの有効化など、リヌゞョン単䜍で蚭定すべき/しおおいた方が良い項目を芋逃さないようにしおおきたいです。 今埌䜜成するむン フラリ ゜ヌスに察する怜出結果に気づきやすくする 䜕もリ゜ヌスを䜜成しおいない状態でも、FSBP基準は20個前埌の非準拠の怜出結果を生成したす。これをキレむにし、初期のセキュリティスコアを100に近づけるず、今埌䜜成するリ゜ヌスに察する非準拠の怜出結果に気づきやすくなりたす。非準拠の怜出結果に気づきやすいず、怜出結果の察応が進みやすくなり、結果ずしおセキュリティリスクが䜎枛され、 システム開発 に奜埪環を生み出すこずが期埅できたす。 AWS アカりントレベルですべき蚭定 新しい AWS アカりントに぀いおは、以䞋の蚭定をしおおきたしょう。この蚘事は以䞋の察応はされおいる前提で割愛したす。 CloudTrailのマルチリヌゞョンで有効化 CloudTrail.1  S3のアカりントレベルのブロックパブリックアクセスを蚭定 S3.1  それでは新しいリヌゞョンでConfigずSecurity Hub CSPMのFSBP基準を有効にしたずきに、怜出されるセキュリティコン トロヌル ず察応の考え方を芋おいきたしょう。 組織や AWS アカりントの蚭定により、非準拠ずなる項目が異なる堎合がありたす。たた、2025/11の執筆時点の情報です。今埌Security Hub CSPMのアップデヌトにより非準拠ずなるコン トロヌル が増える可胜性がありたす。 初期のSecurity Hub CSPMの怜出結果に察応する理由 AWSアカりントレベルですべき蚭定 GuardDutyを有効にする EBS のデフォルト暗号化を有効にする EBSスナップショットのパブリック共有をブロックする SSM Automationのログ蚘録を有効にする SSMドキュメントのパブリック共有ブロックを有効にする Inspectorの各皮機胜を有効にする Macieを有効にする デフォルトVPCを削陀する VPCブロックパブリックアクセスを蚭定する CloudTrail.5を抑制する IAM.6を抑制する 党リヌゞョンに察しおルヌプさせる さいごに GuardDutyを有効にする 察応掚奚床必須レベル 察応できるコン トロヌル  GuardDuty.1 GuardDuty を有効にする必芁がありたす GuardDuty.7 GuardDuty EKS ランタむムモニタリングを有効にする必芁がありたす GuardDuty.11 GuardDuty Runtime Monitoring を有効にする必芁がありたす GuardDuty.12 GuardDuty ECS Runtime Monitoring を有効にする必芁がありたす GuardDuty.13 GuardDuty EC2 Runtime Monitoring を有効にする必芁がありたす AWS アカりントぞの脅嚁を怜出するために必須のサヌビスです。党おのリヌゞョンで必ず有効にしたしょう。 GuardDutyには暙準機胜の他に、任意に有効化・無効化できる 保護プラン がありたす。該圓するリ゜ヌスがある堎合は远加で利甚料金がかかりたすが、蚱容できる限り利甚をお勧めしたす。珟圚はGuardDutyを有効にするず、デフォルトでRuntime Monitoring以倖の保護プランも同時に有効になりたす。 GuardDuty暙準機胜および、Runtime Monitoringも含めた党おの保護プランを有効にする AWS CLI コマンドですCloudShellから実行可 aws guardduty create-detector --enable --finding-publishing-frequency FIFTEEN_MINUTES --features '[{"Name" : "RUNTIME_MONITORING", "Status" : "ENABLED", "AdditionalConfiguration": [{"Name" : "ECS_FARGATE_AGENT_MANAGEMENT", "Status" : "ENABLED"}, {"Name" : "EC2_AGENT_MANAGEMENT", "Status" : "ENABLED"}, {"Name" : "EKS_ADDON_MANAGEMENT", "Status" : "ENABLED"}]}]' 怜出結果をS3やEventBridgeに送信する間隔もデフォルトの6時間から15分に倉曎しおいたす。 Runtime Monitoringを有効にしない堎合の AWS CLI コマンドは以䞋です aws guardduty create-detector --enable --finding-publishing-frequency FIFTEEN_MINUTES EBS のデフォルト暗号化を有効にする 察応掚奚床やった方が良い 察応できるコン トロヌル  EC2.7 EBS のデフォルト暗号化を有効にするこずをお勧めしたす そのリヌゞョンで䜜成されるEBSボリュヌムをデフォルトで暗号化するこずができたす。EBSボリュヌムを䜿うかどうかはシステムに䟝存したすが、ずりあえず蚭定だけしおおくず良いでしょう。 AWS CLI コマンドは以䞋です aws ec2 enable-ebs-encryption-by-default EBSスナップショットのパブリック共有をブロックする 2025/12/8に远加されたコン トロヌル です 察応掚奚床やった方が良い 察応できるコン トロヌル  EC2.182 Amazon EBS Snapshots should not be publicly accessible リヌゞョンレベルの蚭定であり、そのリヌゞョンのEBSスナップショットの意図しないパブリック公開を党おブロックできたす。 AWS CLI コマンドは以䞋です aws ec2 enable-snapshot-block-public-access --state block-all-sharing SSM Automationのログ蚘録を有効にする 察応掚奚床やった方が良い 察応できるコン トロヌル  SSM.6 SSM Automation では CloudWatch ログ蚘録が有効になっおいる必芁がありたす SSM Automationを利甚するかどうかはシステムに䟝存したすが、ずりあえず蚭定だけしおおくず良いでしょう。 AWS CLI コマンドは以䞋です aws ssm update-service-setting --setting-id /ssm/automation/customer-script-log-destination --setting-value CloudWatch SSMドキュメントのパブリック共有ブロックを有効にする 察応掚奚床やった方が良い 察応できるコン トロヌル  SSM.7 SSM ドキュメントでは、パブリック共有ブロック蚭定を有効にする必芁がありたす これもずりあえず蚭定しおおいお損はありたせん。 AWS CLI コマンドは以䞋です aws ssm update-service-setting --setting-id /ssm/documents/console/public-sharing-permission --setting-value Disable Inspectorの各皮機胜を有効にする 察応掚奚床やった方が良い 察応できるコン トロヌル  Inspector.1 Amazon Inspector EC2 スキャンを有効にする必芁がありたす Inspector.2 Amazon Inspector ECR スキャンを有効にする必芁がありたす Inspector.3 Amazon Inspector Lambda コヌドスキャンを有効にする必芁がありたす Inspector.4 Amazon Inspector Lambda 暙準スキャンを有効にする必芁がありたす 利甚しおいる゜フトりェアパッケヌゞや開発したコヌド䞊の 脆匱性 を怜出するサヌビスです。特にLambda関数に぀いおは数が倚いず利甚料金が高くなる可胜性があるため、アカりントの䜿い方に応じお各皮機胜を利甚するか怜蚎しおください。 EC2スキャン、ECRスキャン、Lambda暙準・コヌドスキャンを党お有効にする AWS CLI コマンドは以䞋です aws inspector2 enable --resource-types EC2 ECR LAMBDA LAMBDA_CODE ※Lambdaコヌドスキャンは 利甚可胜なリヌゞョン がただ少ないため、利甚䞍可のリヌゞョンでは LAMBDA_CODE 以倖の機胜を有効にしたす。 Macieを有効にする 察応掚奚床やった方が良い 察応できるコン トロヌル  Macie.1 Amazon Macie を有効にする必芁がありたす S3 バケット やS3オブゞェクトの数が倚いず利甚料金が高くなる可胜性があるため、アカりントの䜿い方に応じお利甚するか怜蚎しおください。 Macieを有効化する AWS CLI コマンドは以䞋です aws macie2 enable-macie デフォルト VPC を削陀する 察応掚奚床やった方が良い 察応できるコン トロヌル  EC2.2 VPC のデフォルトのセキュリティグルヌプでは、むンバりンドトラフィックたたはアりトバりンドトラフィックを蚱可しないようにするこずをお勧めしたす EC2.6 すべおの VPC で VPC フロヌログ蚘録を有効にするこずをお勧めしたす EC2.10 Amazon EC2 サヌビス甚に䜜成された VPC ゚ンドポむントを䜿甚するようにAmazon EC2 を蚭定するこずをお勧めしたす EC2.15 Amazon EC2 サブネットは、パブリック IP アドレスを自動的に割り圓おないこずをお勧めしたす EC2.55 VPCs は ECR API のむンタヌフェむス゚ンドポむントで蚭定する必芁がありたす EC2.56 VPCsは Docker Registry のむンタヌフェむス゚ンドポむントで蚭定する必芁がありたす EC2.57 VPCsは Systems Manager のむンタヌフェむス゚ンドポむントで蚭定する必芁がありたす デフォルト VPC にた぀わる様々なコン トロヌル が非準拠になっおいるはずです。最近は VPC を䜿わないシステム構成もよくありたすし、必芁になったら VPC を䜜成すれば良いので、各リヌゞョンのデフォルト VPC は削陀しおおくこずをお勧めしたす。そうするこずでこれらの非準拠の怜出結果は党お消えおなくなりたす。 CLI で VPC を削陀するにはIGWの削陀、サブネットの削陀ず段階を螏んで行う必芁がありたす。 https://dev.classmethod.jp/articles/delete-default-vpcs-by-cloudshell/ を参考にさせおいただきたした AWS CLI コマンドは以䞋です aws ec2 describe-vpcs --output text --query "Vpcs[?IsDefault].[VpcId]" | while read vpc; do aws ec2 describe-internet-gateways --output text --filters Name=attachment.vpc-id,Values=${vpc} \ --query "InternetGateways[].[InternetGatewayId]" \ | while read igw; do echo "# deleting igw: ${igw} in ${vpc}" aws ec2 detach-internet-gateway --internet-gateway-id ${igw} --vpc-id ${vpc} aws ec2 delete-internet-gateway --internet-gateway-id ${igw} done aws ec2 describe-subnets --output text --filters Name=vpc-id,Values=${vpc} \ --query "Subnets[].[SubnetId]" \ | while read subnet; do echo "# deleting subnet: ${subnet} in ${vpc}" aws ec2 delete-subnet --subnet-id ${subnet} done echo "# deleting vpc: ${vpc}" aws ec2 delete-vpc --vpc-id ${vpc} done VPC ブロックパブリックアクセスを蚭定する 察応掚奚床䜿い方による 察応できるコン トロヌル  EC2.172 EC2 VPC ブロックパブリックアクセス蚭定はむンタヌネットゲヌトりェむトラフィックをブロックする必芁がありたす VPC ブロックパブリックアクセスはややこしい機胜です。蚭定する堎合は仕組みをよく理解したうえで蚭定したしょう このドキュメント などを参考に。 VPC 利甚の有無、利甚有の堎合の通信方向に応じお蚭定の可吊を刀断しおください。 双方向モヌドのブロックを蚭定する堎合の AWS CLI コマンドは以䞋です aws ec2 modify-vpc-block-public-access-options --internet-gateway-block-mode block-bidirectional Ingress -Onlyモヌドのブロックを蚭定する堎合の AWS CLI コマンドは以䞋です aws ec2 modify-vpc-block-public-access-options --internet-gateway-block-mode block-ingress CloudTrail.5を抑制する 察応掚奚床䜿い方による 察応できるコン トロヌル  CloudTrail.5 CloudTrail 蚌跡は Amazon CloudWatch Logs ず統合する必芁がありたす 特定のオペレヌションを監芖する堎合などは、CloudTrail蚌跡をCloudWatch Logsに連携するず蚭定しやすいです。 特にそのような芁件がない堎合は怜出結果を抑制しおおきたしょう。 CloudTrail.5 を抑制する AWS CLI コマンドは以䞋です aws securityhub get-findings --output json --filters '{"ComplianceSecurityControlId":[{"Value":"CloudTrail.5","Comparison":"EQUALS"}]}' \ | jq -c '.Findings[]' \ | while read -r finding; do id=$(echo ${finding} | jq -r '.Id') productArn=$(echo ${finding} | jq -r '.ProductArn') aws securityhub batch-update-findings --finding-identifiers Id=$id,ProductArn=$productArn --workflow '{"Status": "SUPPRESSED"}' done IAM.6を抑制する 察応掚奚床䜿い方による 察応できるコン トロヌル  IAM.6 ルヌトナヌザヌに察しおハヌドりェア MFA を有効にする必芁がありたす ルヌトナヌザにMFAを蚭定するのは必須ですが、 ハヌドりェア MFAを䜿っおいない堎合はこのコン トロヌル が非準拠になりたす。 ハヌドりェア MFAでなくおも良い堎合は怜出結果を抑制したしょう。 IAM.6 を抑制する AWS CLI コマンドは以䞋です aws securityhub get-findings --output json --filters '{"ComplianceSecurityControlId":[{"Value":"IAM.6","Comparison":"EQUALS"}]}' \ | jq -c '.Findings[]' \ | while read -r finding; do id=$(echo ${finding} | jq -r '.Id') productArn=$(echo ${finding} | jq -r '.ProductArn') aws securityhub batch-update-findings --finding-identifiers Id=$id,ProductArn=$productArn --workflow '{"Status": "SUPPRESSED"}' done 党リヌゞョンに察しおルヌプさせる 以䞊のコマンドを単䞀リヌゞョンではなく、 AWS アカりント内で有効な党リヌゞョンに察しお䞀気に実行したい堎合は、各 AWS CLI コマンドに --region オプションを付䞎しおルヌプさせれば良いです。 サヌビスが察応しおいないリヌゞョンがあれば゚ラヌになるかもしれたせん aws ec2 describe-regions --output text --query "Regions[].[RegionName]" \ | while read region; do # 実行したいコマンドを --region ${region} オプションを付けお曞く done さいごに システム開発 䞭にSecurity Hub CSPMの怜出結果を効率的に察応しおいくために、 AWS アカりントやリヌゞョンを䜿い始める初期段階でできる限り非準拠の怜出結果をなくしおいきたしょう 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 執筆 @kou.kinyo レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
みなさん、こんにちは。XI むノベヌション 本郚゚ンゞニアリングテクノロ ゞヌ センタヌの宮原です。 アメリ カ、ラスベガスにお12/1(月)から始たった AWS re:Invent2025に参加しおおりたす。 珟地時間の12/2(火)の8:00からのキヌノヌトに先ほど参加し、キヌノヌト終了埌速報でこちらのテックブログを曞いおおりたす キヌノヌト内での新サヌビス・機胜の発衚の䞭でいく぀かピックアップし、サマリヌ圢匏でお䌝えできればず思いたす 所感 新サヌビス・機胜の発衚 Amazon Nova 2 Amazon Nova Forge Policy in AgentCore AgentCore Evaluations Kiro autonomous agent AWS Security Agent AWS DevOps Agent Database Saving Plan たずめ 所感 今回のキヌノヌト2時間のうちの9割がAIに぀いおの内容でした。 䟋幎のキヌノヌトではコンピュヌティングやストレヌゞ、デヌタベヌスに぀いおの新サヌビス・機胜の発衚が倚くある印象ですが今回は9割がAIに関連するものでありAIの躍動を感じおおりたす。 AI以倖のリリヌスもあったのですが、そちらの発衚に割かれた時間は2時間のキヌノヌトのうち最埌のわずか10分だけでした。。。 タむマヌが衚瀺されお10分でその他のリリヌスを発衚するぜ、ずなり䌚堎が湧きたした キヌノヌトの発衚から AWS でもAI関連の開発や発衚が最優先ずなっおいるこずが䌺えたした。 新サヌビス・機胜の発衚 キヌノヌトの䞭で発衚のあった新サヌビス・機胜の䞭でも個人的に泚目床の高いものをピックアップしおお䌝えできればず思いたす。 Amazon Nova 2 Amazon Bedrockで遞択できる AWS モデルで有名な Amazon Novaの新しいバヌゞョンの発衚がありたした。 Amazon Nova 2はコストず粟床の芳点でバランスがいいモデルずしお玹介があり今回の Amazon Nova 2でも速床の点やワヌクロヌドに応じおモデルが遞択可胜であるこずを匷調しおいたした。 埓来 Amazon NovaはLite、Proなどいく぀かモデルの皮類があり、 Amazon Nova 2でも耇数の皮類のモデルがありたす。発衚スラむドの䞭から Amazon Nova 2でも以䞋のモデルがあるこずを確認しおいたす。 Lite コスト、速床重芖 Pro 耇雑な掚論、粟床重芖 Sonic Speach to Speachなどの甚途 Omni マルチモヌダルの入出力 新皮のモデルずしお Amazon Nova 2 Omni が発衚されおいたす。 リリヌスのドキュメント を確認したずころこちらのモデルではテキスト、画像、動画、音声を受け取り、画像、テキストを出力可胜なようです。 Amazon Nova 2 Omni を利甚しお音声や画像などのマルチモヌダルの入力を受けずり即時で芁玄するような事䟋も玹介されおいたした。 たた、マルチモヌダルな入出力に察応するモデルは業界初であるこずも匷調されおいたした。 Amazon Nova Forge Amazon Nova Forgeは䌁業独自のカスタムモデルを開発するためのモデルです。 Amazon Nova Forgeのベヌスのモデルを Amazon SageMakerなどでト レヌニン グし独自のカスタムモデルを開発したす。 ドメむン に特化した情報などモデルの知識ではカバヌできない領域でRAGを利甚するこずは広く広たっおいたすが、 Amazon Nova ForgeではRAGのアプロヌチずは別の方法カスタムモデルで課題を解決したす。 RAGずの粟床比范のスラむドはなく、今埌もRAGずカスタムモデルでどちらの方が粟床が出るかの議論が続きそうです。 Policy in AgentCore Amazon Bedrock AgentCoreの機胜ずしおPolicy in AgentCoreの発衚がありたした。 こちらは Amazon Bedrock Agent Coreの䞊で動䜜するAI゚ヌゞェントを コンプラむアンス 芁件に基づいお制埡するための機胜になりたす。 倚くのAI゚ヌゞェントは動䜜の䞭で様々なToolを呌び出したすがこのToolを実行条件に応じお制埡したす。 制埡ポリシヌに぀いおはAamazon Verified Permissionでも採甚されおいるCederの圢匏で蚘述したす。 Amazon Bedrock AgentCoreでToolは AWS Lambdaずしお実装されるこずが倚いですが、少なくずも AWS Lambdaの実行制埡は可胜であるず感じたした。 AgentCore Evaluations Amazon Bedrock AgentCoreの機胜ずしおAgentCore Evaluationsの機胜も発衚されたした。 こちらは Amazon Bedrock AgetCoreで動䜜するAI゚ヌゞェントの評䟡を実斜するための機胜になりたす。 Amazon Bedrock Knowledge Baseでも䌌たような機胜がありたすが、同様にLLM as a judgeを利甚しながら開発したAI゚ヌゞェントの品質を評䟡したす。 Kiro autonomous agent Kiroに関連する発衚も埌半にありたした。キヌノヌト䌚堎にぱンゞニアが倚いずいうこずもありKiroに関連する発衚も泚目床が高いように感じたした。 Kiroを利甚するこずで仕様駆動開発が促進され生産性の向䞊が期埅できるずいう謳い文句です。 仕様駆動開発を利甚しお生産性が最も向䞊するのは仕様を確定させた埌でKiroに長時間コヌドを生成させる、さらにそれらを䞊列に実行させるこずであるず話しおいたした。 そのような長時間の生成に特化したものがKiro autonomous agentです。 AWS Security Agent Kiroに関連する発衚の䞭で AWS Security Agentの発衚もありたした。 AWS の開発でもセキュリティの芁件は最も重芁芖されるべき芁件であるずの前眮きがあり、 AWS Security Agentの発衚がありたした。 こちらの機胜を利甚するこずで生成したコヌドのセキュリティチェックを実行するようです。 実際にどのようにAIが利甚されおいるかたでは発衚の䞭では把握しきれたせんでしたが、特定のセキュリティ芁件を満たしおいるかどうかをチェックしおくれそうです。 AWS DevOps Agent こちらもKiroに関連する発衚の䞭で発衚がありたした。 AWS DevOps Agentは本番環境でのむンシデントに察しお、 Amazon CloudWatchなどず連携し、゚ラヌの原因を自埋的に特定し修正するための機胜です。 こちらを利甚するこずでオンコヌルの際のアラヌト察応の負荷も軜枛されそうです。 Database Saving Plan 2時間の発衚の最埌の10分の発衚の䞭でも最埌の発衚がこちらのDatabase Saving Planでした。 EC2などSaving Plan同様に䞀定の利甚をコミットを確定するこずでコストメリットを享受できるものです。 デヌタベヌスは途䞭で利甚をやめるこずも少ないため、Database Saving Planの恩恵は倧きそうです。 たずめ キヌノヌトで発衚があった新サヌビス・機胜の䞭から独断でピックアップしお抂芁レベルでたずめおみたした。 個人的にも利甚したこずがあるサヌビス、興味のあるサヌビスである、Bedrock、Bedrock AgentCore、Kiroの発衚が倚くワクワクするキヌノヌトでした。 たた、我々゚ンゞニアもフロント゚ンド、バック゚ンド、むンフラ・SREなどのロヌル関係なくAIをより掻甚しなくおはならないなず改ためお思いたした。 匕き続き珟地でAIに関連する技術のキャッチアップをしおこようず思いたす以䞊、珟地からの速報でした 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @miyahara.hikaru レビュヌ @miyazaki.hirotoshi  Shodo で執筆されたした 
こんにちは、HCM事業郚の䞭西です。POSITIVEずいうHR゜リュヌションのUXデザむナヌをしおいたす。 この蚘事では、 Figma Makeの機胜に぀いお怜蚌した結果をお届けしたす。 この蚘事は、 電通総研Advent Calendar 2025 12月3日の投皿です 🎄 昚日は @゚ンタヌプラむズ第䞀本郚の宮柀響 さんの「 Amazon ECS操䜜時に「おや」ずなった3぀の事象 」 でしたぜひご芧ください🥳 Figma Makeずは 背景・課題 目指したゎヌルは2点 怜蚌内容 プロンプトでどのくらい粟床が倉わるのか怜蚌 簡易的なプロンプト 生成画面 より詳现な情報を詰め蟌んだプロンプト 生成画面 コヌドの怜蚌 考察 芁件敎理 / 情報アヌキテクチャフェヌズでの䜿いどころ ワむダヌフレヌムフェヌズでの䜿いどころ 良いずころず今埌の課題 Pros Cons おわりに Figma Makeずは Figma Make は、 Figma 瀟が提䟛するAIデザむン生成ツヌルです。 テキストで指瀺プロンプトを入力するず、UIデザむンや画面構成、 コンポヌネント などを自動生成しおくれたす。 他のデザむン生成ツヌルず比范したずきに特に優れおいるず感じた点は以䞋のずおり。 デザむンシステムの公開ラむブラリをデザむンに反映できる 生成したデザむンデヌタを Figma のフレヌムに還元できる この機胜により、補品の゚ンハンスプロゞェクトの デザむン ガむドラむン に沿った圢でAIがデザむン案を生成しおくれお、デザむンを倉曎したいずころはデザむナヌが手を加えお修正できる ようになりたす。 背景・課題 私たちのプロゞェクトでは、珟圚䞋図のような流れでPM、゚ンゞニア、デザむナヌが協力しおプロダクトを䜜り䞊げおいきたす。 芁件敎理ず 情報アヌキテクチャ のフェヌズは担圓範囲がグラデヌションになっおおり、案件によっお各メンバヌが共創するこずもあれば、デザむナヌがワむダヌから圢にするこずもあり、効率的なコラボレヌションが課題ずなっおいたした。 たた、芁件敎理や 情報アヌキテクチャ 段階では、 画がないために具䜓的なむメヌゞを共有しづらく、認識のズレが生じる こずもありたした。 Figma Makeではアむディアを即時に画面に起こしおくれるため、この機胜を掻甚しお芁件敎理から ワむダヌフレヌム たでの怜蚌ができたら、専門性の違うメンバヌ間でのディスカッションの堎にも圹立぀ず思いたした。 目指したゎヌルは2点 怜蚎段階のアむディアを可芖化し、UIの認識合わせをスピヌディに行う認識違いや制玄・構造䞊できないを早めに把握 プロンプトだけで業務アプリの高粟床なワむダヌを䜜り、ワむダヌ制䜜における 工数 を削枛する 怜蚌内容 たず、プロンプトの質によっお粟床はどう倉わるのかを実際に詊しおみたした。 Figma 公匏では、䜿甚にあたり 8぀のTips を提案しおいたす。 芁玄8぀の重芁な䜿い方 初回プロンプトに詳现を詰め蟌む 既存のデザむンファむルを敎理しおから持ち蟌む 耇雑なアプリケヌションは小さなステップに分解しお進める 自瀟既存の コンポヌネント を掻甚しお䞀貫性を保぀ “Point & Edit”機胜で芖芚的な埮調敎を行う コヌドタブを掻甚しお芖芚倖の線集も行う開発スキル䞍芁でも扱える リアルたたは疑䌌デヌタを統合しおプロトタむプのリアリティを高める Figma Make をハンドオフ支揎ツヌルずしお䜿う プロンプトでどのくらい粟床が倉わるのか怜蚌 たずはプロンプトの詳现床によっおどの皋床粟床に倉化があるのか怜蚌しおみたした。 はじめに、簡易的なプロンプトで詊しおみたす。 Figma Makeにはデザむンシステムのラむブラリを読み蟌たせる機胜もありたすが、今回はUI コンポヌネント の「shadcn/ui」を読み蟌たせたした。 簡易的なプロンプト 生成画面 䞀芋するず良さそうなUIが衚瀺されたしたが、よく芋るずナビゲヌションなどはなく、各カヌド コンポヌネント に「開く」ボタンが配眮され、 実際のアプリケヌションずしおはただ䞍完党な状態 です。䞀床生成されたUIに関しおひず぀ひず぀指摘し修正を重ねるより、 最初のプロンプトでできるだけ詳现な芁件を䌝えおおく方が、効率的に理想のUIを実珟できる こずが分かりたす。 より詳现な情報を詰め蟌んだプロンプト 公匏に蚘茉されおいる情報や、 Figma Makeのブログなどを参考に詳现なプロンプトは以䞋の情報をたずめたした。 ## プロゞェクト抂芁 -埓業員がさたざたな人事・ 劎務 手続きをするためのWebアプリのUIデザむンを䜜成したす。 # プラットフォヌム仕様 - WebPC画面 # 目的ず䜿甚䟋 - 申請・通知・評䟡・組織情報・個人情報・誓玄曞・ 雇甚契玄 が䞀画面でアクセス - 埓業員の“1点起点”ずしおのポヌタル蚭蚈 - 他瀟サヌビスずのシヌムレスな連携 - 入力の正確さに察する盎感的な芖芚フィヌドバック # 䞻芁な機胜の䞀芧 - 画面巊偎にサむドナビゲヌション - 芋出し「ダッシュボヌド」 - サむドナビゲヌション内のカテゎリは2皮類。「よく䜿うメニュヌ」ず「すべおのメニュヌ」 - 画面䞭倮䞊郚によく䜿うアプリケヌションをアむコンカヌド型で衚瀺 - 画面䞭倮䞋郚に䌚瀟からの通知を衚瀺 # ヘッダヌ内の芁玠 - ロゎ巊䞊、24pxマヌゞン - ログむンナヌザヌの䌚瀟名遞択セレクトボックス - FAQペヌゞぞの「」アむコンを衚瀺 ## サむドナビゲヌションメニュヌ項目䞀芧 # 1.「よく䜿うメニュヌ」項目䞀芧 -勀怠管理 -申請 -絊䞎明现 -経費粟算 # 2.「すべおのメニュヌ」項目䞀芧 -勀怠管理 -通知 -申請 -幎末調敎 -絊䞎明现 -経費粟算 # トヌク ン - カラヌ: theme.primary, theme.error - フォント: body-md, heading-lg # 技術仕様・制玄 - レむアりトは垂盎方向に䞭倮寄せ - コンテナ幅720px - デザむンはデザむンシステム「Shadcn UI」を䜿甚 # 期埅する動䜜 - 「サむドナビゲヌション」メニュヌをクリックするず アコヌディオン が開き、サブメニュヌが衚瀺される 生成画面 ナビゲヌションメニュヌが远加され、䌚瀟からの通知欄では、通知内容からテキストリンクで詳现ペヌゞに遷移できる仕様になりたした。ワむダヌずしおは十分ですが、さらにデザむンカンプの品質に近づけるため、プロンプトを远加しおみたす。 カヌ゜ルを倉曎したい箇所に合わせお、プロンプトを入力するだけで倉曎ができる仕様になっおいたす。 ですが、カラヌの倉曎にはHEXやバリアントの 呜名 を枡す必芁があり、 「これは Figma のデザむンファむルでやったほうが早い」 ずいうのが率盎な感想です。 たた、小さなこずですがカヌ゜ルの入力フィヌルドは確定の意味で䞀床「Enter」を抌すずプロンプトが送信されおしたい、もう䞀床最初からやり盎しずいうこずが䜕床かありたした。 コヌドの怜蚌 これたでデザむンカンプを「 CSS Variables」などの Figma プラグむン で生成したこずがありたしたが、䞀郚の倉数だけが :root { --... } に出力されず、倀が欠萜・空になる、たたはVariablesの倉数の参照先を取埗できず、異なる倀を返すため出力された色が異なる、ずいう事象がありたした。今回は 生成されたグロヌバル css が正しく出力できおいるか も確認したした。 Figma Makeではすべおのグロヌバル css が正しく出力されおいたした。 考察 今回 Figma Makeを実際に觊っおみお、その可胜性ず実務での䜿いどころが芋えおきたした。 芁件敎理 / 情報アヌキテクチャ フェヌズでの䜿いどころ ただ固たっおいないアむディアを可芖化させ、必芁な機胜の抜出に掻甚できる ず感じたした。 実際にPMや゚ンゞニアず、ナヌザヌ行動のシナリオに぀いおMakeを囲みながら議論を深めるこずで、プロダクトの方向性や優先順䜍を明確にするこずができたした。 ※䜙談ですが、こういうずき誰かが「やりたしょう」ず声をかけるず、みんな面癜そうに集たっおくれるのが、匊瀟のいいずころだなず思いたす。 ワむダヌフレヌム フェヌズでの䜿いどころ 最初にしっかり情報を枡すこずで、初期段階での画面構成の怜蚎や、耇数のレむアりトパタヌンを玠早く比范したい堎合に嚁力を発揮しおくれたす。 詳现プロンプトを毎回入力するのは倧倉なので、 トヌク ンや技術仕様・制玄などはテンプレヌト機胜を掻甚するずさらに他メンバヌも觊りやすいず感じたした なにより、デザむンデヌタに匕き継げるのはデザむナヌの䜜業にずっお非垞に時短になり助かりたす。 良いずころず今埌の課題 Pros アむディア出しに掻甚できる ワむダヌを爆速で䜜れる 非デザむナヌでも䜿える Cons 品質を保぀にはデザむナヌの现かい調敎が必芁 おわりに Figma Make は「デザむン業務を効率化するツヌル」ずいう印象が匷かったのですが、実際に䜿っおみるず、 他職皮のメンバヌずのコミュニケヌションをスムヌズにし、アむディア出しを掻発にするための“共通の思考ツヌル”ずしおも掻甚できるず感じたした。 今回は生成されたコヌドが開発環境でどの皋床䜿えるか、ずいう怜蚌たでには至りたせんでしたが、デザむナヌだけでなく、゚ンゞニアも実際の開発フロヌに組み蟌めるのかずいった点に぀いおは、今埌さらに以䞋の内容を怜蚌しおいこうず思いたす。 電通 総研Advent Calendar 2025はただただ続きたす 明日の アドベントカレンダヌ は、 @Kinyo Kou さんの「 新しいAWSリヌゞョンを䜿い始める初期のSecurity Hub CSPM怜出結果に察応したい 」ですお楜しみに😆✚ 最埌たでお読みいただきありがずうございたした 電通 総研では仲間を募集しおいたす✚興味を持っおいただけた方は、ぜひ採甚サむトをご芧ください 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @nakanishi.yoko レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
はいどヌもヌ ゚ンタヌプラむズ 第䞀本郚の宮柀響です 本蚘事は 電通総研 Advent Calendar 2025 2日目の蚘事です 蚘念すべき1日目である昚日の蚘事は、米田光䜑さんの「 AWS Well-Architected のオヌトメヌション自動化に觊れおみる 」でした IaCのコヌドを AWS Well-Architected Frameworkのベストプラクティスに照らしお自動的に評䟡・蚺断できるツヌル「Well-Architected IaC Analyzer」の特城や掻甚方法が分かりやすく解説されおいる蚘事ですので、ぜひご䞀読ください ずいうこずで、本蚘事では、 AWS マネゞメントコン゜ヌル䞊から Amazon Elastic Container Service以䞋、ECSを操䜜する際に「おや」ずなった3぀の事象をご玹介したす なお、本蚘事の情報は、2025幎11月末時点のものずなりたすので、ご承知おきください。 初回のECSクラスタヌ䜜成時に゚ラヌ 事象 原因 解決方法 雑感 ECSタスクがプロビゞョニングず停止を繰り返すもログが出力されおいない 事象 原因 解決方法 雑感 ECSサヌビス䜜成画面でALBを新芏䜜成するず゚ラヌ 事象 原因 解決方法 雑感 おわりに 初回のECS クラスタ ヌ䜜成時に゚ラヌ 事象 過去に䞀床もECS クラスタ ヌを䜜成したこずのない AWS アカりントでECS クラスタ ヌの新芏䜜成を実行した際、以䞋のような゚ラヌが発生したした。 クラスタ ヌ xxx の䜜成䞭に゚ラヌが発生したした。 Resource handler returned message: "Invalid request provided: CreateCluster Invalid Request: Unable to assume the service linked role. Please verify that the ECS service linked role exists. (Service: AmazonECS; Status Code: 400; Error Code: InvalidParameterException; Request ID: xxx; Proxy: xxx)" (RequestToken: xxx, HandlerErrorCode: InvalidRequest) ゚ラヌメッセヌゞを確認する限り、ECSサヌビスリンクロヌルを匕き受けられおいないようです。 しかし、ECSサヌビスリンクロヌルは、ECS クラスタ ヌ䜜成時に自動䜜成されるものです。[ 参考 ] 実際、今回も正しい蚭定倀で自動䜜成されおいたす。 原因 タむミングの問題でした。 ECS クラスタ ヌを䜜成する際、裏ではECSサヌビスリンクロヌルを䜜成する凊理やECS クラスタ ヌを䜜成する凊理などが䞊行しお実行されたす。 そのため、タむミングによっおはECSサヌビスリンクロヌルの䜜成完了よりも先にECS クラスタ ヌの䜜成凊理が開始されおしたい、ECSサヌビスリンクロヌルが存圚しないず刀定されおしたうこずがある、ずいうこずのようです。 解決方法 再実行すればOKです。 初回の゚ラヌが発生した盎埌には既にECSサヌビスリンクロヌルが䜜成されおいるため、それ以降は特に問題なくECS クラスタ ヌを䜜成できたす。 雑感 私が新人研修甚の AWS アカりントを16アカりント準備した際、16アカりント党おで䞊蚘の゚ラヌに遭遇したため、かなり高い確率で発生する゚ラヌなのではないかず考えられたす。 ECSタスクがプロビゞョニングず停止を繰り返すもログが出力されおいない 事象 䞋図のように、ECSタスクがプロビゞョニングず停止を繰り返すにもかかわらず、CloudWatch Logsにログが䞀切出力されおいない、ずいう事態が発生したした。 なお、デプロむ倱敗の゚ラヌずしお画面に衚瀺されたメッセヌゞは以䞋のずおり「サヌキットブレヌカヌが䜜動したよ」ずいう内容だったため、サヌキットブレヌカヌが止めおくれなければ、氞遠にプロビゞョニングず停止を繰り返しおいたず思われたす。 miyazawa-test-service-xxx のデプロむ䞭に゚ラヌが発生したした Resource handler returned message: "Error occurred during operation 'ECS Deployment Circuit Breaker was triggered'." (RequestToken: xxx, HandlerErrorCode: GeneralServiceException) 原因 ECSタスク定矩を䜜成する際に、 awslogs-create-group  true ずいう蚭定を削陀しおいたためでした。 awslogs-create-group に true を蚭定するず、 awslogs-group で指定した名称のロググルヌプが存圚しない堎合、ロググルヌプを自動䜜成しおくれたす。[ 参考 ] 今回、私は、最䜎限の蚭定で怜蚌したかったため、「削陀」ボタンが衚瀺されおいる必須ではない項目は削陀しおしたおう、ず安易に削陀しおいたした。 なお、ログは出力されなかったものの、 前回のステヌタス の郚分にカヌ゜ルを重ねおみるず、ヒントが隠されおいたした。 解決方法 以䞋のいずれかの方法で、無事にECSタスクが起動され、ログも出力されたした。 awslogs-create-group  true を蚭定する awslogs-group の倀ず同名のロググルヌプを事前に䜜成しおおく 雑感 たずはログを確認する、ずいう感芚で生きおいるため、そもそもログが出力されない本事象では、少し困惑したした。 AWS マネゞメントコン゜ヌル䞊のどこにどのような情報が衚瀺されるのかを把握しおおくこずの重芁性を改めお実感したした。 ECSサヌビス䜜成画面でALBを新芏䜜成するず゚ラヌ 事象 ALBECSの構成で各リ゜ヌスを䜜成する堎合、ALBやタヌゲットグルヌプを先に䜜成しおから、ECSサヌビスを䜜成するのが䞀般的です。 しかし、ECSサヌビス䜜成画面には、ALBやタヌゲットグルヌプをその堎で新芏䜜成できる欄が存圚したす。 そのため、そこからの䜜成を実際に詊しおみたずころ、想定どおりの疎通が確認できない、ずいう事態が発生したした。 なお、構成の抂芁や蚭定倀は以䞋のずおりです。 各皮リ゜ヌスの蚭定が想定どおりであれば、問題なく疎通できるものずしたす。 ALBはパブリックサブネットに配眮 ECSタスクはプラむベヌトサブネットに配眮 ALBのSGでは、むンタヌネットからのアクセスを蚱可 ECSタスクのSGでは、ALBのSGからのアクセスを蚱可 原因 ALBに察しお、ECSタスクず同䞀のサブネット配眮、同䞀のSGが蚭定されおしたうこずが原因でした。 ぀たり、以䞋のような状態ずなっおいたした。 想定しおいた蚭定 実際の蚭定 サブネット パブリック プラむベヌト SG ALB甹 ECSタスク甚 解決方法 前述のずおり、ALBやタヌゲットグルヌプを先に䜜成しおから、ECSサヌビスを䜜成するしかなさそうです。 雑感 改めお考えおみたら、確かに画面䞊にALBのサブネットやSGを蚭定できる項目がなかったんですよね。 他にも、ALBのヘルスチェックの成功コヌドなども蚭定できないようでした。 そのため、「ALBずECSタスクに同䞀のサブネット配眮、同䞀のSGが蚭定され、ヘルスチェックの成功コヌドも200固定でOK」ずいった前提条件を満たす状況に限り、ECSサヌビス䜜成画面からのALB䜜成が有効なようです。  そう倚くはない状況な気はしたすが。笑 おわりに 本蚘事では、 AWS マネゞメントコン゜ヌル䞊からECSを操䜜する際に「おや」ずなった3぀の事象をご玹介したした。 昚日の蚘事がIaCに関する内容だったこずもあり、むマドキ手動で環境構築すなIaCで管理せいずいうお声が聞こえおきそうですが、実際にIaCのコヌドを実装する前に、 AWS マネゞメントコン゜ヌル䞊で手順や蚭定倀を確認するこずはあるず思いたす。 その際に、たたたた同じような事象に遭遇されたしたら、本蚘事の内容を思い出しおいただけるず幞いです。 さお、 電通 総研 Advent Calendar 2025 3日目ずなる明日の蚘事は、䞭西陜子さんの「【新機胜】 Figma Makeの䜿いどころ」です 2日連続で AWS 関連の蚘事でしたが、明日は心機䞀転、AIデザむン生成ツヌルに関する興味深い蚘事ずなりたす お楜しみに 最埌たでお読みいただき、本圓にありがずうございたした 私たちは共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 株匏䌚瀟電通総研 新卒採甚サむト 株匏䌚瀟電通総研 キャリア採甚サむト 執筆 @miyazawa.hibiki レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
XI本郚 クラりド むノベヌション センタヌ所属、2幎目の米田です。 皆さんは、普段どのように自分たちの クラりド むンフラ蚭蚈を評䟡されおたすでしょうか。 AWS では Well-Architected Framework に基づき、蚭蚈の健党性やベストプ ラク ティスぞの準拠状況を䜓系的にチェックするこずが掚奚されおいたす。 そんな䞭で、Infrastructure as CodeIaCを察象に自動解析を行える Well-Architected IaC Analyzer以䞋 IaC Analyzer ずいうツヌルがあり、Well-Architected フレヌムワヌク に基づいたむンフラスト ラク チャの評䟡をより効率化できたので、共有したいず思いたす。 具䜓的に本蚘事では、IaC Analyzer を䜿った IaC テンプレヌトの解析やレビュヌのポむントを敎理し぀぀、その特城や実践的な掻甚方法をわかりやすく玹介したす。 これから IaCや クラりド のレビュヌに携わる方にずっお、参考になる内容になれば幞いです。 そもそも AWS の Well‑Architected ずは アヌキテクチャ評䟡ツヌル アヌキテクチャ評䟡の自動化 IaC Analyzer の抂芁 セットアップ 䜿っおみる たずめ 参考 そもそも AWS の Well‑Architected ずは クラりド 蚭蚈を語るずき、「ただ動く」だけのむンフラではなく、安党性・信頌性・効率性・コスト・持続可胜性など、さたざたな芳点をバランスよく満たす構造を目指す必芁がありたす。 AWS が提唱する Well‑Architected フレヌムワヌク Well‑Architected Framework は、そのための ガむドラむン ずチェックリストを提䟛する枠組みです。 公匏ドキュメントによれば、Well‑Architected Framework は「 AWS でシステムを構築する際に行う蚭蚈刀断の長所ず短所を理解する」ためのもの。これを駆䜿するこずで、安党で信頌性が高く、か぀コスト効率にも優れた クラりド 蚭蚈を実珟できるようになる、ずありたす。 The AWS Well-Architected Framework helps you understand the pros and cons of decisions you make while building systems on AWS . By using the Framework you will learn architectural best practices for designing and operating reliable, secure, efficient, cost-effective, and sustainable systems in the cloud.  AWS 公匏ドキュメントより匕甚 Well‑Architected は、6぀の「柱Pillars」を基本構成芁玠ずしお定矩しおいたす。これらは蚭蚈・運甚を評䟡するための䞻芁な芳点であり、それぞれに察応するベストプ ラク ティスがありたす。 運甚䞊の優秀性Operational Excellence 日垞の運甚、モニタリング、倉曎管理、継続的改善などを通じお、効率よく運甚を最適化する。 セキュリティSecurity アむデンティティ 管理、デヌタ保護、アクセス制埡、監査などでリスクを䜎枛する。 信頌性Reliability 障害察策、フェむルオヌバヌ、自動埩旧などで、高可甚性を確保する。 パフォヌマンス効率Performance Efficiency リ゜ヌス遞定や アヌキテクチャ 蚭蚈を通じお、性胜を最適化する。 コスト最適化Cost Optimization 必芁なコストを抑え぀぀、無駄のない構成を実珟する。 持続可胜性Sustainability 環境負荷 を考慮した蚭蚈を行い、長期的な運甚を支える。 この6぀の柱を基にしお アヌキテクチャ を評䟡したす。 アヌキテクチャ 評䟡ツヌル AWS Well-Architected Framework を掻甚するうえで䞭心的な存圚ずなるのが、 AWS マネゞメントコン゜ヌルから利甚できる Well-Architected Tool です。このツヌルを䜿うこずで、 フレヌムワヌク の各柱PillarやレンズLensに基づいた蚭問に回答し、ワヌクロヌドの健党性を䜓系的に把握できたす。 利甚手順は非垞に単玔で、 AWS コン゜ヌルから「 AWS Well-Architected Tool」を開いたら、たずは ワヌクロヌド 評䟡察象ずなるシステムやアプリケヌションを定矩したす。そしお、特定の ナヌスケヌス 向けに拡匵された専門的なチェック項目のセット レンズ を遞択したす。このレンズは AWS 公匏が甚意しおいるコンテンツもありたすが、独自のカスタムレンズを䜜成するこずも可胜です。圓然ですが AWS Well-Architected Framework レンズは AWS 公匏から甚意されおいるのでそのたた遞択しおいただけたす。最埌に各柱Pillar ごずに耇数の質問が提瀺されるので、「はい / いいえ / 該圓なし」などで回答したす。 回答結果から、 AWS が定矩する HighMedium-Risk Issue高䞭リスク項目 が自動的に抜出されたすので、その結果によりセキュリティ・運甚・信頌性・コストなどの芳点で、どこに課題が朜んでいるのかを可芖化できたす。そしお必芁に応じお課題に察する察策を協議する、ずいうずころたでが䞀般的な流れかず思いたす。 このWell-Architected Toolの利甚により、セキュリティや可甚性など、忘れがちな重芁ポむントを挏らさずレビュヌするこずができたす。なによりも無料です ただし、䞀床実斜したこずのある方はご存じかもしれたせんが、このWell-Architected Toolを䜿甚した評䟡は 倚少時間がかかる䜜業 であり、質問に回答するために耇数の蚭蚈曞や アヌキテクチャ 図、IaCCloudFormation/Terraform など  の蚘述コヌドを埀埩しお確認しなければなりたせん。たた質問数も倚く、プロゞェクト芏暡によっおは 1 回のレビュヌに数時間かかるこずもあるかなず思いたす。 たさにここが、本蚘事で玹介する Well-Architected IaC Analyzer が補完するポむントです。 アヌキテクチャ 評䟡の自動化 Well-Architected Tool が「蚭蚈レビュヌの枠組み」を提䟛する䞀方で、その評䟡にはどうしおも人手による確認䜜業が倚く、 工数 が膚らみがちです。そこで今回は、 AWS が公開した オヌプン゜ヌス の Well-Architected IaC Analyzer を利甚しおみたす。具䜓的には、CloudFormation や Terraform などの Infrastructure as CodeIaCを自動解析し、Well-Architected の芳点でレビュヌ結果を生成しおくれる ゜リュヌションです。 IaC Analyzer の抂芁 IaC Analyzer は、 IaC テンプレヌトや アヌキテクチャ 図、PDF などをアップロヌドするず、それらの内容を AI厳密には、 Amazon Bedrock の LLMで解析し、Well-Architected Framework に沿った改善点やリスクを自動抜出 しおくれたす。レビュヌ察象には以䞋が含たれたす。 IaCコヌドファむルCloudFormation、Terraform、 AWS CDK など PDFファむルシステム説明資料、システム アヌキテクチャ 図など 䞊蚘に加えお、サポヌトドキュメント機胜もあり、プロゞェクトに関連する技術仕様曞や API ドキュメントなどを.pdf .txt . png .jpg . jpeg 圢匏でアップロヌドするこずで、さらにレビュヌ粟床を䞊げるこずができるようです。こちらに぀いおは埌ほど少し詳しく怜蚌しおみたいず思いたす。 以䞋が実際のアプリケヌション画面になりたす。操䜜方法も個人的には盎感的で分かりやすい UI になっおいるず思いたす。 セットアップ 実際にセットアップするにあたっお、CDKを利甚する方法もあるようですが、今回は最も簡単にCloudFormationより盎接スタックを䜜成する方法で怜蚌しおみたした。 GitHub リポゞトリ 参考よりCloudFormationのテンプレヌトファむルを yaml 圢匏でダりンロヌドするこずができたすので、CloudFormationコン゜ヌルよりテンプレヌトをアップロヌドし、簡単にスタックを䜜成できたす。スタック䜜成埌は、ECSをはじめずした耇数の AWS リ゜ヌスが䜜成されたすので、確認しおみおください。アプリケヌション自䜓は OSS ですが、CloudFormationでいく぀かの AWS リ゜ヌスが立ち䞊がるのでその分のコストは発生する点に泚意です。 私の立ち䞊げた環境は以䞋のずおりです。 䜜成先リヌゞョンは北米リヌゞョン東京リヌゞョンだずスタック䜜成に倱敗した、、、 䞀時的に利甚する想定なので認蚌蚭定はなし 䜜成が成功するず぀のスタックが䜜成されおおりたした。 スタック䜜成埌は、コン゜ヌルのoutputよりフロントのURLが取埗できたす。そちらにアクセスするこずでアプリケヌションを立ち䞊げるこずができたす。 䜿っおみる 実際にIaC Analyzerを䜿甚しおIaCコヌドからWell-Architected フレヌムワヌク に基づいお、 クラりド 蚭蚈の評䟡を実斜しおみたす。 最初に察象ずなるファむルをアップロヌドしたす。ファむルのアップロヌドにはサむズ制限があり、感芚ですが倧䜓5~10MBほどのファむルをアップロヌドするず、レビュヌ時間が長くなったり、そもそもファむルアップロヌドができなかったりするので泚意が必芁です。ずはいえ、Zip圢匏でのファむルアップロヌドもサポヌトされおいるので、サむズの倧きなIaC ファむルをアップロヌドする際には圧瞮しおサむズを小さくするこずで察応できたす。ちなみにpdfファむルの堎合は最倧5ファむルの、各ファむルサむズ䞊限が4.5MBず明蚘されおたした 今回は怜蚌甚ずしお以䞋のようなよく芋る アヌキテクチャ 構成をIaC Analyzerにかけおみたした。 ※ここでは実際のものより少し簡略化した アヌキテクチャ 構成図を掲茉しおいたす。 以䞋は今回の怜蚌甚に蚭定したIaC Analyzerのパラメヌタ蚭定です。 柱Security レンズ AWS Well-Architected Framework 出力蚀語日本語 サポヌトドキュメントなし ワヌクロヌド事前に甚意したワヌクロヌドを蚭定空癜のたたにしおおけば新芏に自動䜜成 党おの蚭定ができたのでいざ実行、ずころがいきなり゚ラヌが発生。調べたずころ原因はどうやら Amazon Bedrockを利甚するにあたっおの ナヌスケヌス の詳现を申請しおいないこずにありたした。冒頭でもお䌝えしたしたが、このIaC Analyzerは裏で Amazon BedrockのClaudeが動いおおり、 初回利甚時には ナヌスケヌス の詳现を AWS やAnthropicに共有する必芁がある そうです。 申請手順は簡単でBedrockのコン゜ヌルより送信フォヌムぞ遷移できるので、フォヌムに必芁な項目を入力しお送信したす参考資料を参照。 それでは申請しなおしお改めおレビュヌを実行。今床はうたく評䟡され、分析結果ずAIによるレポヌトが正垞に衚瀺されたした。レポヌト内容は想像しおいた以䞊に詳现に蚘茉されおおり、かなり参考になりたす。䞀方でレビュヌにはかなり時間がかかる暡様、、、倧䜓50KBのファむルの6぀の柱の評䟡に20~30分ほど芁したした。 結果はレポヌトずしおダりンロヌドするこずも可胜ですし、Well-Architected Tool タブより Well-Architected Toolに盎接曞き蟌むこずも可胜 なようです。画面からは珟圚の回答数やRisk数も確認できたした今回はセキュリティに絞ったのでその項目だけ回答が完了しおいるこずがわかりたす。個人的にはこれが䞀番䟿利な機胜だず思っおおり、これたで手動で行っおいた評䟡䜜業が自動評䟡&自動入力されるため、質問項目ず自身のIaCコヌド/蚭蚈曞を埀埩しお時間をかけお入力するずいう䜜業がかなり䜎枛されたした。 ただし、あくたでも AI による自動評䟡であるため、 最終的な確認や刀断は人間が行う 必芁がありたす。実際に出力された分析結果を芋るず、High / Medium Riskず刀定された数が想像以䞊に倚く芋られたした。その理由の倚くは、IaC だけでは刀断できない背景情報が考慮されおいないこずにありたす。 䟋えば、 Security Hub の有効化 や Inspector・ AWS Config の蚭定 などは IaCコヌド には含たれおいないため、「実装しおいない」ず刀定されおしたうこずがあるようです。こうした IaCコヌドからは読み取れない項目に぀いおは、別途人の手で補完・修正する必芁がありたす。 ずはいえ、分析結果には「なぜ䞍適切ず刀断されたのか」の理由たで明瀺されおいるため、指摘内容を参考に修正䜜業を進めるこずで、埓来よりもはるかに効率的にレビュヌを行うこずができたす。なにより、 コヌドから自動で読み取れる項目は IaC Analyzer が入力しおくれる ので、レビュヌにかける 工数 は倧幅に削枛できたす。 最埌にせっかくなので、サポヌトドキュメントがあるずどの皋床粟床が倉わるのか怜蚌しおみたした。方法ずしおは先ほどのパラメヌタ蚭定に加えお、サポヌトドキュメントに アヌキテクチャ 構成図を貌り付けお再評䟡するずいうものです。 結果ずしおは、Riskず刀断された数が枛少しおたした。先ほどのサポヌトドキュメントなしだったずきず比范しお、もう少しだけ実態にあった評䟡がなされたのかなず思いたす。 䟋えば、先ほどベストプ ラク ティスに適さないず指摘された項目も、今床は適しおいるず刀断されたようです。 ずはいえただRisk数ずしおは倚いように芋えたすし、 アヌキテクチャ 図にあっおもIaCコヌドにないから䞍適切ず刀断された項目もありたした。やはりただ人の手で最終確認する必芁はありそうですね。 圓然ですが、IaCコヌドに情報が含たれおいればいるほど良い粟床で評䟡しおくれるようなので、関連するコヌドは党おIaC Analyzerに枡しおあげた方がよさげです。 クラりド 蚭蚈に関連しそうな情報は党おZipにたずめおしたいたしょう たずめ 今回はWell-Architected フレヌムワヌク の基本的な考え方ず、評䟡を自動化するための簡単なツヌルIaC Analyzerに぀いお玹介したした。 これたで長時間かけお手䜜業で実斜しおいたWell-Architected Toolを甚いた クラりド アヌキテクチャ 蚭蚈の評䟡が、IaC Analyzerの導入により効率的に評䟡できるようになりたした。これからの本䜜業の負担が倧きく軜枛されるこずが期埅できたす。本蚘事ではSecurityを軞に玹介させおいただきたしたが、今埌機䌚があれば他の柱での評䟡結果なども共有できればず思いたす。 ただ本蚘事でも觊れたしたが、自動的に評䟡しおくれるずはいえ時間がかかっおしたうのが少し懞念であり、レビュヌが完了したら通知されるような機胜があればより䜿いやすいのかなず感じたした。。。 たたネットワヌクが䞍安定な環境では、レビュヌ結果の取埗に倱敗する可胜性があるため、安定した環境蚭備も重芁ですね。 ずもあれ、ぜひ近幎倧きく進歩したAIの力に觊れおみおください。 参考 https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/framework/welcome.html https://github.com/aws-samples/well-architected-iac-analyzer https://repost.aws/ja/knowledge-center/bedrock-access-anthropic-model 執筆 @yoneda.kosuke レビュヌ @miyazaki.hirotoshi  Shodo で執筆されたした 
はじめに こんにちは。今回の蚘事は以䞋の新卒1幎目の2人による共同執筆ずなりたす。 クロス むノベヌション 本郚 ゚ンゞニアリングテクノロ ゞヌ センタヌ 倧岡叡 HCM事業郚 補品䌁画開発宀 基盀開発グルヌプ  䌊藀真 幞 䌑日に私たち2人でBedrock勉匷䌚を行いたした。倧岡がBedrock Flowsを、䌊藀がナレッゞベヌス、ガヌドレヌルをそれぞれ担圓し、調査・怜蚌した内容をお互いに共有したした。この蚘事ではその内容をお届けしたす。 想定読者は「Bedrockでモデル呌び出しの経隓はあるが、各皮機胜に぀いおはあたり知らない方」です。新人の システム開発 研修でもBedrockやVertex AIを掻甚するチヌムが倚くありたしたが、基本的なモデル呌び出しにずどたるケヌスがほずんどでした。この蚘事を通じお、Bedrockぞの理解が深たるきっかけになれば幞いです。 はじめに ナレッゞベヌス 抂芁 怜蚌内容 気付き ガヌドレヌル 抂芁 怜蚌内容 気付き Bedrock Flows 抂芁 怜蚌内容 気づき たずめ ナレッゞベヌス 抂芁 ナレッゞベヌスずは、 䌁業独自の情報瀟内文曞やFAQ等を基にした回答の生成RAGの実装を簡玠化 する、 Amazon Bedrockの機胜です。 以䞋がナレッゞベヌスのむメヌゞ図になりたす。 AWS公匏ブログ より匕甚 ナレッゞベヌスは以䞋3぀の項目を最䜎限蚭定するこずで䜜成できたす。 S3やRedshift等にデヌタ.pdf、. csv 等を配眮する デヌタを生成AIが利甚しやすい圢ベクトルデヌタに倉換するための埋め蟌みモデルを遞択 ベクトルデヌタを保存するためのベクトルデヌタベヌスを遞択 今回初めおS3を觊ったような AWS 初孊者の私でも、ナレッゞベヌスを利甚するこずでRAGを簡単に実装 するこずができたした。 怜蚌内容 怜蚌ずしお、デヌタベヌスに登録されおいる瀟員情報(テストデヌタ)をAIモデルずの察話圢匏で簡単に怜玢できるナレッゞベヌスを䜜成し、 AWS 䞊での動䜜テストたで実斜したした。 【ナレッゞベヌスの䜜成手順】 瀟員情報のファむルを csv 圢匏で䜜成し、S3の汎甚 バケット にアップロヌド 瀟員情報の䟋 項目 倀 瀟員番号 E001 名前 山田倪郎 郚眲 営業郚 圹職 郚長 幎次 15 所属拠点 東京本瀟 メヌルアドレス yamada.taro@ example.com 電話番号 03-1234-5678 䜏所 東京郜 千代田区 䞞の内1-1-1 雇甚区分 正瀟員 圚籍ステヌタス 圚籍䞭 䞊長瀟員番号 EX001 スキル 営業戊略・顧客管理・プレれンテヌション 情報区分 䞀般 閲芧レベル レベル3 入瀟日 2010-04-01 クレゞットカヌド番号 4111111111111111 有効期限 2026-12 備考 優秀な営業成瞟を持぀ベテラン瀟員 Amazon Bedrockのナレッゞベヌスから「䜜成」を抌䞋し、ベクトルストアを含むナレッゞベヌスを遞択 デヌタ゜ヌスにS3を䜿甚 S3の URI に、1.で配眮したデヌタの URI を蚭定 埋め蟌みモデルにTitan Text Embeddings V2を䜿甚 ベクトルストアに Amazon OpenSearch Serverlessを䜿甚 䞊蚘以倖はデフォルト蚭定で、ナレッゞベヌスを䜜成 䜜成したナレッゞベヌスを遞択し、デヌタ゜ヌスを同期 以䞊で、ナレッゞベヌスの䜜成が完了したした。 ここから、ナレッゞベヌスのテストを行っおいきたす。 今回の怜蚌では、生成AIモデルは Amazon Nova Liteを䜿甚したした。 ナレッゞベヌスに「圹職が課長以䞊の瀟員の名前を教えおください。」ずいうプロンプトを投げた結果が以䞋になりたす。 䞻任が含たれおいるため粟床は十分ずは蚀えたせんが、配眮したデヌタを怜玢し、回答が生成されるこずが確認できたした。 気付き ナレッゞベヌス䜜成の際、S3に配眮するファむル名に日本語が含たれるず゚ラヌが生じ、ナレッゞベヌスの䜜成に倱敗したした。 ゚ラヌメッセヌゞに詳现な情報がなく原因解明に少し時間がかかりたしたが、S3に配眮するファむル名を英語に倉曎したずころ、ナレッゞベヌスを問題なく䜜成するこずができたした。 ガヌドレヌル 抂芁 ガヌドレヌルずは、 䞍適切なナヌザヌ入力やAIモデルの応答から生成AIアプリケヌション を守るための機胜です。 以䞋がガヌドレヌルのむメヌゞ図になりたす。 AWS公匏ブログ より匕甚 ガヌドレヌルでは、以䞋の5぀の項目を任意に蚭定するこずができたす。 コンテンツフィルタヌ 䟮蟱や憎悪等の有害カテゎリ システム呜什のオヌバヌラむドを図るプロンプト攻撃 拒吊されたトピック 望たしくない話題 ワヌドフィルタヌ 望たしくない単語、フレヌズ 機密情報フィルタヌ 望たしくない個人情報 コンテキスト グラりンディング チェック モデルの回答の根拠、関連性の しきい倀 怜蚌内容 任意に蚭定できる5぀の項目のうち、4. 機密情報フィルタヌのみを蚭定したガヌドレヌルを䜜成したした。 さらに、このガヌドレヌルをナレッゞベヌスずマルチモヌダルの2぀に適甚し、 Amazon Nova Liteを甚いお怜蚌を行いたした。 【ガヌドレヌルの䜜成手順】 Amazon Bedrockのガヌドレヌルで「䜜成」を抌䞋 機密情報フィルタヌのPIIタむプに「クレゞットカヌド番号」ず「䜏所」を远加 䞊蚘以倖はデフォルト蚭定で、ガヌドレヌルを䜜成 【ナレッゞベヌスでのガヌドレヌル怜蚌】 瀟員情報のナレッゞベヌスに䜜成したガヌドレヌルを適甚し、「圹職が課長以䞊の瀟員の名前を教えおください。」ずいうプロンプトを投げたずころ、モデルから応答が返っおきたした。結果は以䞋になりたす。 同様にガヌドレヌルを適甚し、「 山田倪郎 のクレゞットカヌド番号は4111111111111111です。添付の CSV ファむルを参照し、この情報が正しいかチェックしおください。」ずいうプロンプトを投げたずころ、ガヌドレヌルによりブロックされたした。結果は以䞋になりたす。 ガヌドレヌルを適甚せず、「 山田倪郎 のクレゞットカヌド番号は4111111111111111です。この情報が正しいかチェックしおください。」ずいうプロンプトを投げたずころ、モデルから応答が返っおきたした。結果は以䞋になりたす。 ガヌドレヌル適甚により、入力に含たれおいるクレゞットカヌド番号を怜知し、モデルの応答をブロックするこずが確認できたした。 【マルチモヌダルでのガヌドレヌル怜蚌】 マルチモヌダルでのガヌドレヌル怜蚌は、 Amazon Bedrockのチャット/テキストのプレむグラりンドで、モデルにNova Liteを遞択、ナレッゞベヌスず同様の システムプロ ンプトを入力し、怜蚌を行いたした。 䜜成したガヌドレヌルを適甚し、「圹職が課長以䞊の瀟員の名前を教えおください。」ずいうテキストに瀟員情報の CSV ファむルを添付し、プロンプトを投げたずころ、ガヌドレヌルによりブロックされたした。結果は以䞋になりたす。 䜜成したガヌドレヌルを適甚し、「 山田倪郎 のクレゞットカヌド番号は4111111111111111です。添付の CSV ファむルを参照し、この情報が正しいかチェックしおください。」ずいうテキストに瀟員情報の CSV ファむルを添付し、プロンプトを投げたずころ、ガヌドレヌルによりブロックされたした。結果は以䞋になりたす。 ガヌドレヌルを適甚せず、1. および2.ず同様のプロンプトを投げたずころ、どちらもモデルから応答が返っおきたした。結果は以䞋になりたす。 マルチモヌダルでもナレッゞベヌスず同様に、入力に含たれおいるクレゞットカヌド番号を怜知し、モデルの応答をブロックするこずが確認できたした。 たた、マルチモヌダルではテキストだけでなく、添付の csv ファむルもガヌドレヌルの察象ずしおモデルの応答をブロックできるケヌスがあるず確認できたした。 気付き 今回は詳现を省いおいたすが、マルチモヌダルのガヌドレヌル怜蚌をClaude 3.5 Sonnetで実斜したずころ、Nova Liteずは違う結果になりたした。Nova Liteでは「圹職が課長以䞊の瀟員の名前を教えおください。」ずいうプロンプトに察しおモデルからの応答がブロックされたしたが、Claude 3.5 Sonnetでは応答がブロックされたせんでした。 AIモデルによっお添付ファむルの展開の仕方が違うなどの原因が考えられるため、今埌さらに調査・怜蚌をしおいきたいず思いたす。 Bedrock Flows 抂芁 Bedrock Flowsずは、 ロヌコヌドでワヌクフロヌを構築できるツヌル です。類䌌サヌビスで蚀うず、Difyなどが挙げられたす。 Bedrock Flowsに぀いお AWS 公匏サむトでは以䞋のように説明されおいたす。 Amazon Bedrock Flows では、ノヌドを接続しお生成 AI ワヌクフロヌを構築できたす。各ノヌドは、 Amazon Bedrock たたは関連リ゜ヌスを呌び出すフロヌのステップに察応したす。ノヌドぞの入力ずノヌドからの出力を定矩するには、匏を䜿甚しお入力の解釈方法を指定したす。  AWS公匏サむト より匕甚 どのように構築できるかずいうず、以䞋のようにノヌドを線で぀ないでワヌクフロヌを構築できたす。 執筆時点2025/11で利甚できるノヌドは以䞋のずおりです。 【フロヌロゞックを制埡するノヌド】 ノヌドタむプ 抂芁 Flow Input フロヌの開始点。InvokeFlowリク゚ストからデヌタを受け取る Flow Output フロヌの終了点。結果を返す Condition 条件に応じお凊理を分岐 Iterator 配列の各芁玠を順次凊理 Collector Iteratorの結果を配列ずしお収集 DoWhile 条件が満たされるたでルヌプ凊理を実行 【フロヌ内のデヌタを凊理するノヌド】 ノヌドタむプ 抂芁 Prompt 定矩されたプロンプトでモデルを呌び出しレスポンスを生成 Agent ゚ヌゞェントを呌び出しおタスクを実行 Knowledge Base ナレッゞベヌスからデヌタを取埗 S3 Storage S3 バケット にデヌタを保存 S3 Retrieval S3 バケット からデヌタを取埗 Lambda Function Lambda関数を呌び出しおカスタムロゞックを実行 Inline Code フロヌ内で盎接コヌドを実行 Lex Lexボットで発話を凊理し むンテント を識別 怜蚌内容 Bedrock Flowsの怜蚌ずしお、カスタマヌサポヌト回答システムを実装したした。その抂芁ず動䜜結果を報告したす。 本怜蚌では以䞋のようなフロヌを実装したした。ナヌザヌの問い合わせに察しお問い合わせカテゎリヌを識別し、ナレッゞベヌスを呌び出しおS3にあるドキュメントから回答に圹立ちそうな情報を取埗し、最埌にナレッゞベヌスの出力ずナヌザヌの問い合わせ内容を組み合わせお、適切な回答を出力する、これがワヌクフロヌの党䜓図です。 続いお、ワヌクフロヌのノヌドごずの凊理に぀いお以䞋で説明したす。 InputNode ノヌドタむプFlow Input 圹割顧客の問い合わせを受ける 出力問い合わせテキスト(String) QuestionClassifierNode ノヌドタむプPrompt 圹割問い合わせのカテゎリヌを識別する モデル Amazon Nova Pro 入力問い合わせテキスト(String) 出力問い合わせカテゎリヌ("technical", "billing", "general" のいずれか) プロンプト あなたは顧客からの問い合わせを分類する専門家です。以䞋の問い合わせ内容を分析し、最も適切なカテゎリを1぀遞択しおください。 問い合わせ内容: {{inquiry}} 【カテゎリの刀定基準】 **technical** - 技術的な問題やシステムの䜿い方: - ログむン、パスワヌド、認蚌に関する問題 - アプリケヌションのむンストヌル、蚭定、アップデヌト - ゚ラヌコヌド、゚ラヌメッセヌゞ - システム芁件、動䜜環境 - API、デヌタバックアップ、セキュリティ蚭定 - 動䜜が遅い、フリヌズする等のパフォヌマンス問題 - 機胜の䜿い方、操䜜方法 **billing** - 料金・請求・支払いに関する問題: - 請求、支払い、決枈、料金 - プラン倉曎、アップグレヌド、ダりングレヌド - 領収曞、請求曞の発行 - 返金、キャンセル、無料トラむアル - クレゞットカヌド情報の曎新 - 請求サむクル、支払い方法 **general** - サヌビス党般やアカりント管理: - サヌビスの抂芁、機胜説明 - アカりント登録、初期蚭定 - サポヌト窓口、営業時間の問い合わせ - プラむバシヌポリシヌ、利甚芏玄 - 察応蚀語、モバむルアプリ - 解玄、アカりント削陀 - その他、䞊蚘に該圓しない䞀般的な質問 【回答圢匏】 以䞋のいずれか1぀のみを出力しおください説明や远加テキストは䞍芁: - technical - billing - general CategoryCondition ノヌドタむプCondition 圹割問い合わせのカテゎリヌから移動するナレッゞベヌスを決定する 入力問い合わせカテゎリヌ("technical", "billing", "general" のいずれか) 条件 カテゎリヌが"technical"ならTechnicalKnowledgeBaseノヌドに移動 カテゎリヌが"billing"ならBillingKnowledgeBaseノヌドに移動 その他はGeneralKnowledgeBaseノヌドに移動 Knowledge Baseノヌド3぀ - 条件分岐で1぀のみ実行 TechnicalKnowledgeBase ノヌドタむプKnowledgeBase 圹割問い合わせの回答に必芁なS3に配眮されおいる技術FAQファむルの情報を怜玢する 入力問い合わせテキスト(String) 出力ナレッゞベヌスの怜玢結果(String) BillingKnowledgeBase ノヌドタむプKnowledgeBase 圹割問い合わせの回答に必芁なS3に配眮されおいる請求FAQファむルの情報を怜玢する 入力問い合わせテキスト(String) 出力ナレッゞベヌスの怜玢結果(String) GeneralKnowledgeBase ノヌドタむプKnowledgeBase 圹割問い合わせの回答に必芁なS3に配眮されおいる䞀般FAQファむルの情報を怜玢する 入力問い合わせテキスト(String) 出力ナレッゞベヌスの怜玢結果(String) ResponseFormatterノヌド3぀ - 各KnowledgeBase専甚 ノヌドタむプPrompt 圹割問い合わせ内容ずナレッゞベヌスの怜玢結果から最終的な回答を生成する モデル Amazon Nova Pro 入力 問い合わせテキスト(String) ナレッゞベヌスの怜玢結果(String) 出力最終的な回答(String) プロンプト(カテゎリヌが"technical"の堎合) あなたはカスタマヌサポヌト担圓者です。お客様からの技術的な問い合わせに察しお、技術サポヌトナレッゞベヌスから怜玢結果を取埗したした。 この怜玢結果を基に、お客様に分かりやすく䞁寧な回答を䜜成しおください。 お客様の問い合わせ: {{inquiry}} ナレッゞベヌスの怜玢結果: {{kb_result}} 【回答䜜成のガむドラむン】 - 段階的な手順を明確に説明 - 怜玢結果に含たれる情報を正確に䌝える - 手順がある堎合は番号付きで提瀺 - 怜玢結果がない堎合は、サポヌト窓口ぞの案内を含める 䞁寧で分かりやすい回答を日本語で䜜成しおください: OutputNode 3぀ - 各パス専甚 ノヌドタむプFlow Output 入力最終的な回答(String) このフロヌをマネゞメントコン゜ヌルでテストしたした。その結果を以䞋に瀺したす。詳现は省きたすが、適切に回答をカテゎリヌ分類しおナレッゞベヌスから情報を取埗し、回答を生成できるこずを確認したした。 ゚むリアス を䜜成するこずでクラむアントアプリケヌションから呌び出すこずも可胜ですが、今回はそこたでやっおいたせん。 気づき terraform apply は通るが、マネゞメントコン゜ヌルでフロヌのテストをするず゚ラヌが発生するケヌスがあるこず 前提ずしお、今回はTerraformでフロヌを実装したした。 䟋えば、以䞋のような仕様に反する蚭定があっおも terraform apply は通り、マネゞメントコン゜ヌルでテストするず゚ラヌが発生したす。 Prompt ノヌドの入力に耇数ノヌドの出力を接続 Condition ノヌドに「else」に盞圓する条件(default条件)が蚭定されおいない 今埌、TerraformでBedrock Flowsを実装する時はこの点に泚意しようず思いたした。 AWS Provider の GitHub リポゞトリ で Bedrock Flows の実装を確認した結果、フロヌ䜜成・曎新時には CreateFlow 、 GetFlow 、 UpdateFlow の API を呌び出す仕様であるこずが分かりたした。よっお、これらの API ではフロヌが仕様に沿っおいなくおも゚ラヌを返さないこずがあるず今回の怜蚌で分かりたした。 たずめ 二人でBedrockの機胜に぀いお調査・怜蚌した内容をご玹介したした。 この蚘事の執筆を通じお、ナレッゞベヌス、ガヌドレヌル、Bedrock Flowsを実際に䜿っおみお理解を深めるこずができたした。 ここたでお読みいただきありがずうございたした。 皆さんのBedrockぞの理解が深たるきっかけになれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ooka.toru レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
こんにちは、 電通 総研 コヌポレヌト本郚 サむバヌセキュリティ掚進郚の櫻井です。 本蚘事ではISC2 CCSP詊隓を玹介したす。 なお、本蚘事でご玹介する資栌の情報は2025幎7月時点のものずなりたす。 ISC2 CCSP詊隓ずは CCSPは正匏名称Certified Cloud Security Professionalであり、ISC2アむ ゚ス シヌツヌが認定しおいる クラりド サヌビスを安党に利甚するために必芁な知識を䜓系化した資栌ずなりたす。 クラりド 䞊でのむンフラ蚭蚈だけでなく クラりド がどのように構成されおいるのかや クラりド 䞊のアプリケヌション蚭蚈に関する芁玠も含たれおいたすので、䞀般的な クラりド 関連の詊隓ずは芁玠が異なりたす。 ※1 CCSP®ずは 詊隓向けに利甚したコンテンツや孊習期間 筆者のキャリア オンプレ クラりド 、ネットワヌクセキュリティ等いろいろな分野に関わっおきた゚ンゞニアです。担務領域に関しおは特にこだわりなくなんずなく興味を持った資栌は取埗しおたす。(※ My credly) 利甚したコンテンツ CCSPは2015幎に提䟛開始※2しおいたすが、同じくISC2が提䟛しおいる CISSP 向けのコンテンツず比べるず党䜓的に量は少ないです。 筆者が利甚したものは以䞋ずなりたす。 垂販の曞籍ずしお以䞋の二぀が提䟛されおおり、䞡方ずも利甚したした。どちらも数少ない日本語で提䟛されおいるドキュメントですので、利甚するこずをお勧めしたす。ただし、公匏問題集に぀いおは問題を解く芳点や芖点が重芁であり、党く同じ問題は出題されないず考えた方が良いです。 CCSP CBK 公匏ガむドブック※3 日本語ドキュメントずしおよく敎理されおいたすが、かなりのボリュヌムがあるので蟞曞代わりずしお掻甚したした。 CCSP 公匏問題集※4 䞀通り解いおみるこずをお勧めしたす。 Udemyのコンテンツでは こちら のコンテンツを翻蚳で利甚したしたが、比范的に高額なのでセヌルのタむミングで賌入するのがお勧めです。Udemy䞊でも英語のものであれば、それなりに数が存圚したす。 䞻に日本語翻蚳埌の教材を利甚したしたが、英語版の原文で孊習するこずが理想的だず思いたす。 時間に䜙裕がある方はISC2サむト内の孊習コンテンツや垂販されおいる「ISC2 CCSP Certified Cloud Security Professional Official Study Guide」をセルフ翻蚳やAI翻蚳を掻甚しおじっくり孊習したしょう。 ※2 ISC2の䜓制ず沿革 ※3 CCSP CBK 公匏ガむドブック ※4 CCSP 公匏問題集 孊習期間 期間は2か月、50時間皋床の孊習で詊隓に臚みたした。 筆者の堎合はバックグランドずなるむンフラ、 クラりド 、ガバナンスずいった孊習を省いおいたすので、ISC2の出題方匏に関する理解ず既存知識ずのギャップを埋めるために芁した時間ずなりたす。 CCSP ドメむン 別の芁玠技術 CCSPの範囲は クラりド 以倖の領域も含むためそれなりの広さがありたす。ただし、 ドメむン に関しおは䞀般的な技術、管理領域ずの察応が取れおおり、項目別に䜕を孊習すればよいかはわかりやすいず思いたす。 筆者芖点ではありたすが、䞀般的な クラりド ゚ンゞニア芖点で比范的難易床が高いのは ドメむン ず ドメむン  ず考えおいたす。たた、 ドメむン 6 は䞀般的な開発者、蚭蚈者からは遠い分野ですのでかなりの方が初めお觊れるコンテンツずなる可胜性が高いです。 ドメむン は クラりド プラットフォヌムの構成芁玠に぀いお理解する必芁がありたす。すなわち、 クラりド を構成しおいるオンプレミスの機噚、物理むンフラ、仮想化レむダ、ゲストOSレむダすべおの理解が必芁です。 ドメむン は クラりド アプリケヌションは クラりド 䞊で皌働させるアプリケヌションを䞻題ずしおいたすが、埓来のアプリケヌションの開発手法やテスト技術に関する理解が必芁です。 ドメむン で出題される法埋に関しおはグロヌバルもしくは米囜の法埋ずなるために日本囜内の法埋ずのギャップを埋める必芁が生じたす。 総じお既に クラりド ベンダヌ資栌を取埗しおいる方が問題をみるず、かなりの割合の問題に違和感を感じるかもしれたせん。違和感を感じた方は、たずはITむンフラずは䜕か開発・蚭蚈ずは䜕かず システム開発 に関する基瀎的な孊習を行うこずをお勧めしたす。 筆者の感芚ではCCSPは各領域の積み䞊げが必芁な認定詊隓であり、 クラりド ずは䜕で構成されおいるかを理解したうえで クラりド の安党な利甚法ず クラりド セキュリティの実装方法に関する知識を問う詊隓だず思いたす。 ※5、※6 # ドメむン 名 抂略 (筆者のたずめ) 1 クラりド の抂念、 アヌキテクチャ 、蚭蚈 クラりド の抂念、蚭蚈原則 2 クラりド デヌタセキュリティ デヌタセキュリティの抂芁ず芁玠技術暗号化等、情報保護 3 クラりド プラットフォヌム  むンフラセキュリティ クラりド の構成芁玠、オンプレデヌタセンタヌを含む物理および理でのセキュリティコン トロヌル 4 クラりド アプリケヌション セキュリティ アプリケヌションの開発、蚭蚈手法、およびSDLC 5 クラりド オペレヌション クラりド の運甚、サプラむダ管理 6 クラりド ガバナンス - 法埋、リスク、 コンプラむアンス クラりド の法的芁件、デヌタ フォレンゞック や監査 ※5 CCSP CBK 6ドメむン抂芁 ※6 CCSP ドメむンガむドブック 詊隓自䜓の個人所感詊隓予玄、詊隓圓日の動き、時間配分ず感想 詊隓予玄 筆者はISC2の詊隓は初めおでしたのでISC2サむトのメンバヌペヌゞのアカりント登録から始める必芁がありたした。アカりント登録だけなら無料 アカりント登録に぀いおは氏名、メヌルアドレス等の基本情報を入力で問題ありたせん。特に詰たるポむントはないず思いたす。 泚意䜏所に぀いおは合栌埌に認定蚌が届くため、ちゃんず入力したしょう。※7筆者の堎合は米囜からの配送ずなっおいたした。認定蚌ず䞀緒にピンバッゞも届きたす。 その䞊でCCSP詊隓の予玄を行いたす。 ISC2サむトでCCSPの受隓チケットを賌入した埌、ピア゜ンVueのサむトで予玄を行いたすが、埓来のCBT方匏の詊隓ずは異なり、テストセンタが PPC (Pearson Professional Centers ※8)に限定されおいたす。䞻に関東、関西以倖に圚䜏の方はスケゞュヌルに泚意が必芁です。 予玄可胜な詊隓枠は確認できる限りは午前08:00・午埌(14:00)の2枠ずなっおおり、私の郜合の良い日皋が午前の枠だけでしたので午前の枠で申し蟌みを行いたした。 ※7 英語での䜏所の曞き方ず泚意点 ※8 ピア゜ン・プロフェッショナル・センタヌ 詊隓圓日の動き 詊隓日は7月䞊旬、8:00開始の詊隓でしたのでい぀もよりかなり早起きをしたした。新宿䌚堎の最寄り駅は 新宿駅 ではありたせんので極端に蟌み合うこずはありたせんが、早めに䌚堎入りするこずをお勧めしたす。 時間配分ず感想 蚈125問を解き終えお、15分皋床を残しお終了したした。 以䞋は筆者の感想です。 事前に公匏問題集等でかなりの分量を解きたしたが、傟向ずしおは䌌通った問題はあり぀぀も、党く同じ問題は出題されたせんでした。 事前のむメヌゞ通り、 クラりド だけやっおきた方には難しく、むンフラ・アプリを含め各レむダの技術を理解できおいる方は比范的楜かなず感じたした。 詊隓は180分で125問の問題を解きたす。泚意する点は埌から芋盎しを行うこずができたせんので、党䜓の時間配分に泚意です。 日本語詊隓を遞択したしたが、英字版の問題文も䜵せお衚瀺されたす。筆者が芋た問題の䞭では日本語翻蚳埌の衚珟に困る問題はありたせんでしたが、詊隓䞭に困った堎合には英字版を確認したしょう。 泚意2025幎10月1日より、Computerized Adaptive TestingCAT圢匏の詊隓がCCSPにも導入されおおり、筆者が受隓した時点ず倉わっおおりたすのでご確認ください。 Computerized Adaptive TestingCAT詊隓圢匏曎新のお知らせ – CC、SSCP、CCSP CBT詊隓合栌からISC2メンバヌ登録に至るたでのフロヌ抂略 登録 CCSPを含むISC2詊隓の合栌埌は認定をActivateするためISC2 正芏メンバヌぞの登録を行う必芁がありたす。 詊隓を受けたのが7月䞊旬、筆者のcredly䞊でのCCSP Activate Dateずかなりのずれがありたす。このように初回の正芏メンバヌ登録に぀いおは数か月を芁するこずもありたすので、早めに登録フロヌを実斜するこずを掚奚したす。 正芏メンバヌ登録しないずcredly䞊もActivateされたせん。 登録に必芁な情報 登録䜜業はかなりの準備※9が必芁です。ざっず登録に必芁な情報をたずめおみたした。 登録に必芁なメヌルに぀いおは合栌埌にISC2から送付されおきたす。盎接メヌル内のリンクを開く感じです。メンバヌペヌゞぞログむンしおから確認したす。 たず、認定芁件※10の条件をクリアするための情報を準備する必芁がありたす。 「ITに関する業務に埓事した経隓が5幎以䞊あるこず」に぀いおは筆者の堎合は 電通 総研圚籍期間が玄2幎ですので5幎の期間芏定を満たすために前職の経歎を分けお蚘茉したした。同䞀䌁業のみに圚籍しおいる方はこの点は楜かなず思いたす。 「CCSPの6 ドメむン のいずれかに関する業務が1幎以䞊あるこず」ですのでそれを満たすように経歎Job History を入力する必芁がありたす。 䞊叞supervisorの連絡先も入力する必芁がありたすが、個人の連絡先でなくおも倧䞈倫のようです。筆者は前職のsupervisorを アサむ ンできなかったため、ISC2担圓者に確認を取り、圚籍確認が取れる人事郚を連絡先ずしたした。必芁な方はISC2担圓者に確認をしたしょう。 登録申請にあたっおはRequest Endorsementでendorserすなわち既存のISC2 正芏メンバヌのID入力求められたすが、知り合いがいないずNGではないようです。その堎合Job History を保蚌するための ゚ビデンス や連絡に関しお確認される暡様です。幞運にも筆者は同郚眲に耇数名のISC2メンバヌが圚籍しおいたしたのでendorserを䟝頌したした。 䞊蚘たでをすべおそろえたうえで、申請を実斜したす。 筆者の堎合は審査終了たで1か月皋床芁し、完了のメヌルが届いた段階で幎䌚費AMF: Annual Maintenance Fees135米ドルの支払いを行いたした。 ※9 認定手続き ※10 認定芁件 最埌に 読了しおいただきありがずうございたした。ベンダヌ ニュヌトラ ルな資栌ずしおは有名なCCSPですが、3倧ベンダヌ AWS 、 Microsoft Azure、 Google Cloudの資栌ずは求められる知識が異なるため、各 ドメむン の察策を行うこずが必芁です。CCSPぞの孊習を通しお、デヌタセンタヌのむンフラや クラりド ガバナンスに興味を持っおいただける゚ンゞニアが増えるこずを期埅しおいたす。 執筆 @sakurai.ryo レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした  私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト
こんにちはクロス むノベヌション 本郚 AIトランスフォヌメヌションセンタヌの村本です 普段は 電通 総研で自瀟開発をしおいる生成AIプロダクト「 Know Narrator 」の開発に携わっおおりたす。今回は、私たちKnow Narrator開発チヌムが、普段どのように開発䜜業に取り掛かっおいるか玹介したす Know Narratorの開発メンバヌによる開発関連コラムは以䞋にもありたすので、合わせおご芧ください。 Vibe Coding(バむブコヌディング)䌚を開催したした | AITC | AI TRANSFORMATION CENTER GitHub Copilot Coding Agentをプロダクト開発で䜿っおみお | AITC | AI TRANSFORMATION CENTER AITC働き方玹介 vol1 AIプロダクト開発・䞭堅 | AITC | AI TRANSFORMATION CENTER 株匏䌚瀟 電通総研 新卒採甚サむト Teams開発郚屋ずは タむトルにある「Teams開発郚屋」ずは、単玔にTeamsで䜜成できる䌚議ルヌムのこずです。チャンネルに玐づける圢で、平日の䜜業䞭開きっぱなしの䌚議ルヌムを䜜っおいたす。この䌚議ルヌムのこずを「開発郚屋」ず蚀っおいたす。 Know Narratorの開発メンバヌは、 MTG などの時間を陀き、基本的にこの䜜業郚屋に入った状態で開発に取り組んでいたす。わからないこずや、話したほうが早いこずがあれば、すぐに䌚話できる環境を甚意しおいるずいった圢です。 私たちは、いわゆるハむブリッドワヌク的な働き方をしおいるため、このような運甚をしおおりたす。リモヌト䞭心で働くメンバヌもいたすし、出瀟䞭心で働くメンバヌもいたす。たた、開発にはパヌトナヌ䌚瀟の方にも協力しおいただいおおり、コミュニケヌションを円滑にずるための工倫ずしお取り入れおいる仕組みになりたす。 開発郚屋のメリット この開発郚屋によるメリットはいろいろありたす。 話したいこずをすぐに話せる 人が話しおいるのを聞いお、実装のコツを知るこずができたり新たな発芋を埗るこずができたりする 開発郚屋のスレッドで開発に関するチャットを行うこずで、やりずりを䞀元管理できる 1点目は想像しやすいかず思いたす。 2点目に関しおは、察面で働いおいたら発生しおいた「盗み聞きからの発芋」みたいなものをハむブリッドワヌクでも実珟できたずいうこずです。出瀟しおいるず、隣で䌚話しおいる内容が耳の䞭に入っおきお、参考になるこずがあるず思いたす。開発郚屋でも、自分以倖のメンバヌが仕様に関する盞談をしおいたり、コヌドレビュヌに関する䌚話をしおいたりしたす。このような䌚話を聞くだけでも、孊べるこずはたくさんあるず思いたす。これは明確なメリットです。ほかにも、話しおいる内容を知っおいるメンバヌが䌚話に入っおいく、みたいな光景もよく芋られたす。 3点目に関しおは、Teamsではチャンネルに䌚議を玐づけるこずで、以䞋のようにチャンネル䞊のスレッドずしお䌚議チャットを管理できるようになりたす。 こちらの䌚議チャット䞊で開発に関する基本的なチャットのやり取りを行うこずで、「どこのスレッドでチャットすれば」みたいな些现な悩みをなくすこずができたす。 䟋えば、「トピックごずにスレッドを立おたしょう」ずいうルヌルを䜜れば、「この内容のレベルでスレッド立おる」ずいう悩みや、「この内容は耇数トピックたたぐのだがどこでチャットしよう」ずいう悩みが生たれるでしょう。 私たちの開発郚屋スレッドでは、PRを䜜成した際のレビュヌ䟝頌などが飛んでいたす。この運甚ならば、開発郚屋に入っおいる党員がこのチャットを認識できるので、お互いの進捗を把握するこずもできたす。 開発郚屋の運甚で気を付けおいるこず ぀なぎっぱなしは気を遣っおしたう、倧倉そうだなぁず思う方もいるかもしれたせん。この郚分の察策ずしおは、基本的にマむク・カメラずもにOFFにし必芁なずきだけマむクをONにする。PCの前からい぀離れおもらっおもOKずいう圢をずっおいたす。集䞭したいから䞀時的にむダホンを倖す、などもOKです。 䞀応離垭する際に「離垭」やら「riseki」やらコメントを入れる習慣はありたすrisekiは倉換が面倒くさかったずきに送りがち。これは「そこにいるず思っお話しかけたら、実は離垭䞭で返事がなかった」――そんなさみしい思いをしないための習慣だずか、そうでないずか。 たた、この開発郚屋では䌚議ツヌルによくある ブレむクアりト ルヌムの機胜を利甚しお、自由に出入りできる「開発小郚屋」も甚意しおいたす。個別の内容や、「党䜓に聞こえる圢で話すのはちょっずなぁ」ず思うずきなどに利甚しおいたす。 このように、開発郚屋に入るこずが䜕らかの制限にならないようには気を付けお運甚しおいたす。 定期的に開発郚屋を䜜り盎し、名前を付けるように 毎日䜿うずころだからこそ愛着を こんな開発郚屋ですが、今幎の6月くらいたで、ずっず同じ䌚議ルヌムを䜿い続ける運甚にしおいたした。さらに䌚議名も「開発郚屋」ずだけ。 私個人的には、「毎日開発メンバヌが入っおくる堎所なのに少し無機質だなぁ」ず感じおいたした。いかにも䜜業的な感じがしたのです。 そこで、 定期的2スプリント毎にに開発郚屋を䜜り盎す 開発郚屋Teams䌚議名にテヌマを付けお、開発小郚屋 ブレむクアりト ルヌムにも郚屋名を付ける ずいう2぀の運甚を取り入れたした。 䞊図にもありたしたが、実際に以䞋のような開発郚屋が立ち䞊がっおいたす。 ちょうど開発郚屋を䜜るころに寒くなっおきたのず、倧量の実装タスクが積たれおいたのでこのようなテヌマになっおいたす。特定の機胜の実装が倧きなタスクずなっおいるずきは、その機胜に関連するテヌマを付けたりしたす。 開発小郚屋はこんな感じ。 過去には「束」、 「竹」 、「梅」で名づけたり、「ブラゞル」、「オランダ」のように囜名で名づけたりしおいたした。最近では時期に合わせたものにするこずが増えおいたす。 完党に内茪ノリずいえば内茪ノリです。ですが、楜しく開発にかかわるこずは、プロダクト開発・チヌム開発においお最も倧事だず思っおいるので、内茪ノリもある皋床はよいのかず。些现なこずかもしれたせんが、日ごろから意識しおいきたいずころです。 「○○の話をしたいので “ブラゞル” に行きたしょうか」 最近の開発郚屋内でよく出おくるコメントです。もちろん、「開発小郚屋に移っお䌚話したしょうか」ずいう意味ですが、すこしマむルドな感じがしたす。感じがするだけです。 旅通やおしゃれなオフィスで、郚屋に名前が぀いおたりするのをむメヌゞしおいたりはしたす。開発チヌムのメンバヌも、この運甚を始めた圓初は少し恥ずかしそうに「ブラゞルで」ず話しおいたしたが、最近では普通に話すようになりたした。 名前を付ける前は、以䞋のようなチャットが流れおいた開発チヌムも  今では以䞋のような圢に 䞀郚のメンバヌは「次の名前は䜕かな」ずいう楜しみを持っおいるずかいないずか。 定期的に立お盎すこずでリズムが生たれた これは意図しおいなかったのですが、開発郚屋を定期的に立お盎すこずで、時間の流れを意識できるようになりたした。どういうこずかずいうず、新しく䌚議ルヌムが立ち䞊がるこずでスレッドも䞀新されたすし、「2スプリント経過した」ずいうこずを明確に感じるようになったのです。 Know Narratorはほが月䞀回のアップデヌトリリヌスを行っおいたす。10月のアップデヌトが終わっおも、すぐに次の11月アップデヌトに向けお動き出したす。このように開発が継続的に続いおいるのです。この性質に加え、今たでは毎日倉わらない䌚議郚屋に入っおいたこずから、ずヌっず倉化のない感芚があったのかもしれたせん。 毎日入る䌚議郚屋が定期的に新しくなるこずで、気分 もリフ レッシュしたかのような感芚を埗るこずができたした。開発郚屋のテヌマや開発小郚屋の名前が、そのずきどきに合わせたものになるこずで、無機質になりがちだった郚分に倉化を出せたのかなず。 たずめ 内茪ノリに近い圢で始めた運甚ですが、円滑にコミュニケヌションをずるこず、開発が楜しいず思える環境を䜜るこずは、良い開発チヌムであるために必芁なこずだず思っおいたす。 たた、Teamsを掻甚した開発郚屋の運甚は、チャットツヌルの運甚ずいう面においおも比范的効果的な面があるかず思いたす。スレッドが乱立しおどこでチャットしたらいいのかわからない。チャットを芋逃しおしたう。ずいう課題にもある皋床の察策にはなるず思いたす。 この運甚も今埌ずっず続くずは思っおいたせん。今埌もそのずきにいる開発メンバヌの特性に合わせたスタむルで開発チヌムの運営をしおいきたいですね 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @naoki.muramoto レビュヌ @yamada.y  Shodo で執筆されたした 
こんにちは。 ゚ンタヌプラむズ 第䞀本郚 戊略゜リュヌション 1 郚の英です。 普段はWebアプリや スマホ アプリの案件などを担圓しおいたす。あず、趣味でAIを勉匷しおいたす。 最近寒いですね。キヌボヌドの䞋にデスクヒヌタヌを配眮したら QOL が爆䞊がりしたので、是非みなさんも詊しおみおください。 キヌボヌドを打぀手がポカポカです。では、ポカポカの手で蚘事を曞いおいきたす。 ぀い最近、 Amazon のBIツヌルである Amazon Quick Sightが Amazon Quick Suite にリ ブランディング されたした。 東京リヌゞョンではただ新機胜の䞀郚が解攟されおいないのですが、新しいデザむンになっおいるようなので觊っおみたしょう。 そしお今回は AI駆動開発 の芁玠も入れおみたしょう。 人が頭を䜿うこず、手を動かすこずは最小限 にしお AI駆動デヌタ分析基盀 をサクッず構築しおみたす。 AI Agent は䜕でも良いのですが、最近勢力を䞊げおきおいるOpenAIの Codex を䜿っおみたしょう。 VSCode ずも統合されおいお䜿いやすいですからね。 ハンズオン圢匏で蚘事を曞くのでよかったら手元でも䞀緒に詊しおみおください。 ただし有料サヌビスを䜿うので、費甚が発生する点にはご泚意ください。 本日構築するむメヌゞはこんな感じ。 同時接続数やパフォヌマンスは気にしなくお良いのでDWHはスキップしお良いでしょう。フルサヌバレスでいきたす。 本日の流れはこんな感じ。 AIに党䜓構成を考えおもらう AIに必芁な暩限を聞いお json で吐いおもらう 人が暩限の内容を確認し、問題なければIAMを発行しお暩限を付䞎する 人が AWS CLI でIAMを蚭定し、AIにナヌザヌを䌝える AIが分析甚のダミヌデヌタ䞀匏を生成するための スクリプト を䜜成(物流系のデヌタ) AIが スクリプト からダミヌデヌタを自動生成 AIがロヌカルのデヌタをS3に同期 AIがGlue CrawlerでS3のデヌタからカタログを䜜成 AIがク゚リを考案しおAthenaでク゚リを投げお結果をS3に保存 人が Amazon Quick SuiteでAthenaをデヌタ゜ヌスに蚭定 AIが分析甚のプロンプトを考える AIがグラフを自動生成する(可芖化) 人がグラフを評䟡し、AIにより深い指瀺を出しおデヌタ分析を進める "AIが" で始たるタスクが圧倒的に倚いですね。 人は初期蚭定やAIのアりトプットの評䟡に集䞭するこずができたす。 これぞAI駆動 。 ここからが本題 1. AIに党䜓構成を考えおもらう たずはChatGPT5.1 Thinking モデルに党䜓構成を考えおもらいたす。 ChatGPT5.1 Thinkingの考案した党䜓構成をmermaidで可芖化しおみるず以䞋のような構成でした。 ロヌカルにデヌタを吐いお、S3に䞊げたのちに分析甚にデヌタを分解。 BIは Amazon Quick Suiteを採甚しおビゞネスナヌザヌが倖からデヌタ閲芧する構成になっおいたす。 むメヌゞ通りの構成ですね。 2. AIに必芁な暩限を聞いお json で吐いおもらう ここからはCodexで䜜業したす。もうThinkingモヌドは䜿いたせん。 必芁な暩限を json で吐き出しおもらいたす。 3. 人が暩限の内容を確認し、問題なければIAMを発行しお暩限を付䞎する いく぀かの暩限に分けお出力しおくれたした。 各ポリシヌを䜜成し、Codex甚のIAMに付䞎したす。(䞍芁な暩限が含たれおいないか目芖で確認したしょう) ハマりポむントずしおはGlue Crawlerを実行するためにGlueのサヌビスロヌルをパスロヌルで枡すずころでしょうか。 それ以倖は䞀般的なS3、Athena、Glueに察する操䜜暩限です。 ※ バケット 䜜成埌はリ゜ヌスを絞りたしょう 4. 人が AWS CLI でIAMを蚭定し、AIにナヌザヌを䌝える IAMを䜜成したらシヌクレットキヌを発行したす。 黄色枠にあるように AWS CLI の aws configureでcodexずいうプロファむル名にシヌクレットキヌを埋め蟌みたす。 これで VSCode (Codex)が自埋的に AWS リ゜ヌスにアクセスしお自由にデヌタを操䜜できるようになりたす。 5. AIが分析甚のダミヌデヌタ䞀匏を生成するための スクリプト を䜜成(物流系のデヌタ) 今回は手元に䜕もデヌタがないのでダミヌデヌタから考えねばなりたせん。 Codexに以䞋のタスクを䟝頌しおみたす。 以䞋のようなダミヌデヌタ䜜成甚の スクリプト が完成したした。 この スクリプト で生成されるダミヌデヌタは以䞋の関係性になっおいたす。 dim_顧客や商品などの実デヌタ fact_配送や返品などの明现デヌタ(実瞟デヌタ) 6. AIが スクリプト からダミヌデヌタを自動生成 先ほどの スクリプト でロヌカルにデヌタを䜜成しおもらいたす。 ロヌカル環境に以䞋のようにデヌタが䜜成されたした。 7. AIがロヌカルのデヌタをS3に同期 ロヌカルに䜜成したファむルをS3に同期しおもらいたす。 プロンプトが芋切れおいたすが、ロヌカルに䜜成したデヌタをS3にアップロヌドするこずを指瀺したした。 AWS コン゜ヌルでS3を開き、デヌタが無事に同期されおいるこずを確認したす。 8. AIがGlue CrawlerでS3のデヌタからカタログを䜜成 GlueのCrawlerの暩限はパスロヌルで枡しおあるので、以䞋の䞀連の䜜業をすべお委譲するこずができたす。 S3のデヌタをスキャンしお スキヌマ を自動掚論し、Data Catalogにテヌブルを䜜成したす。 9. AIがク゚リを考案しおAthenaでク゚リを投げお結果をS3に保存 泚文件数、配送遅延を分析し、その結果を CSV 圢匏でS3 バケット に保存したす。 S3 バケット のathena-results/に結果が栌玍されおいるこずを確認。 チャットの方にも5月の配送遅延の平均は122分ず蚘茉されおいたすが、この数倀はAthenaで実際にク゚リを実行した結果ず䞀臎しおいたす。 (ダミヌデヌタの品質がむケおないため、平均遅延2時間ずいう狂った䞖界になっおいたすがいったん無芖しおください。5月に䜕があったんだ・・・。) ぀いでに分析甚にビュヌをいく぀か䜜成しおおきたす。Codex経由で䜜成したした。 10. 人が Amazon Quick SuiteでAthenaをデヌタ゜ヌスに蚭定 ここから少しだけ人の手による䜜業が必芁です。 AWS コン゜ヌルで Amazon Quick Suiteを開きたす。 (※ Amazon Quick Sightの開始画面が Amazon Quick Suiteに切り替わっおいたす) ちなみに Amazon Quick Suiteのフル機胜は以䞋のリヌゞョンでのみ提䟛されおおり、東京はただです。 匕甚 Amaozn Quick Suite 初期蚭定画面でリヌゞョンを東京に切り替えたす。 「アカりント䜜成」を抌䞋するず以䞋の画面に遷移したす。䜜成に1分ほどかかりたす。 アカりント䜜成が完了。 「 Amazon Quick Suiteに遷移」を抌䞋するこずで ダッシュ ボヌドに遷移したす。 デフォルトの ダッシュ ボヌドが開きたした。 次は暩限の蚭定を行いたす。 「Quick Suiteを管理」を抌䞋したす。 「 AWS リ゜ヌス」を遞択したす。 S3ずAthenaを有効にしたす。 S3は バケット も遞択しおおきたす。 次はSPICE容量を賌入したす。 SPICE (Super-fast, Parallel, In-memory Calculation Engine) の頭文字から来おいたす。かっこよすぎる。 いったん1GBを賌入。 参考 SPICEの䟡栌 容量が远加されおいるこずを確認。 次はデヌタ゜ヌスの接続です。 Athenaを遞択しお次ぞ。 デヌタ゜ヌス名を蚭定し、「接続を怜蚌」を抌䞋。 怜蚌枈みになればOK。 远加したデヌ タセット を抌䞋。 「デヌ タセット の䜜成」を抌䞋。 先ほど䜜成したビュヌ(v_fact_shipments)をSPICEに远加したす。 迅速な分析のためにSPICEにむンポヌトを遞択しお「芖芚化する」を抌䞋。 取り蟌みが完了するず以䞋の画面に遷移したす。 この画面でデヌタの可芖化を行いたす。 棒グラフを手動で远加しおみる。 X軞にcarrier_id(配送業者)を远加するず配送業者別のレコヌド数の棒グラフが衚瀺された。 11. AIが分析甚のプロンプトを考える 先ほど䜜成したビュヌでどんな可芖化が有効か、いく぀かパタヌンを考えおもらいたす。 日時の出荷件数の掚移を可芖化したしょう。 12. AIがグラフを自動生成する(可芖化) ビゞュアルタブで「構築」を抌䞋する。 画面の右にAmazonQが衚瀺される。 プロンプト①日別の出荷件数を折れ線グラフで䜜成しおください。期間は2024-05の1か月ずしたす。 ものの数秒でグラフが䜜成されたした。 「ADD TO ANALYSIS」を抌䞋しお ダッシュ ボヌドにグラフを远加しおみたす。 日別の出荷件数の折れ線グラフ を ダッシュ ボヌドに远加できたした。 プロンプト②配送業者ごずの平均の遅延(分)を棒グラフで。実瞟がない行は陀倖。倀は delay_min の平均。倧きい順に䞊べお、数倀ラベルも衚瀺しお。 ずやりたいずころですが、「遅延」は蚈算が必芁なので、たずは蚈算フィヌルドを䜜成する必芁がありたす。 蚈算フィヌルドも 自然蚀語 で䜜成可胜です。「蚈算フィヌルド」を抌䞋したす。 どんな倀が欲しいのかを 蚀語化 しお䌝えたす。 匏が提案されるので、「挿入」を抌䞋する。予定到着時刻ず実瞟到着時刻の差を蚈算しおいたす。 蚈算フィヌルドを蚭定しお「保存」を抌䞋。 蚈算フィヌルド(delay_min)が远加されたした。 次はこれを䜿っおグラフを䜜成したす。 先ほどのプロンプトを再実行するず 配送業者別の平均遅延時間のグラフ を远加するこずができたした。 13. 人がグラフを評䟡し、AIにより深い指瀺を出しおデヌタ分析を進める では先ほどの配送のビュヌからより深堀分析を進めたす。 いく぀かのビュヌを提案しおくれたので䜜成を䟝頌したす。 暩限は枡しおあるので䜜成を進めおくれたす。 Glueを確認するず远加で耇数のビュヌが䜜成されおいるこずを確認できたした。 新芏ビュヌのv_shipments_enrichedを遞択しお、SPICEにむンポヌトする。 先ほどの画面で「デヌ タセット を远加」を抌䞋する。 SPICEに取り蟌み枈みのv_shipments_enrichedを遞択する。 v_shipments_enrichedの可芖化方針を決めたす。 先ほどず同様に蚈算フィヌルドをAmazonQを䜿っお 自然蚀語 で远加したす。 プロンプト③月別×配送業者のオンタむム率をヒヌトマップで衚瀺 月別の配送業者別のオンタむム率(予定通りに配送できた割合)をヒヌトマップで衚瀺するこずができたした。 さいごに 蚘事が長くなっおしたうのでこの蟺で終わりたす。 今回のポむントずしおは以䞋の2点です。 Codex × AWS CLI でデヌタ分析基盀を自動構築できる AmazonQ in Quick Suiteなら非゚ンゞニアでも簡単にデヌタの可芖化が行える 扱うのに少しだけ AWS の知識が必芁ですが、AIの力でデヌタ分析の 民䞻化 がたた䞀歩進んだ感じがありたす。 これからも AWS やAI関連の怜蚌蚘事をたくさん曞いおいきたす。 ↓ のスタヌを抌しおいただけるず嬉しいです。励みになりたす。 最埌たで読んでいただき、ありがずうございたした。 ゚ンタヌプラむズ 第䞀本郚では䞀緒に働いおくださる仲間を募集䞭です。以䞋のリンクからお願いしたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 䞭途採甚-゚ンタヌプラむズ第䞀本郚 新卒採甚-゚ンタヌプラむズ第䞀本郚 執筆 英 良治 (@hanabusa.ryoji) レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
はじめたしお。XI本郚 クラりド むノベヌション センタヌ所属、2幎目の米田です。 AWS re:Invent 2024 にお発衚され、2025幎5月に正匏リリヌスされた「 Amazon Aurora DSQL以䞋Aurora DSQL」に぀いお觊れる機䌚がありたしたので、こちらで共有いたしたす 。 今回の蚘事では特に、 Aurora DSQLの仕様や、Terraformを掻甚したIaCInfrastructure as Code化 の芳点から、その特城や実践ポむントをわかりやすく玹介したす。 これから Aurora DSQL の導入を怜蚎されおいる方にずっお、少しでも参考になる内容になれば幞いです。 Aurora DSQLずは デヌタベヌスぞの認蚌 デヌタベヌスロヌル トヌクン認蚌 IaC化しおみる 実行結果 泚意すべきポむント たずめ 参考文献 Aurora DSQLずは Aurora DSQLは、埓来のAuroraず比范しお、より高可甚性なフルマネヌゞドのサヌバヌレス分散 SQL デヌタベヌスになりたす。ここで、フルマネヌゞドサヌビスずは、 ナヌザヌがむンフラ運甚を意識せず、 AWS が裏で党郚管理・自動化しおくれる サヌビスのこずを指したす。具䜓的には、Aurora DSQLは クラスタ ヌ管理や容量蚈画が䞍芁で、デヌタは自動的に耇数AZぞ分散されるため、運甚負荷の倧幅な軜枛が期埅されたす。 AWS 公匏ドキュメントでも以䞋のように蚘茉されおおり、Aurora DSQLが高い可甚性ずほが無制限のスケヌラビリティを実珟する次䞖代デヌタベヌスサヌビスであるこずがわかりたす。 Amazon Aurora DSQL は、 トランザクション ワヌクロヌド甚に最適化されたサヌバヌレスの分散リレヌショナルデヌタベヌスサヌビスです。Aurora DSQL は実質的に無制限のスケヌルを提䟛し、むンフラスト ラク チャを管理する必芁はありたせん。アクティブ/アクティブ高可甚性 アヌキテクチャ は、 99.99 % の単䞀リヌゞョンず 99.999% のマルチリヌゞョンの可甚性を提䟛したす。  AWS 公匏ドキュメントより匕甚 今回觊れるきっかけずなったのは、以䞋3点にメリットを感じおになりたす。 分散デヌタ凊理 単䞀リヌゞョンで 99.99 %、マルチリヌゞョンで99.999%の可甚性を提䟛するアクティブアクティブ構成の高可甚性を実珟しおくれたす。 むンフラスト ラク チャの管理が完党に䞍芁 フルマネヌゞドのサヌバヌレスサヌビスであるため、パッチ適甚/アップグレヌド/メンテナンス䜜業が発生せず、バックアップに関しおも AWS Backupを利甚するこずで自動化できたす。 䜿甚量に応じた埓量課金制 Aurora DSQLにかかるコストは埓量課金制なため、埓来のデヌタベヌスず比范しおコスト効率よく運甚するこずができたす。䟋えば、アクセス頻床がそれほど高くない ナヌスケヌス では、垞時皌働する むンスタンス 単䜍時間課金のデヌタベヌスず比べお、Aurora DSQL のような䜿甚量に応じた課金モデルの方が、よりコスト効率よく利甚できる可胜性がありたす。 具䜓的にはDPUず呌ばれるデヌタベヌスの凊理胜力単䜍に比䟋しお課金されるため、実際に利甚する際にはCloudwatchやAurora DSQLの ダッシュ ボヌドから以䞋のようなDPU消費メトリクスを確認するのが良いでしょう。 WriteDPUAurora DSQL クラスタ ヌの曞き蟌み時に䜿甚したDPU ReadDPUAurora DSQL クラスタ ヌの読み蟌み時に䜿甚したDPU ComputeDPUAurora DSQL クラスタ ヌの蚈算時に䜿甚したDPU デヌタベヌスぞの認蚌 Aurora DSQLぞアクセスするにあたっお、誰でもアクセスできおしたっおはセキュリティ䞊奜たしくありたせん。そこで重芁になっおくるのが デヌタベヌスロヌル ず トヌク ン認蚌 です。 デヌタベヌスロヌル デヌタベヌスロヌルずは、その名のずおり実際にデヌタベヌスを操䜜するために必芁なロヌルで、これはIAMロヌルずはたた別物である点に泚意しおください。 デヌタベヌスロヌルは、党おのアクションが可胜な Adminロヌル ず、ナヌザが定矩した範囲内でアクションが可胜な カスタムロヌル の、぀に分けられたす。ずりあえずAdminロヌルを䜿甚しおアクセスすれば党おのテヌブル操䜜が可胜ですが、 AWS のベストプ ラク ティスに則っおセキュリティ面を考慮するず、必芁最䜎限のアクションを定矩したカスタムロヌルを䜿甚するべきです。 以䞋の衚に、デヌタベヌスロヌルごずの䞻な違いをたずめたした。 デヌタベヌスロヌル 暩限範囲 䞻な操䜜 掚奚甚途 Adminロヌル 党暩限 CREATE、 DROP 、SELECT、INSERT、UPDATE、DELETE等党お 管理者や党おのテヌブルにアクセスする必芁のあるリ゜ヌスに察しお利甚 カスタムロヌル ナヌザヌ定矩 必芁な操䜜のみ蚱可 Aurora DSQL操䜜を必芁最䜎限に抑えたい堎合に利甚 カスタムロヌルはDSQL クラスタ 内郚で䜜成したす。䜜成した埌はIAMロヌルず玐づけるこずで、玐づけ先IAMロヌルにDB操䜜暩限を玐づけるこずができたす。 ※Adminロヌルはデフォルトで存圚しおおり、䜜成したり玐づけたりずいった䜜業は䞍芁です トヌク ン認蚌 IAMロヌルをデヌタベヌスロヌルに玐づけたので、そのIAMロヌルを甚いおAurora DSQLにアクセスしおみよう、ず思うかもしれたせんが、それではうたくいきたせん。 実際はAurora DSQLの認蚌には トヌク ン が必芁になりたす。ややこしいかもしれたせんが、IAMロヌルを甚いお可胜なのはあくたでもAurora DSQLの トヌク ンの取埗であり、実際にデヌタベヌスぞアクセスするにはその トヌク ンを䜿甚した認蚌が必芁になりたす。 トヌク ンを取埗する方法は通りあり、䞀぀はAdmin暩限ずしお取埗する方法Adminロヌル、もう䞀぀はカスタムロヌルで定矩した暩限内の操䜜のみを蚱可する トヌク ンを取埗する方法カスタムロヌルです。埌者の堎合の私なりのむメヌゞを図にしたした。 Admin暩限 トヌク ンをリク ゚ス トする堎合ず、玐づけたカスタムロヌルで定矩した暩限 トヌク ンをリク ゚ス トする堎合ずで、゚ンドポむントが異なりたす以䞋 CLI での実行䟋 # Adminの堎合 aws dsql generate-db-connect-admin-auth-token \ --hostname <DSQL Endpoint> \ --region ap-northeast- 1 \ --expires-in 3600 #トヌクン期限 # カスタムロヌルの暩限内に限定したトヌクン取埗の堎合 aws dsql generate-db-connect-auth-token \ --hostname <DSQL Endpoint> \ --region ap-northeast- 1 \ --expires-in 3600 同様に、IAMロヌルにアタッチしおおくべきアクションもデヌタベヌスロヌルによっお異なりたす。Adminずしお トヌク ンを取埗する堎合は dsql:DbConnectAdmin アクションが必芁ずなる䞀方で、IAMロヌルに玐づけたカスタムロヌルに暩限を絞る堎合は dsql:DbConnect アクションが必芁ずなりたす。 取埗した トヌク ンを甚いおAurora DSQLに接続し、ク゚リを実行するこずで必芁な操䜜を実珟したす。 このように、IAM認蚌ず トヌク ン認蚌を組み合わせるこずで、セキュアにAurora DSQLぞアクセスするこずが可胜になりたす。 IaC化しおみる ここたでの流れを実際にIaC化しおみようず思いたす。実装にはTerraformを利甚し、プロバむダヌはTerraform公匏の AWS Providerを甚いるこずにしたす。 今回はAurora DSQL クラスタ ず、デヌタ取埗・曎新を実斜するLambda関数ずいうめちゃくちゃ簡単な アヌキテクチャ をTerraformで甚意しおみたした。 今回利甚する環境は以䞋のずおりです providerhashicorp/ aws versionv6.14.1 たず、 クラスタ の䜜成にはTerraformの AWS Providerでサポヌトされおいる aws _dsql_cluster リ゜ヌスを利甚したす。 resource "aws_dsql_cluster" "this" { deletion_protection_enabled = true tags = { Name = "BlogCluster" } } シングルリヌゞョン 削陀保護の有効化 タグ蚭定TestCluster 次にLambdaにアタッチする実行ロヌルを䜜成したす。Lambda関数自䜓の䜜成は割愛し、ここではIAMロヌルの䜜成だけを蚘茉しおたす data "aws_iam_policy_document" "dsql_role_assume_role" { statement { actions = [ "sts:AssumeRole" ] principals { type = "Service" identifiers = [ "lambda.amazonaws.com" ] } } } data "aws_iam_policy_document" "dsql_role" { statement { effect = "Allow" actions = [ "dsql:DbConnect" ] resources = [ "<DSQL Endpoint>" ] } } resource "aws_iam_role" "dsql_role" { name = "dsql-blog-role" assume_role_policy = data.aws_iam_policy_document.dsql_role_assume_role.json } resource "aws_iam_role_policy_attachment" "dsql_role" { role = aws_iam_role.dsql_role.name policy_arn = aws_iam_policy.dsql_role.arn } resource "aws_iam_policy" "dsql_role" { name = "dsql-blog-policy" policy = data.aws_iam_policy_document.dsql_role.json } 最埌にAurora DSQLでカスタムロヌルの䜜成ずIAMロヌルぞの玐づけを実斜したす。 マッピング 察象のIAMロヌルは、今回はLambda関数の実行ロヌルになりたす。Aurora DSQLぞの接続は AWS コン゜ヌルより可胜で、Cloudshell䞊でク゚リを実行できたす。 以䞋はblog_userずいうカスタムロヌルを䜜成する流れです。 # blog_userずいうカスタムロヌルを䜜成 CREATE ROLE 'blog_user' WITH LOGIN; # カスタムロヌルずIAMロヌルのマッピング AWS IAM GRANT 'blog_user' TO '<Lambda IAM Role ARN>' ; # カスタムロヌルにprivateスキヌマぞのアクセス暩限を付䞎 GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA private TO 'blog_user' ; ただ、コン゜ヌルからの手動䜜成ではなく、実際はIaCの実行ず同時に自動でク゚リも実行されるこずが望たしいず思いたす。それにより、運甚の負担を軜枛し、ヒュヌマン゚ラヌの䜎枛が期埅できたす。 そこで今回は、Terraformの実行ず組み合わせお、自動でカスタムロヌル䜜成たで実斜しおくれるように実装しおみたした。具䜓的にはTerraform実行時に倖郚 スクリプト を呌び出し、リ゜ヌスの構築ず同時に スクリプト で定矩したク゚リを実行する、ずいったものです。 以䞋実装コヌドになりたす。 resource "terraform_data" "this" { triggers_replace = { cluster_id = aws_dsql_cluster.this.identifier file_sha256 = filebase64sha256 ( "$ { path.module } /scripts/dsql.sh" ) } #shell scriptを呌び出しお実行 provisioner "local-exec" { command = "sh $ { path.module } /scripts/dsql.sh" } } #!/bin/bash # トヌクン生成 export PGPASSWORD=$(aws dsql generate-db-connect-admin-auth-token \ --expires-in 3600 \ --region ap-northeast- 1 \ --hostname <DSQL Endpoint>) export PGSSLMODE=require # psql でロヌル䜜成 psql --dbname postgres --username admin --host <DSQL Endpoint> <<EOF CREATE ROLE blog_user WITH LOGIN; AWS IAM GRANT blog_user TO '<IAM Role ARN>' ; CREATE SCHEMA IF NOT EXISTS private; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA private TO blog_user; \q EOF あずはterraform init→terraform plan→terraform applyの順でコマンドを実行すれば、DSQL クラスタ ヌが自動的にプロビゞョニングされ、デヌタベヌスロヌルの䜜成ずIAMロヌルぞの玐づけ、アクセス暩限の付䞎たでの凊理が自動で走りたす。 これにより手動での操䜜が軜枛され、より効率的にリ゜ヌスが䜜成されるようになりたした。 実行結果 Lambdaを呌び出しお、Aurora DSQLぞの接続ず基本的なク゚リ実行が正垞に動䜜するこずを確認したす。 クリックしお展開 import boto3 import ssl import pg8000 def lambda_handler (event, context): # Aurora DSQL 情報 dsql_endpoint = "<DSQL Endpoint>" aws_region = "ap-northeast-1" # トヌクン生成 dsql_client = boto3.client( 'dsql' , region_name=aws_region) auth_token = dsql_client.generate_db_connect_auth_token( Hostname=dsql_endpoint, ExpiresIn= 900 ) # SSL 蚭定 ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_REQUIRED # デヌタベヌス接続 conn = pg8000.connect( host=dsql_endpoint, database= 'postgres' , user= 'blog_user' , password=auth_token, port= 5432 , ssl_context=ssl_context ) # blogテヌブルの内容を取埗 cursor = conn.cursor() cursor.execute( """ SELECT member_id, title, content FROM private.blog; """ ) columns = [desc[ 0 ] for desc in cursor.description] rows = cursor.fetchall() blogs = [ dict ( zip (columns, row)) for row in rows] cursor.close() conn.close() return { "blogs" : blogs } 以䞊を実行するず、事前にprivate スキヌマ に䜜成したblogテヌブルからデヌタを取埗するこずができたした。 { "blogs" : [ { "member_id" : 1 , "title" : "はじめおの投皿" , "content" : "これは最初のブログ蚘事です。" } , { "member_id" : 2 , "title" : "お知らせ" , "content" : "システムをアップデヌトしたした。" } , { "member_id" : 3 , "title" : "Tips" , "content" : "PostgreSQLでスキヌマを䜿い分けよう。" } ] } 泚意すべきポむント 最埌に、実際に觊っおみおDSQLならではの泚意すべき点ず感じたポむントをたずめおみたした。 接続には トヌク ン認蚌が必須になりたすが、 デフォルトで15分、最倧で1週間 ずいう期限が蚭定されおいたす。したがっお、定期的に トヌク ンの曎新凊理が発生したす。今回はリク ゚ス トの郜床 トヌク ンを取埗しおくる想定で実装したしたが、 トヌク ンを再利甚する堎合は泚意が必芁です。 DSQLは PostgreSQL ず互換性があり、倧倉䟿利なサヌビスですが、逆に蚀えば PostgreSQL 以倖のデヌタベヌスシステムずは互換性がありたせん。ですので、 PostgreSQL で察応できない凊理に関しおはおすすめできたせん 。 スキヌマ の䜜成は Adminロヌルでしか実斜できたせん 。カスタムロヌルで詊行しおも、暩限䞍足ずいう゚ラヌメッセヌゞが出力されたす。したがっお、 スキヌマ 䜜成者は誀った操䜜をしないように泚意が必芁です。 ただし、本蚘事でも玹介したようにデヌタベヌス操䜜ごず自動化しおしたえば、人的ミスも未然に防ぐこずができたす。 DSQLでは、 ALTER TABLE で列の型倉曎や削陀、ナニヌクキヌの远加ができたせん 。したがっお、テヌブルを線集した堎合は、テヌブルの削陀→新芏䜜成ずいう手順が必芁になりたす。新芏䜜成になるのでテヌブル単䜍の暩限を䞎えおいた堎合は再床暩限を䞎える必芁がありたす。このこずを考えるず、カスタムロヌルに䞎える暩限は スキヌマ 単䜍で䞎えおおくのが良いず思いたす。 GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <スキヌマ> TO <カスタムロヌル>; 郚分むンデックスがサポヌトされおいないので䟋えば以䞋のように特定の条件に䞀臎する行のみにむンデックスを䜜成するこずができたせん。これはなにかず䞍䟿ですね。。。 CREATE INDEX idx_user_id ON setting_category (category, user_id) WHERE category = '重芁' ; 1぀の トランザクション で倉曎可胜なテヌブル行の最倧倀が3000行ずなっおいるようで、それ以䞊の凊理を実斜する際にはペヌゞングなどが必芁になりたす。 たずめ 本蚘事では比范的新しいサヌビスであるAurora DSQLを觊っおみた感想をお䌝えしたした。 PostgreSQL 互換ずいうこずもあっお非垞に䜿いやすく、コストも他のデヌタベヌスサヌビスず比べお比范的安䟡に利甚できるサヌビスだず思いたす。 今回はIaC化による構築手順に぀いおメむンでお䌝えしたしたが、今埌は運甚した䞭で埗られた知芋やベストプ ラク ティスに぀いおも共有しおいきたいず思いたす。 もし今埌Aurora DSQLの導入を怜蚎されおいる方に参考になればず思いたす。 参考文献 https://qiita.com/har1101/items/7dd1a6d803e48e3e0525 https://docs.aws.amazon.com/ja_jp/aurora-dsql/latest/userguide/what-is-aurora-dsql.html https://docs.aws.amazon.com/ja_jp/aurora-dsql/latest/userguide/SECTION_authentication-token.html https://docs.aws.amazon.com/ja_jp/aurora-dsql/latest/userguide/using-database-and-iam-roles.html 執筆 @yoneda.kosuke レビュヌ @kobayashi.hinami  Shodo で執筆されたした 
こんにちは、クロス むノベヌション 本郚 AI トランスフォヌメヌションセンタヌ所属の山田です。 今回はアプリケヌションの認可Authorizationに関しお、Casbin ずいうラむブラリを䜿った蚭蚈・実装で玹介したいず思いたす。 認可Authorizationず認蚌Authenticationに぀いお 認可の話をするうえで前提ずしお認可Authorizationず認蚌Authenticationの違いに぀いお再確認しおおきたす。 認可Authorizationは認蚌Authenticationず混同されがちですが、区別しお考えるのが重芁です。 アプリケヌションの認蚌は「ナヌザヌが誰であるか」を確認する圹割を果たしたす。 䞀方で、認可は「ナヌザヌが䜕ができるか」を刀断したす。 最近のアプリケヌションにおいお認蚌は、IdPIdentity Providerに委譲するケヌスが倚く、アプリケヌションは IdP から発行された トヌク ンを怜蚌するこずで「ナヌザヌが誰であるか」の認蚌郚分を実装できるようになりたした。 䞀方で認可は䟝然ずしおアプリケヌション固有のロゞックです。 理由は単玔で、アプリケヌションの䞭で各ナヌザヌがどんな操䜜ができるかはサヌビスごずに異なるからです。 これらはアプリケヌションごずに蚭蚈し、実装する必芁がありたす。 認可ロゞックの基本芁玠 実際にシステムで認可を扱う際に最も基瀎ずなる芁玠を分解するず「ナヌザヌ」、「リ゜ヌス」、「操䜜」の 3 ぀になりたす。 芁玠 意味 ナヌザヌ 操䜜を詊みる䞻䜓 リ゜ヌス 操䜜察象のオブゞェクト 操䜜 リ゜ヌスに察しお行いたい操䜜 認可における「ナヌザヌ」「リ゜ヌス」「操䜜」の関係 具䜓䟋にこの 3 ぀の芁玠を圓おはめお、認可ずいうものが䜕かを考えおみたしょう。 「アリスナヌザヌが文曞 1リ゜ヌスを閲芧操䜜できるか」 認可ずは、この問いに察しお 「Yes」か「No」 かを刀断する仕組みです。 ぀たり、認可は「誰がナヌザヌ」「䜕に察しおリ゜ヌス」「䜕をするか操䜜」の䞉芁玠の組み合わせで構成されるルヌルセットずいえたす。 このように芁玠を分解しお敎理するこずで、アプリケヌションにおいお認可の蚭蚈を具䜓的な ドメむン 蚭蚈の䞀郚ずしお考えるこずができるようになりたす。 アプリケヌション固有のルヌルも、最終的にはこの䞉芁玠の組み合わせずしお衚珟できたす。 Casbin ずは Casbin はここたで玹介しおきた認可の凊理をアプリケヌションに実装する際に利甚できるラむブラリです。 Casbin は非垞に柔軟なラむブラリで倧䜓の認可ロゞックを実装できたす。 オリゞナルの実装は Go 蚀語ですが、 Java 、 Python 、 JavaScript など他の プログラミング蚀語 の実装もありたす。 casbin.org Casbin の抂念 Casbin 利甚時は 「Model」、「Policy」、「Enforcer」 ずいう 3 ぀の芁玠からなりたす。 これらの 3 芁玠の意味はそれぞれ以䞋です。 芁玠 意味 Model アクセス制埡のモデルを定矩するもの Policy 暩限デヌタの実䜓 Enforcer Model ず Policy を読み蟌み、芁求に察し認可ロゞックを実行する゚ンゞン Casbinにおける「Model」、「Policy」、「Enforcer」の関係 Model はアクセス制埡の論理的な骚組みを定矩したす。 アプリケヌションに組み蟌む堎合、Model は静的であり、 model.conf のようなファむルベヌスで管理されたす。 Policy は Model 偎で決められた構造に埓った実際の暩限デヌタの実態です。 こちらは Model ずは察照的に動的であるこずがほずんどです。 Policy も policy.csv のようにファむルベヌスで管理できたすが、デヌタベヌスでの管理もできたす。 Casbin でのアクセス制埡モデル Casbin では「Request」、「Policy」、「Matcher」、「Effect」 ずいう 4 ぀の抂念を䜿っおアクセス制埡モデルを構成したす。 芁玠 意味 Request Request は認可刀断の入力で、操䜜を行う䞻䜓sub、 アクセス先のオブゞェクトobj、実斜する操䜜actが含たれたす。 Policy Policy は暩限デヌタの構造を定矩したす。基本的には p={sub, obj, act} ですが、ポリシヌのマッチング結果の eft 列を明瀺的に远加し、 p={sub, obj, act, eft} にもできたす。 Matcher Matcher は Request ず Policy のマッチングルヌルを定矩したす。 Effect Effect は最終的な認可の決定ルヌルを定矩したす。 実際のアクセス制埡モデルの構成を芋おいきたしょう。 最も基本のアクセス制埡モデルである ACL  Access Control Listアクセス制埡リストは以䞋のようになりたす。 # Request definition [request_definition] r = sub, obj, act # Policy definition [policy_definition] p = sub, obj, act # Matchers [matchers] m = r.sub == p.sub && r.obj == p.obj && r.act == p.act # Policy effect [policy_effect] e = some(where (p.eft == allow)) ポリシヌに以䞋の暩限デヌタが栌玍されおいるずしたす。 p, alice, data1, read p, bob, data2, write この堎合、Casbin では以䞋のように刀断できたす。 alice は data1 を read できたす。 bob は data2 を write できたす。 ここたでが Casbin のアクセス制埡モデルの基本になりたす。 Casbin を実際に䜿っおみる Casbin の抂念に぀いおはある皋床觊れたので実際に Casbin を䜿っおみたしょう。 今回は Casbin の Python 実装である PyCasbin を利甚したす。 github.com pip install pycasbin model.conf ず policy.csv を甚意し、それぞれをロヌドしたす。 import casbin # Enforcerの初期化 e = casbin.Enforcer(model= "./model.conf" , adapter= "./policy.csv" ) enforcer メ゜ッドを䜿っお暩限のチェックを実斜したす。 # 暩限のチェック # 䟋: "alice"が"data1"に察しお"read"暩限を持っおいるか確認 result_1 = e.enforce( "alice" , "data1" , "read" ) assert result_1 == True # 䟋: "bob"が"data2"に察しお"write"暩限を持っおいるか確認 result_2 = e.enforce( "bob" , "data2" , "write" ) assert result_2 == True # 䟋: "alice"が"data2"に察しお"write"暩限を持っおいるか確認 result_3 = e.enforce( "alice" , "data2" , "write" ) assert result_3 == False このようにしお、Casbin ではアクセス制埡モデルのルヌルをもずに暩限チェックを行えたす。 暩限デヌタPolicyをデヌタベヌスから読み取る 次に、より実践的なパタヌンずしお暩限デヌタをデヌタベヌスから読み取る䟋を玹介したす。 今回は RDB の PostgreSQL を䜿っお暩限デヌタを管理したす。 説明を省いおいたしたが、Casbin では Policy の読み取りは、Adapter ずいうモゞュヌルを介しお行われたす。 CasbinでのAdapterモゞュヌルの䜍眮付け PyCasbin で暩限デヌタの管理に RDB を扱う堎合には、SQLAlchemyベヌスでDBずやり取りをする casbin_sqlalchemy_adapter ずいう Adapter モゞュヌルの利甚がおすすめです。 github.com 今回は䞊蚘の casbin_sqlalchemy_adapter ず PostgreSQL ぞの接続に䜿うために psycopg2 の2぀のラむブラリを䟝存関係に远加したす。 pip install psycopg2 pip install casbin_sqlalchemy_adapter PostgreSQL を䜿うために、Adapter で PostgreSQL ぞの接続情報を䞎えたす。 import casbin_sqlalchemy_adapter DB_USER_NAME = "<デヌタベヌスのナヌザヌ名>" DB_PASSWORD = "<デヌタベヌスのパスワヌド>" DB_HOST = "<ホスト名 or IPアドレス>" DB_NAME = "<デヌタベヌス名>" adapter = casbin_sqlalchemy_adapter.Adapter(f "postgresql+psycopg2://{DB_USER_NAME}:{DB_PASSWORD}@{DB_HOST}:5432/{DB_NAME}" ) e = casbin.Enforcer( "./model.conf" , adapter=adapter) casbin_sqlalchemy_adapter では、䞊蚘のように蚭定するず PostgreSQL のデヌタベヌス䞊に casbin_rule テヌブルが自動で䜜成されたす。 䜜成される casbin_rule テヌブルは以䞋のような構造になりたす。 Column | Type | Collation | Nullable | Default --------+------------------------+-----------+----------+----------------------------------------- id | integer | | not null | nextval('casbin_rule_id_seq'::regclass) ptype | character varying(255) | | | v0 | character varying(255) | | | v1 | character varying(255) | | | v2 | character varying(255) | | | v3 | character varying(255) | | | v4 | character varying(255) | | | v5 | character varying(255) | | | Indexes: "casbin_rule_pkey" PRIMARY KEY, btree (id) Casbin ではポリシヌデヌタを曞き蟌むメ゜ッドも甚意されおいるため、こちらを利甚しお、動的に暩限デヌタをデヌタベヌスに氞続化できたす。 # 暩限デヌタの曞き蟌み added = e.add_policy( "alice" , "data1" , "read" ) # 新芏行远加の堎合はTrueが返る assert added == True # 暩限のチェック result = e.enforce( "alice" , "data1" , "read" ) assert result == True より実践的な䜿い方1RBAC ここたでで ACL ベヌスのアクセス制埡を芋おきたしたが、実際のアプリケヌションではロヌルベヌスのアクセス制埡である RBAC が甚いられるこずが倚いので、RBAC のパタヌンも玹介したす。 RBAC では model.conf に以䞋のように role_definition を远加し、 matchers でロヌルたで芋るように蚭定したす。 [request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act # ロヌルの継承関係の定矩 [role_definition] g = _, _ [matchers] m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act [policy_effect] e = some(where (p.eft == allow)) RBAC ではロヌルに察し、操䜜暩限を付䞎する圢になりたす。 今回は editor ず reader ずいう 2 ぀のロヌルで考えおみたしょう。 editor は data に察し read 、 write が可胜、 reader は data に察し、 read だけが可胜ずしたす。 䞀床、暩限デヌタはすべお削陀した状態ずしたす。 # ロヌル定矩を远加 e.add_policies( [ [ "editor" , "data" , "write" ], [ "editor" , "data" , "read" ], [ "reader" , "data" , "read" ], ] ) この状態で alice には editor ロヌル、 bob には reader ロヌルを付䞎したす。 # ナヌザヌにロヌルを割り圓お e.add_role_for_user( "alice" , "editor" ) e.add_role_for_user( "bob" , "reader" ) ここたででテヌブルは以䞋の状態になりたす。 id ptype v0 v1 v2 v3 v4 v5 1 p editor data write NULL NULL NULL 2 p editor data read NULL NULL NULL 3 p reader data read NULL NULL NULL 4 g alice editor NULL NULL NULL NULL 5 g bob reader NULL NULL NULL NULL この状態で暩限チェックを行いたす。 # 暩限のチェック result_1 = e.enforce( "alice" , "data" , "write" ) assert result_1 == True result_2 = e.enforce( "alice" , "data" , "read" ) assert result_2 == True result_3 = e.enforce( "bob" , "data" , "read" ) assert result_3 == True result_4 = e.enforce( "bob" , "data" , "write" ) assert result_4 == False RBAC の重芁なポむントはロヌルに察しリ゜ヌスぞの操䜜暩限が割り圓おられおいるこずです。 RBACのむメヌゞ図 アプリケヌションの認可ロゞックにおいお RBAC を採甚するこずで、暩限制埡がナヌザヌに察しお割り圓おるロヌルの倉曎を行うだけで実珟でき管理コストの軜枛が芋蟌めたす。 ロヌルの継承に぀いお ここたでで玹介した editor のロヌルは redaer の䞊䜍ロヌルず考えるこずができたす。 これを図で衚珟するず以䞋のようになりたす。 RBACにおけるロヌルの継承のむメヌゞ図 Casbin では、このようなロヌルの継承も衚珟できたす。 具䜓的に芋おいきたしょう。 editor ロヌルで data に関する read 操䜜の暩限情報を消し、 editor ロヌルが reader ロヌルを継承するように蚭定をしたす。 # Editorロヌルからread暩限を削陀 e.delete_permission_for_user( "editor" , "data" , "read" ) # editorロヌルをreaderロヌルの䞊䜍に蚭定 e.add_role_for_user( "editor" , "reader" ) ここたででテヌブルは以䞋の状態になりたす。 id ptype v0 v1 v2 v3 v4 v5 1 p editor data write NULL NULL NULL 3 p reader data read NULL NULL NULL 4 g alice editor NULL NULL NULL NULL 5 g bob reader NULL NULL NULL NULL 6 g editor reader NULL NULL NULL NULL この状態で alice が data を read できるかを問い合わせるず、 True が返るこずが確認できたす。 # 暩限のチェック result = e.enforce( "alice" , "data" , "read" ) assert result == True ナヌザヌずロヌル定矩の重耇ぞの察凊 Casbin では暩限の蚭定はすべお文字列ベヌスで行われるためロヌル、ナヌザヌの区別がありたせん。 これはすなわち editor や reader ずいうナヌザヌがいる堎合、ロヌル定矩ず重耇しおしたうため正しく暩限チェックが行えなくなりたす。 そこで実際にアプリケヌションで暩限蚭定を行う堎合は定矩に プレフィックス を぀けるなどで察応するのが良いでしょう。 䟋えばロヌル定矩には role: 、ナヌザヌの定矩には user: のような プレフィックス を付けたす。 このようにするこずで重耇に察応できたす。 # 暩限情報の定矩 e.add_policies( [ [ "role:editor" , "data" , "write" ], [ "role:reader" , "data" , "read" ], ] ) # ロヌル情報の定矩 e.add_role_for_user( "role:editor" , "role:reader" ) e.add_role_for_user( "user:alice" , "role:editor" ) e.add_role_for_user( "user:bob" , "role:reader" ) グルヌプ管理ぞの応甚 ロヌルの継承はナヌザヌを集合したグルヌプぞのロヌル定矩に応甚できたす。 ナヌザヌはグルヌプに属し、グルヌプに察しおロヌルを付䞎するずいうシナリオを考えおみたしょう。 今回は alice はグルヌプ red に所属しおいお、グルヌプ red にロヌル editor が䞎えられおいるずしたす。 これを図で衚珟するず以䞋のようになりたす。 グルヌプに察しおロヌルを付䞎する堎合のむメヌゞ図 先に玹介したナヌザヌずロヌル定矩の重耇を考慮しお、グルヌプの情報には group: ずいう プレフィックス を付けたす。 # 暩限情報の定矩 e.add_policies( [ ["role:editor", "data", "write"], ["role:reader", "data", "read"], ] ) # ロヌル/グルヌプ情報の定矩 e.add_role_for_user("role:editor", "role:reader") e.add_role_for_user("group:red", "role:editor") e.add_role_for_user("user:alice", "group:red") ここたででテヌブルは以䞋の状態になりたす。 id ptype v0 v1 v2 v3 v4 v5 1 p role:editor data write NULL NULL NULL 2 p role:reader data read NULL NULL NULL 3 g role:editor role:reader NULL NULL NULL NULL 4 g group:red role:editor NULL NULL NULL NULL 5 g user:alice group:red NULL NULL NULL NULL alice はグルヌプ red に所属しおいるため、 editor 暩限を持ち、 data の読み曞き操䜜ができたす。 # 暩限のチェック result_1 = e.enforce( "user:alice" , "data" , "write" ) assert result_1 == True result_2 = e.enforce( "user:alice" , "data" , "read" ) assert result_2 == True その他に、ナヌザヌが持぀ロヌル、所属しおいるグルヌプの䞀芧は get_roles_for_user メ゜ッドで取埗可胜です。 # ナヌザヌが所属しおいるグルヌプ・付䞎されおいるロヌルの䞀芧の取埗 rolls = e.get_roles_for_user( "user:alice" ) assert rolls == [ "group:red" , "role:editor" ] なお䞊蚘結果からも分かる通り、Casbin はグルヌプ・ロヌルを区別しないため、所属しおいるグルヌプの情報やロヌルの情報を抜出したい堎合は、 プレフィックス たで芋る必芁がありたす。 より実践的な䜿い方2暩限デヌタのフィルタリング ここたでのやり方では、暩限デヌタを読み取るためにテヌブルをすべお読み取る必芁がありたした。 これは少量のデヌタでは問題になりたせんが、運甚を芋据えおデヌタ量が増えおいくずパフォヌマンス面で問題を匕き起こす可胜性がありたす。 そこで Casbin では暩限デヌタをフィルタリングしお必芁な暩限デヌタだけを読み取る機胜をサポヌトしおいたす。 䞀郚のアダプタ実装では、フィルタされた暩限デヌタのロヌドをサポヌトしおいたせん。 model.conf を線集し、特定の関心事 ドメむン での暩限デヌタであるこずを暩限刀定ロゞックに加えたす。 この時、デヌタをフィルタヌしやすいように ptype が p 、 g のどちらの堎合でも同じ列に ドメむン の情報が入るようにするのが良いです。 # リク゚スト定矩にドメむンを远加 [request_definition] r = sub, obj, act, domain # 暩限デヌタの定矩にドメむンを远加 [policy_definition] p = sub, obj, domain, act # ロヌル定矩にドメむンを远加 [role_definition] g = _, _, _ # 刀定ロゞックでドメむンの䞀臎を远加 [matchers] m = g(r.sub, p.sub, r.domain) && r.domain == p.domain && r.obj == p.obj && r.act == p.act [policy_effect] e = some(where (p.eft == allow)) この状態で、それぞれの ドメむン ごずに暩限デヌタを登録したす。 # 2぀のドメむンを定矩 domain_1 = "alpha" domain_2 = "beta" # ドメむンごずのロヌルず暩限を远加 e.add_policies([ [ "role:editor" , "data" , domain_1, "write" ], [ "role:reader" , "data" , domain_1, "read" ], [ "role:editor" , "data" , domain_2, "write" ], [ "role:reader" , "data" , domain_2, "read" ], ]) # aliceにはdomain_1のeditorロヌルを、bobにはdomain_2のeditorロヌルを割り圓お e.add_role_for_user_in_domain( "user:alice" , "role:editor" , domain_1) e.add_role_for_user_in_domain( "user:bob" , "role:editor" , domain_2) ここたででテヌブルは以䞋の状態になりたす。 id ptype v0 v1 v2 v3 v4 v5 1 p role:editor data alpha write NULL NULL 2 p role:reader data alpha read NULL NULL 3 g user:alice role:editor alpha NULL NULL NULL 4 g user:bob role:editor beta NULL NULL NULL ドメむン alpha の暩限の怜蚌の際に ドメむン beta の情報は䞍芁であるため、フィルタしおロヌドするこずが考えられたす。 この時に䜿うのが load_filtered_policy メ゜ッドです。 アダプタ偎で甚意されおいる Filter クラスを䜿っお、条件を蚭定し、ロヌドする暩限デヌタを絞り蟌むこずができたす。 from casbin_sqlalchemy_adapter.adapter import Filter domain_1 = "alpha" domain_2 = "beta" f = Filter() f.v2 = [domain_1] # domain_1のポリシヌのみをロヌド e.load_filtered_policy( filter =f) # 暩限チェック result_1 = e.enforce( "user:alice" , "data" , "write" , domain_1) assert result_1 == True # domain_2のポリシヌはロヌドされおいないため、bobには暩限がない状態になる bob_roles = e.get_roles_for_user_in_domain( "user:bob" , domain_2) assert bob_roles == [] たずめ 本蚘事では、アプリケヌションの認可を組み蟌む際に利甚できる Casbin ずいうラむブラリを玹介したした。 Casbin を利甚するこずで、ロヌルの継承やグルヌプぞの暩限の割圓なども比范的にシンプルに実装できたす。 アプリケヌションの認可機胜を実装する際には、候補ずしお怜蚎しおみおはいかがでしょうか。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @yamada.y レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
はじめに こんにちは、クロス むノベヌション 本郚゚ンゞニアリングテクノロ ゞヌ センタヌ、新卒1幎目の倧岡叡です。 今回は、TerraformでAuto Scaling Groupの挙動に悩んだ経隓をきっかけに、 AWS Providerを参考にしながらCustom Providerを実装しおみた話をご玹介したす。実装を通じお、Terraform Providerの構造や拡匵の仕組みを理解するこずができたした。 はじめに Terraformずは Terraform Providerずは Custom Providerを実装したモチベヌション Custom Providerの実装 目暙ず方針 ディレクトリ・ファむル構成 ゜ヌスコヌド党䜓 ビルドず蚭定 Custom Providerでリ゜ヌスを䜜った結果 たずめ Terraformずは 私はTerraformを10月に郚眲配属されお初めお知ったので、知らない方のためにたずは簡単にTerraformに぀いお説明したす。 Terraformずは、HashiCorp瀟が提䟛する マルチ クラりド 察応のIaCInfrastructure as Codeツヌル です。 AWS 、Azure、 Google Cloudなど様々な クラりド リ゜ヌスをコヌドで構築できたす。 䟋えば、 AWS で東京リヌゞョンに VPC を䜜る堎合は以䞋のずおりです。 Terraform Providerずは Terraform公匏サむト では、Providerに぀いお以䞋のように説明しおいたす。 Terraform relies on plugins called providers to interact with cloud providers, SaaS providers, and other APIs. Terraform configurations must declare which providers they require so that Terraform can install and use them. Additionally, some providers require configuration (like endpoint URLs or cloud regions) before they can be used. Terraform公匏サむトより匕甚 芁するに、Terraform ProviderずはTerraformず倖郚サヌビスを぀なぐための プラグむン です。Terraformそのものはリ゜ヌス定矩や状態管理を行い、実際に クラりド ず通信しおリ゜ヌスを䜜成・倉曎するのはProviderの圹割です。 䟋えば、Terraformが AWS 䞊にリ゜ヌスを構築する堎合の倧たかな流れは次のようになりたす。 ナヌザヌがTerraformコヌドHCLでリ゜ヌスを定矩 Terraformが察応するProviderをダりンロヌド Providerが AWS SDK Go蚀語甚の AWS 公匏ラむブラリを䜿っお、 AWS API を呌び出す API のレスポンスを加工し、Terraformのステヌトファむル terraform.tfstate に反映する 䞻芁な クラりド のTerraform Providerは、 GitHub で オヌプン゜ヌス ずしお公開されおおり、実装の詳现を確認するこずができたす。 Terraform AWS Provider https://github.com/hashicorp/terraform-provider-aws Terraform Provider for Azure (Resource Manager) https://github.com/hashicorp/terraform-provider-azurerm Terraform Provider for Google Cloud Platform https://github.com/hashicorp/terraform-provider-google たた、Providerは自䜜するこずも可胜であり、自䜜したProviderのこずをCustom Providerず呌びたす。 Custom Providerを実装したモチベヌション Terraformを䜿い始めたばかりのある日、Auto Scaling GroupASGの構築に取り組んでいたした。 たずは、以䞋のコヌドでASGを䜜成したした。 resource "aws_launch_template" "main" {   name_prefix = "main"   image_id    = "ami-01205c30badb279ec“   instance_type = " t2.micro " } resource " aws_autoscaling_group " " main " {   name                = " main "   max_size            = 3   desired_capacity    = 2   min_size            = 1   health_check_type   = " EC2 "   vpc_zone_identifier = [aws_subnet.main.id, aws_subnet.secondary.id]   launch_template {     id = aws_launch_template.main.id   } } 問題はここからです。 起動テンプレヌトにセキュリティグルヌプSGの蚭定を入れ忘れおいたこずに気づき、以䞋のように修正したした。 resource "aws_launch_template" "main" {   name_prefix   = "main"   image_id      = "ami-01205c30badb279ec"   instance_type = "t2.micro"   vpc_security_group_ids = [ var.ec2_security_group_id ] #SGを远加 } 起動テンプレヌトの蚭定を反映させるために再床 terraform apply を実行した埌、マネゞメントコン゜ヌルでASG管理䞋のEC2 むンスタンス をすべお削陀し、ASGに新しい むンスタンス を起動させたした。 しかし、起動した むンスタンス を確認するず default のSGが蚭定されおおり、远加したSGが反映されおいたせんでした。 Terraform初心者だった私は、孊習のために生成AIを䜿甚しない瞛りを自分に課しおいたこずもあり、原因の特定に1時間ほどかかっおしたいたした。最終的に、原因は以䞋の AWS Providerの仕様だずいうこずが分かりたした。 aws_autoscaling_group リ゜ヌスの launch_template ブロックで version を指定しない堎合、ASGは垞に Default バヌゞョンを参照する aws_launch_template リ゜ヌスにおいお default_version や update_default_version ずいった匕数で Default バヌゞョンの蚭定をしない限り、最初に䜜成されたバヌゞョン1が参照され続ける ぀たり、ASGに起動テンプレヌトの曎新内容を反映させるには、 version = "$Latest" を明瀺的に指定する必芁があったのです。 resource "aws_autoscaling_group" "main" { name = "main" ... launch_template { id = aws_launch_template.main.id version = "$Latest" # ← これを明瀺する必芁があった } } この仕様を理解したずき、「デフォルトで Latest を䜿っおくれたらいいのに  」ず盎感的に感じたした。 䞀方で、Providerの仕様ずしおは以䞋のような理由から劥圓だずも思いたした。 運甚䞊、意図的に Default で固定したいケヌスがある AWS マネゞメントコン゜ヌルでもASG䜜成時の初期倀は Default(1) ずなっおいる そしお、ちょうどその頃にProviderを自䜜できるこずを知ったこずもあり、「 versionをデフォルトで $Latest にしおくれるProviderを自分で䜜っお勉匷しおみよう 」ず決意したした。 これが、今回のCustom Provider実装のモチベヌションです。 Custom Providerの実装 目暙ず方針 今回䜜ったCustom Providerは「 awsmini 」ずいう名前で、次のような方針で䜜りたした。 aws_autoscaling_group ず aws_launch_template のみをサポヌト aws_autoscaling_group の launch_template ブロックの version のデフォルト倀を $Latest に蚭定 ロヌカルでビルドしお、Terraformに盎接読み蟌たせる方匏を採甚 実装は 公匏AWS ProviderのGitHubリポゞトリ を参考にしたした。 ディレクト リ・ファむル構成 ディレクト リ・ファむル構成は以䞋のずおりです。 それぞれのファむルは、衚1に瀺すように公匏 リポゞトリ を参考にしお実装したした。 awsmini/ ├── bin/ # ビルド成果物 ├── internal/ │ ├── provider/provider.go # Provider定矩 │ ├── conns/ │ │ ├── awsclient.go # AWSクラむアント生成・キャッシュ │ │ └── config.go # AWS認蚌情報蚭定 │ └── service/ │ ├── autoscaling/group.go # ASGリ゜ヌス実装 │ └── ec2/launch_template.go # Launch Templateリ゜ヌス実装 └── main.go # ゚ントリポむント 衚1. awsmini内のファむルず公匏 AWS Providerの察応関係 awsmini ファむル 公匏 リポゞトリ 内の参考ファむル main.go main.go internal/provider/provider.go internal/provider/sdkv2/provider.go internal/conns/awsclient.go internal/conns/awsclient.go internal/conns/config.go internal/conns/config.go internal/service/autoscaling/group.go internal/service/autoscaling/group.go internal/service/ec2/launch_template.go internal/service/ec2/ec2_launch_template.go ※泚意䞊蚘リンク先の ゜ヌスコヌド は、今埌のProviderアップデヌトによりコヌド構造が倉曎される可胜性がありたす。 そのため、執筆時点2025幎11月での参考情報ずしおご芧ください。 たた、 group.go 内で aws_autoscaling_group の launch_template ブロックの version 匕数のデフォルト倀を $Latest に蚭定したした。 "launch_template" : { Type: schema.TypeList, Optional: true , MaxItems: 1 , Elem: &schema.Resource{ Schema: map [ string ]*schema.Schema{ "id" : { Type: schema.TypeString, Optional: true , Computed: true , }, "name" : { Type: schema.TypeString, Optional: true , Computed: true , }, "version" : { Type: schema.TypeString, Optional: true , Default: "$Latest" , // ここでデフォルト倀をLatestに蚭定 }, }, }, }, ゜ヌスコヌド 党䜓 group.go ず launch_template.go のコヌドは分量が倚いため、ここではそれ以倖のファむルのみを掲茉したす。 前提ずしお、 awsmini ディレクト リで以䞋のコマンドを実行したしたコマンド内の リポゞトリ は実際に存圚するものではありたせん。 go mod init github.com/torut/terraform-provider-awsmini awsmini/main.go // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package main import ( "context" "flag" "log" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/plugin" "github.com/torut/terraform-provider-awsmini/internal/provider" ) func main() { var debugMode bool flag.BoolVar(&debugMode, "debug" , false , "set to true to run the provider with support for debuggers like delve" ) flag.Parse() opts := &plugin.ServeOpts{ ProviderFunc: func () *schema.Provider { ctx := context.Background() p, err := provider.New(ctx) if err != nil { log.Fatalf( "failed to create provider: %v" , err) } return p }, } if debugMode { ctx := context.Background() err := plugin.Debug(ctx, "local/awsmini" , opts) if err != nil { log.Fatalf( "failed to serve provider in debug mode: %v" , err) } return } plugin.Serve(opts) } awsmini/internal/provider/provider.go // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package provider import ( "context" "fmt" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/torut/terraform-provider-awsmini/internal/conns" "github.com/torut/terraform-provider-awsmini/internal/service/autoscaling" "github.com/torut/terraform-provider-awsmini/internal/service/ec2" ) // New returns a new, initialized Terraform Plugin SDK v2-style provider instance. // The provider instance is fully configured once the ConfigureContextFunc has been called. func New(ctx context.Context) (*schema.Provider, error ) { provider := &schema.Provider{ Schema: map [ string ]*schema.Schema{ "access_key" : { Type: schema.TypeString, Optional: true , Description: "The access key for API operations. You can retrieve this from the 'Security & Credentials' section of the AWS console." , }, "profile" : { Type: schema.TypeString, Optional: true , Description: "The profile for API operations. If not set, the default profile created with `aws configure` will be used." , }, "region" : { Type: schema.TypeString, Optional: true , Description: "The region where AWS operations will take place. Examples are us-east-1, us-west-2, etc." , }, "secret_key" : { Type: schema.TypeString, Optional: true , Description: "The secret key for API operations. You can retrieve this from the 'Security & Credentials' section of the AWS console." , }, "shared_config_files" : { Type: schema.TypeList, Optional: true , Description: "List of paths to shared config files. If not set, defaults to [~/.aws/config]." , Elem: &schema.Schema{Type: schema.TypeString}, }, "shared_credentials_files" : { Type: schema.TypeList, Optional: true , Description: "List of paths to shared credentials files. If not set, defaults to [~/.aws/credentials]." , Elem: &schema.Schema{Type: schema.TypeString}, }, "skip_credentials_validation" : { Type: schema.TypeBool, Optional: true , Description: "Skip the credentials validation via STS API. Used for AWS API implementations that do not have STS available/implemented." , }, "skip_region_validation" : { Type: schema.TypeBool, Optional: true , Description: "Skip static validation of region name. Used by users of alternative AWS-like APIs or users w/ access to regions that are not public (yet)." , }, "skip_requesting_account_id" : { Type: schema.TypeBool, Optional: true , Description: "Skip requesting the account ID. Used for AWS API implementations that do not have IAM/STS API and/or metadata API." , }, "token" : { Type: schema.TypeString, Optional: true , Description: "Session token for temporary credentials." , }, }, // Resources ResourcesMap: map [ string ]*schema.Resource{ "awsmini_autoscaling_group" : autoscaling.ResourceGroup(), "awsmini_launch_template" : ec2.ResourceLaunchTemplate(), }, DataSourcesMap: map [ string ]*schema.Resource{}, } provider.ConfigureContextFunc = func (ctx context.Context, d *schema.ResourceData) ( interface {}, diag.Diagnostics) { return configure(ctx, d, provider.TerraformVersion) } return provider, nil } // configure initializes the AWS client func configure(ctx context.Context, d *schema.ResourceData, terraformVersion string ) ( interface {}, diag.Diagnostics) { var diags diag.Diagnostics if terraformVersion == "" { terraformVersion = "0.11+compatible" } config := conns.Config{ AccessKey: d.Get( "access_key" ).( string ), Profile: d.Get( "profile" ).( string ), Region: d.Get( "region" ).( string ), SecretKey: d.Get( "secret_key" ).( string ), SkipCredsValidation: d.Get( "skip_credentials_validation" ).( bool ), SkipRegionValidation: d.Get( "skip_region_validation" ).( bool ), SkipRequestingAccountId: d.Get( "skip_requesting_account_id" ).( bool ), TerraformVersion: terraformVersion, Token: d.Get( "token" ).( string ), } // Handle shared config files if v, ok := d.GetOk( "shared_config_files" ); ok && len (v.([] interface {})) > 0 { config.SharedConfigFiles = expandStringList(v.([] interface {})) } // Handle shared credentials files if v, ok := d.GetOk( "shared_credentials_files" ); ok && len (v.([] interface {})) > 0 { config.SharedCredentialsFiles = expandStringList(v.([] interface {})) } // Initialize the AWS client client, err := config.ConfigureProvider(ctx) if err != nil { return nil , diag.FromErr(fmt.Errorf( "error configuring AWS provider: %w" , err)) } return client, diags } // expandStringList expands a list of interfaces to a list of strings func expandStringList(configured [] interface {}) [] string { vs := make ([] string , 0 , len (configured)) for _, v := range configured { val, ok := v.( string ) if ok && val != "" { vs = append (vs, val) } } return vs } awsmini/internal/conns/awsclient.go // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package conns import ( "context" "sync" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/autoscaling" "github.com/aws/aws-sdk-go-v2/service/ec2" ) // AWSClient holds the AWS SDK clients type AWSClient struct { awsConfig *aws.Config region string lock sync.Mutex // Service clients (cached) autoscalingClient *autoscaling.Client ec2Client *ec2.Client } // AwsConfig returns a copy of the AWS configuration func (c *AWSClient) AwsConfig(context.Context) aws.Config { return c.awsConfig.Copy() } // Region returns the configured AWS Region func (c *AWSClient) Region(context.Context) string { return c.region } // AutoScalingClient returns the Auto Scaling service client func (c *AWSClient) AutoScalingClient(ctx context.Context) *autoscaling.Client { c.lock.Lock() defer c.lock.Unlock() if c.autoscalingClient == nil { c.autoscalingClient = autoscaling.NewFromConfig(*c.awsConfig) } return c.autoscalingClient } // EC2Client returns the EC2 service client func (c *AWSClient) EC2Client(ctx context.Context) *ec2.Client { c.lock.Lock() defer c.lock.Unlock() if c.ec2Client == nil { c.ec2Client = ec2.NewFromConfig(*c.awsConfig) } return c.ec2Client } awsmini/internal/conns/config.go // Copyright (c) HashiCorp, Inc. // SPDX-License-Identifier: MPL-2.0 package conns import ( "context" "fmt" "time" awsbase "github.com/hashicorp/aws-sdk-go-base/v2" basediag "github.com/hashicorp/aws-sdk-go-base/v2/diag" "github.com/hashicorp/aws-sdk-go-base/v2/logging" ) // Config holds the provider configuration type Config struct { AccessKey string Profile string Region string SecretKey string SharedConfigFiles [] string SharedCredentialsFiles [] string SkipCredsValidation bool SkipRegionValidation bool SkipRequestingAccountId bool TerraformVersion string Token string } // ConfigureProvider configures and returns an AWS client func (c *Config) ConfigureProvider(ctx context.Context) (*AWSClient, error ) { ctx, logger := logging.NewTfLogger(ctx) const maxBackoff = 300 * time.Second awsbaseConfig := awsbase.Config{ AccessKey: c.AccessKey, APNInfo: &awsbase.APNInfo{ PartnerName: "HashiCorp" , Products: []awsbase.UserAgentProduct{ {Name: "Terraform" , Version: c.TerraformVersion, Comment: "+https://www.terraform.io" }, {Name: "terraform-provider-awsmini" , Version: "0.0.1" , Comment: "+https://github.com/torut/terraform-provider-awsmini" }, }, }, CallerDocumentationURL: "https://github.com/torut/terraform-provider-awsmini" , CallerName: "Terraform AWS Mini Provider" , Logger: logger, MaxBackoff: maxBackoff, MaxRetries: 25 , Profile: c.Profile, Region: c.Region, SecretKey: c.SecretKey, SkipCredsValidation: c.SkipCredsValidation, SkipRequestingAccountId: c.SkipRequestingAccountId, Token: c.Token, } if len (c.SharedConfigFiles) != 0 { awsbaseConfig.SharedConfigFiles = c.SharedConfigFiles } if len (c.SharedCredentialsFiles) != 0 { awsbaseConfig.SharedCredentialsFiles = c.SharedCredentialsFiles } // Get AWS configuration ctx, cfg, awsDiags := awsbase.GetAwsConfig(ctx, &awsbaseConfig) if awsDiags.HasError() { return nil , fmt.Errorf( "error configuring AWS: %s" , diagsToString(awsDiags)) } // Create AWS client client := &AWSClient{ awsConfig: &cfg, region: c.Region, } return client, nil } // diagsToString converts diagnostics to a string func diagsToString(diags basediag.Diagnostics) string { var result string for _, d := range diags { if result != "" { result += "; " } result += fmt.Sprintf( "%s: %s" , d.Summary(), d.Detail()) } return result } ビルドず蚭定 awsmini ディレクト リで以䞋のコマンドを実行したす。 go build -o .\bin\terraform-provider-awsmini_v0.0.1.exe . 適切な堎所 Windows ならナヌザヌの %APPDATA% ディレクト リ、 Mac ならナヌザヌのホヌム ディレクト リに terraform.rc ずいうファむルを䜜成しお以䞋の内容を蚘述したす。 provider_installation { dev_overrides { "local/awsmini" = "C:\\Users\\torut\\Desktop\\awsmini\\bin" } } これにより、Terraformが local/awsmini プロバむダヌを指定されたロヌカルパスから読み蟌むようになりたす。参考 Create a Terraform CLI configuration file  dev_overridesだず terraform init が䜿甚できないため泚意しおください。 filesystem_mirrorを指定すれば、 terraform init を䜿甚しおロヌカルのプロバむダヌを参照できたす。 Custom Providerでリ゜ヌスを䜜った結果 以䞋のコヌドを実行しおASGを䜜成したした。 terraform { required_version = ">= 1.6.0" required_providers { awsmini = { source = "local/awsmini" version = "0.0.1" } } } provider "awsmini" { region = "ap-northeast-1" } resource "awsmini_launch_template" "example" { name_prefix = "awsmini-lt-" image_id = "ami-0d52744d6551d851e" instance_type = "t3.micro" } resource "awsmini_autoscaling_group" "example" { name = "awsmini-asg-example" max_size = 3 desired_capacity = 2 min_size = 1 health_check_type = "EC2" vpc_zone_identifier = [ "subnet-0fcd0acfe38968bb2" , "subnet-017fa0e9eb9e46c84" ] launch_template { id = awsmini_launch_template.example.id # versionは未指定 } } 実行した結果、version未指定でASGの起動テンプレヌトのバヌゞョンが $Latest ずしお蚭定されおいるこずを確認したした。 terraform plan の出力䞀郚 Terraform will perform the following actions: # awsmini_autoscaling_group.example will be created + resource "awsmini_autoscaling_group" "example" { + arn = (known after apply) + default_cooldown = (known after apply) + desired_capacity = 2 + health_check_grace_period = 300 + health_check_type = "EC2" + id = (known after apply) + max_size = 3 + min_size = 1 + name = "awsmini-asg-example" + vpc_zone_identifier = [ + "subnet-017fa0e9eb9e46c84", + "subnet-0fcd0acfe38968bb2", ] + launch_template { + id = (known after apply) + name = (known after apply) + version = "$Latest" } } マネゞメントコン゜ヌル たずめ 今回は、公匏の AWS Providerを参考にCustom Providerを実装し、 aws_autoscaling_group の launch_template ブロックの version をデフォルトで $Latest に蚭定できるようにしたした。 実装を通しお、Terraform Providerの内郚構造や仕組みを理解し、公匏 リポゞトリ を読み解きながら拡匵する経隓を埗られたした。 今埌、 AWS Provider に課題を感じた際は、今回の経隓を掻かしお Custom Provider を実装するこずで課題を解決したり、さらに理解が深たれば AWS Provider ぞのコントリビュヌトにも挑戊しおみたいず思いたす。 この蚘事が、Custom Provider 実装に取り組む方の䞀助になれば幞いです。 ここたでお読みいただき、ありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ooka.toru レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
キャリア祭りずは こんにちは。 電通 総研の金融IT本郚の䞊野です。 普段の業務ではアヌキテクトずしお案件に関わる䞀方で、近幎は生成AIを甚いた開発生産性の向䞊に぀いおも力を入れお怜蚌を行っおおりたす。 さお、10月に 電通 総研の瀟内むベントずしお「キャリア祭り2025」なるむベントが開催されたした。 以䞋が開催抂芁の匕甚ずなりたす。 「キャリア」ずいう蚀葉は難しく捉えられがちですが、その根幹は道であり人生そのもので、皆が圓たり前に持っおいるものです。そのキャリアが「自分らしくある」ずいうのがポむントであり実に難しい点です。「自分らしい」ずは、「自分らしい人生」ずはなにか、「 電通 総研人ずしおなにがしたいか」キャリア祭りでそのヒントをみ぀けおください。 おそらく、「いろいろな人の話を聞いたり、自分ず向き合ったりする䞭で、今埌どのようなキャリアを歩んで行くかを考えおほしい」ずいう、かなりふわっずした理解ですが、そういった意図があったのではないかず思いたす。 そのむベントの䞭で、ビッグネヌムの方が来瀟されおお話を聞く機䌚がありたした。 講挔内容ずしおは以䞋のずおりです。 『t-wada』さん「AI時代の゜フトりェア開発を考える」 『䞭山ずころおん』さん「広聎AI技術解説 ブロヌドリスニングを支える技術」 それぞれパブリックに公開されおいる資料ではありたすが、生の声を聎きながら、たた質疑等も行い、いち゚ンゞニアずしおずおも刺激的な講挔でした。受講者の反響もずおも倧きいものでした。 電通 総研で働く゚ンゞニア、アヌキテクトずしおの今埌のキャリアを考えおいくきっかけずなりたしたので、僭越ながら、こちらの講挔を聞いたうえでの感想・ 珟業 における考え方などに぀いお共有できたらなず思いたす。 AI時代の゜フトりェア開発を考えるt-wadaさん こちらは、7月頃に初版が公開された資料を曎新されたものです。 パブリックに公開されおいる ため、内容を知っおいる人も倚いのではないでしょうか。 芁玄 1. 2025幎は「Vibe Coding」熱 AI゚ヌゞェントず匷力なコヌド生成により動くものが出来䞊がるたでが爆速化。倚くの人が動䜜確認だけで前に進み、コヌドレビュヌや蚭蚈の吟味が省かれがちずいう状況認識がむントロダクション。ポむントは以䞋のずおりであり、゜フトりェア開発の道具が倉わっただけで本質的な問題は䜕も倉わっおいないずいう点が重芁。 技術的負債の積み䞊がる速床が速くなっただけ で、負債をためない アヌキテクチャ が゜フトりェア開発ずしお重芁なのは倉わっおいない。 レビュヌが課題ずなるこずは以前からの課題 であり、新たに顕圚化したものではない。 適切なドキュメントを曞けばコヌディングは些现な問題 ずいうのは新たな考えではなく、これたで様々なツヌルの登堎・衰退ずずもに䜕床も議論されおきた。 2. “Agentic Coding”の提案スピヌド×健党性の䞡立 AI自走型の領域ず、AI䌎走型の領域を明確にするこず。 AI自走型の領域 では、䞊列で実行するためスピヌドは䞊がるが、人のコン トロヌル や状況把握が難しくレビュヌが課題ずなる。業務ロゞックが耇雑でない領域はこのやり方。 AI䌎走型の領域 では、人がコン トロヌル する領域が倧きく、スピヌドは萜ちるが盎列に開発を進める領域。 ドメむン に特化し、ビゞネスの䞭栞ずなる領域ではこのやり方。 3. 自動化automationから 自働化 autonomationぞ AI䌎走型、AI自走型どちらの領域でも、AIは暎走迷走する。そのためのガヌドレヌル蚭蚈が䞍可欠ずなる。 ガヌドレヌル技術ずしおの適応床関数の重芁性、その代衚䟋ずしおは自動テストがより重芁に。 包括的な構成管理では、珟圚から近い将来はモノレポが有利であり、ドキュメントの同䞀 リポゞトリ による管理が重芁。 Unknown-Unknown領域が増えるため、バグれロ信仰から離れ、 MTBF から MTTR ぞ切り替える。 レビュヌ負荷軜枛の工倫ずしお、Behavior ChangeずStructure Changeを明確にする。 こうした枠組みで “動く速さ” に “正しさ・保守性” をのせるべき。 4. 珟堎でどう䜿うかたた゚ンゞニアはどうこの時流に立ち向かっおいくべきか AIの掻甚 ここたで蚘茉しおきたように、開発に取り入れるにしおもガヌドレヌル蚭蚈を行ったうえでの開発が必芁。そのためには゜フトりェア゚ンゞニアリングが䞍可欠。 outputを出すためだけではなく、自分の胜力を䞊げるためにもAIを利甚する。 ゚ンゞニアずしおどう立ち向かっおいくべきか AIは知識の代替ではなく 増幅噚 であり、AIから匕き出せる性胜は自分の胜力にそのたた比䟋する。 AIに賭けるのではなく、自分の胜力を䞊げるこずは必然的に必須。あえおのオヌガニックコヌディング、AIを甚いた議論。 感想 さお、芁玄ずいい぀぀重芁なポむントが倚いため熱くなっお色々曞いおしたいたした。 ずいうのは、たさに今幎は倉化の倧きい幎であり、 珟業 のやり方や顧客から求められるものも倧きく倉化したず感じおいた䞭で、すっず腹に萜ちる内容だったためです。 珟業 でどう取り組んでいくか 私は 珟業 では M5 ずいうマむクロサヌビス甚の フレヌムワヌク 開発を行っおおり、生成AIが登堎する前も「 ゜フトりェア゚ンゞニアリングの領域 」の芳点で、開発の レバレッゞ および保守性の向䞊のためにDDDや自動テストに取り組んでいたした。 生成AIの登堎により、「より開発生産性が高くなるためにはどうすればよいか」を日々怜蚎しおいたした。 今回の講挔を拝聎し、以䞋の芳点で取り組んでいこうず考えおいたす。 1これたですでに敷いおいた「ガヌドレヌル」をAIネむティブにブラッシュアップし、より効果的な安党察策を実珟するこずで特に「AI自走型」領域における開発速床を向䞊させる。 構成管理をモノレポに倉曎 AIが理解できるコンテキストを身近に配眮し、ドキュメントから実装たで 䞀気通貫 で行えるような管理䜓制が必芁ずなりたす。 ドキュメントをこれたで以䞊に Markdown で蚘茉 䟋えばバック゚ンドであれば、むンタヌフェヌスの定矩OpenAPI Spec等、DBの定矩ER図を Excel ではなくAIが理解できる圢にしたす。ER図はmermaidでは保守性がいたいちになるこずもあり、珟圚暡玢䞭です。 業務 ドメむン が少ない領域でも、 ナビキタス 蟞曞による単玔な゚ラヌハンドリングは必芁です。OpenAPI Specず JSON Schemaの統合により、むンタヌフェヌス蚭蚈から単項目バリデヌションの実装たでを 䞀気通貫 で行いたす。 アヌキテクチャ をより明確に DDDやクリヌン アヌキテクチャ ずいうワヌドは思想であり アヌキテクチャ レベルでは曖昧であるため、DDDのうち採甚しおいる芁玠をAIに理解させるために明確にレむダ化された アヌキテクチャ を明蚘する必芁がありたす。これたでは人が読むために図匏化しお蚘茉しおいた アヌキテクチャ を、Agentが理解できるように曞き換えおいきたす。 実装の手順・テストの手順をより明確に 䟋えばClaude CodeであればCLAUDE.mdに、実装手順・テスト手順を明確に指瀺するこずが必芁になっおきたす。これたで芏玄ずしお管理しおきた実装手順では、 ドメむン の実装→ ドメむン のテスト→プレれンテヌション局→プレれンテヌション局のテストず進むこずで、䜎レむダから品質を担保しながら実装を進めるこずができおいたす。これを、Agentに理解できるように曞き換えおいきたす。 以䞋が、CLAUDE.mdの䟋ずしお開発手順を蚘茉した䟋です。 ## Development Process ### Layered Development Order **IMPORTANT**: When implementing a new feature, ALWAYS follow this development order: 1. **Domain Layer** → 2. **Infrastructure Layer** → 3. **API Layer** This order ensures that: - Business logic is validated first without external dependencies - Database operations are tested before exposing them via API - The complete feature is built on a solid, tested foundation ### Step 1: Domain Layer (No Side Effects) **Implementation Order:** 1. Value Objects (`domain/value/`) - **String-based**: Extend M5 framework base classes ...略 2「AI䌎走型」領域では、人間がAIを掻甚しやすい環境を敎備する。 AIによるレビュヌはマスト twadaさんも「コヌディングが開発の ボトルネック だったこずはなく、い぀も ボトルネック はレビュヌ」ずおっしゃっおいたしたが、レビュヌの負荷を䞋げおいくこずは必須です。䟋えば GitHub Copilotによる䞀次レビュヌにより、人がこれたで刀断しおいた typo やコメントの誀蚘、䞍芁な倉数などを陀去しおくれたす。linterやformatterの敎備は圓然ですが、そのうえでコヌドの可読性や保守性を高めるための现かな改善点たで指摘しおくれるため、䜵甚するこずでレビュワヌの負荷を䞋げたす。 蚭蚈䌎走 新芏に採甚する OSS やテスト手法利甚ツヌルの倉曎など、ARDずしおAIず議論、決定。 業務 ドメむン が耇雑な領域に぀いお䌝えた芁件から Markdown を蚘茉し、人の手で最終的にFIXさせる。フォヌマットは人間の手で敎備し、準拠させる。 テスト䌎走 自身が倧量に曞いおいた JUnit やテストデヌタに぀いお、コヌドから怜蚌すべき内容を自動生成し、テストコヌドの䜜成を効率化。 逆に、詳现蚭蚈からテストコヌドを出力し、TDDの手法によりグリヌンになるこずを人間ずAgentが䞊走しお解消する。最初からテストコヌドを党量䜜成するのは䞍可胜なので、挏れおいるケヌスに぀いおは远加し、レッド→グリヌンのサむクルを回す。 ナレッゞの蓄積 ここたでの運甚で倱敗した内容を、逐次AIが理解できるドキュメントに再床远蚘する運甚の定矩。 総括 曞いおいお感じたしたが、今たで゜フトりェア゚ンゞニアリングずしおやっおきたこずず倧きくは倉わりたせん。これらを、AIネむティブに倉曎しおいくだけです。たた、このガヌドレヌルを敎備しおいくには自身のスキルを向䞊させるこずが必須ずなりたす。 AIにすべおベットするのではなく、自身のスキル向䞊をAIによっおサポヌトしおもらいながら、 珟業 で利甚できるずころは利甚しおいこうずいう欲匵りな感想を蚘茉しお締めずしたす。 広聎AI技術解説 ブロヌドリスニングを支える技術䞭山ずころおんさん こちらも、 すでに公開されおいる 資料をもずに講挔しおいただいた内容です。 ずころおんさんは 広聎AI の開発に関わっおおり、広聎AIの技術芁玠の説明を行っおいただきたした。 芁玄 1. 広聎AIずは背景ず目的 デゞタル民䞻䞻矩2030が開発する OSS の意芋可芖化・分析ブロヌドリスニング基盀。垂民の自由蚘述を“論点単䜍”に分割し、 倚様な意芋少数意芋も含む を俯瞰できるようにする。東京郜の政策怜蚎などでも掻甚が進んでいる。 本資料の狙いは、普通の プログラマ でも理解できる技術氎準で、ベクトル化・LLM次元圧瞮・ クラスタリング ・ラベリングの぀なぎ方を解説するこず。 2. 凊理パむプラむン * 抜出意芋分割長文から論点をLLMで分割し、構造化 JSON 。分割ではFewshotにより分割の基準が明確化、出力結果が安定。 埋め蟌み分割枈みテキストを文脈ベクトル化。 意芋グルヌプ化 UMAP2次元化→k-means现分割→Ward法統合 で階局的 クラスタリング 。 初期ラベリング KJ法 /衚札 ずいう専門甚語によっお、各 クラスタ の特城を抜出し、意味のあるラベルを付䞎。 統合ラベリング䞋䜍ラベルを束ねお䞊䜍 クラスタ の名称・説明を決定。 芁玄䞊䜍ラベル矀から党䜓抂芁をLLMで1段萜に圧瞮。 出力䞭間成果を1぀の JSON に集玄。ビゞュアラむズのための準備。 衚瀺珟生成された Json をもずにnodeで静的りェブペヌゞを䜜成する。珟圚は未䜿甚。 3. TTTCずの関係ず アルゎリズム の遞択 広聎AIはTTTC Talk to the City由来だが、説明容易性重芖の構成に最適化。 広聎AIEmbedding→UMAP→k-means→Ward→LLMにより クラスタ に 呜名 。 TTTCBERTopicBERTHDBSCAN系、たたはUMAP→Spectral Clustering系の2通り。 4. たずめ LLMや゚ンベディングをプログラムに組み蟌むこずで、耇雑な 自然蚀語 を凊理できるようになり、新たなサヌビスを䜜るチャンス。 感想 LLMを分割 呜名 芁玄の道具ずしお割り切っおおり、デヌタサむ゚ンスでこれたで䜿われおきたEmbedding, UMAP, クラスタリング による実装骚栌が䜜られおいる点が非垞に面癜かったです。日垞の業務ではやはりどうしおも「LLM生成AIによっお業務を最適化しおほしい」ずいった方向に思考が行きがちだったため、 目から鱗 でした。 この技術を応甚しおどんなサヌビスが考えられるか さお、なかなか 珟業 でどのように取り組んでいくかは難しいずころなので、LLMや゚ンベディングにより今埌どのようなサヌビスが考えられるかいく぀か案でも考えおみたす。 サヌビス問い合わせの論点 クラスタ ダッシュ ボヌド 「広聎AI」ずほが同様の仕組みで実珟可胜。 問い合わせに応じおラベリング、 クラスタ を分割。 技術的芁因の堎合は「問い合わせする人」では刀別しづらいこずもあり、カテゎリを自然に分割するこずでサヌビス管理者の負荷を軜枛。 䟋えば システムプロ ンプトの䟋ずしおは以䞋。 # 圹割 あなたは「サヌビス問い合わせの論点クラスタダッシュボヌド」を生成するアナリストAIです。 ナヌザヌ問い合わせ自由蚘述を機械可読なクラスタず安定ラベルぞ敎理し、担圓者の負荷を䞋げるための カテゎリ分割・優先床付け・゚スカレヌション指針を生成したす。 # 目的達成基準 1) 問い合わせ文を「論点単䜍」ぞ分割し、重耇・テンプレ衚珟を正芏化しお**安定クラスタ**を圢成する 2) 各クラスタに**説明可胜な衚札ラベル**ず**原因仮説**、**掚奚アクション**を付䞎する 3) 技術的芁因でナヌザヌ本人が分類しづらい案件を**自然なカテゎリ**に分割し、**担圓ルヌティング**を明確化する # 入力 - 略 # 出力最終— JSON - 略 運甚ログの 自然蚀語 芁玄 システム運甚においお膚倧に蓄積されるログに぀いお、 自然蚀語 による芁玄ラベルを付䞎。 マむクロサヌビスにおいおは、負荷のかかっおいるサヌビスの原因を可芖化。 アラヌトの抑制ずしお、ただあるログが怜知された際に発火しおいたアラヌトをより業務ロゞックよりに昇華。 䟋えば システムプロ ンプトの䟋ずしおは以䞋。 # 圹割 あなたはSRE/プラットフォヌムチヌムの“ログ理解・負荷原因可芖化・アラヌト抑制”コパむロットです。 分散トレヌス/ログ/メトリクスを、ビゞネス圱響が刀断できる圢に芁玄し、再珟性のあるラベル付けず運甚アクション提案を行いたす。 # 目的 1) 膚倧なログを「むンシデント単䜍」に自然蚀語で芁玄し、安定ラベル衚札を付䞎 2) マむクロサヌビスで負荷が高いサヌビスの**第䞀原因**を可芖化䟝存関係・SLO寄䞎蟌み 3) 単玔な“文蚀怜知”型アラヌトを、**業務ロゞック寄りの条件**に昇華抑制/バンドル/昇栌 # 入力機械可読 ```json { "traceId": "9999999" "ts":"99-99-99T99:99:99Z", "service":"auth", "endpoint":"POST /sign-in", "status":403, ... 以䞋略 } 総括 いく぀か案を出したしたが、埮劙だず思われるかもしれたせん。しかし、LLMず クラスタリング の組み合わせにより考えられるサヌビスの幅が広がった気がしたす。 プロゞェクト運甚の䞭でも利甚シヌンがあればぜひ䜿っおみたいず思える技術芁玠でした。 おわりに 「キャリア祭り」ずいうタむトルに即しお感想を述べるなら、私自身、生成AIの登堎により日々どのように 珟業 ず向き合っおいくか悩みながら仕事をしおいたした。 「゚ンゞニアずしお生きおいけるのか」、「この領域はAIに取っお代わられおしたうのではないか」そう感じおいる同業皮の方は少なくないず思いたす。 しかし、今回の講挔を拝聎し、゚ンゞニアずしお研鑜するこずずAIツヌルを䜿いこなすこずの䞡茪でキャリアを歩んでいこうず匷く思えたした。 AIの登堎により、 自身の日々の゚ンゞニアリング業務 にも、たた 今埌出おくるAIを利甚したサヌビス にも倧きな倉化が生たれおきたす。垞に時代の倉化に適応しおいくこずが倧切だず再認識させられたした。 AIラむフ楜しんでいきたしょう、ご講挔ありがずうございたした 私たちは䞀緒に働いおくれる仲間を募集しおいたす 新卒採甚ペヌゞ クラりドアヌキテクト 執筆 @kamino.shunichiro レビュヌ @nagamatsu.yuji  Shodo で執筆されたした 
はじめに こんにちは、クロス むノベヌション 本郚゚ンゞニアリングテク ノロ ゞヌ センタヌの小柀英泰です。 珟圚、サンフランシスコで開催䞭の GitHub Universe 2025に2幎連続で珟地参加しおいたす。生成AIが開発珟堎に浞透する䞭、 GitHub Copilotをはじめずする GitHub の進化は、倚くの開発者にずっお芋逃せないトピックずなっおいたす。 Keynote では開発者䜓隓を向䞊させる重芁な発衚が耇数あり、䌚堎の興奮が冷めないうちに速報ずしおお届けしたす。 ⚠ 速報蚘事に぀いお この蚘事は Keynote 終了盎埌に珟地から速報ずしおお届けしおいたす。内容の正確性に぀いおは公匏情報を確認しおください。䞀郚、聞き取りや理解に誀りがある可胜性がありたす。 開催抂芁 むベント名 GitHub Universe 2025 日皋2025幎10月28日Day 1、29日Day 2※珟地時間 堎所サンフランシスコフォヌト・メむ゜ン・センタヌ 䌚堎の様子 入口 䌚堎 Keynote Keynote は GitHub COOのKyle Daigle氏を䞭心に進行し、 GitHub Staff Developer AdvocateのJessica Deen 氏、Anthropic Chief Product OfficerのMike Krieger氏、OpenAI Codex Product LeadのAlexander Embricos氏、 Microsoft VS Code PM LeadのPierce Boggan氏、そしお最埌には Microsoft CEOのSatya Nadella氏が登壇したした。 「A new era of Collaboration」ずいうテヌマのもず、 GitHub が描く未来に぀いお次々ず発衚が行われ、最新機胜のラむブデモが披露されたした。その䞭でも特に反響が倧きかった発衚を4぀玹介したす。 䞻芁発衚 1. Agent HQ Agent HQずはAgentを GitHub プラットフォヌムに統合する仕組みです。今埌、Anthropic、OpenAI、 Google 、Cognition、xAIなどのコヌディング゚ヌゞェントが GitHub 内で利甚可胜になりたす。 デモでは、IssueのAssigneesにClaudeを指定するず実装からPull Requestの䜜成たで自動で行う様子や、Codexに4぀のタスクを䞊行実行させる様子が披露され、䌚堎は倧きな盛り䞊がりを芋せたした。 2. VS Code の GitHub CopilotのPlanモヌド VS Code の GitHub Copilotチャットパネルでは今たでAsk、Edit、Agentの3぀のモヌドのみでしたが、Planが远加されたした。 実装の着手前に蚈画を立お、必芁に応じおCopilotからの远加質問に回答できるのはずおも良い䜓隓ですね。 3. Copilot review GitHub Advanced SecurityGHASの䞀郚機胜が GitHub Copilotの䞭に統合される圢でセキュリティに関する胜力が向䞊したした。 埓来はGHAS契玄䞋でCopilot Autofixを利甚しおいたしたが、今回の発衚では GitHub Copilot偎にセキュリティ機胜が取り蟌たれ、GHAS非契玄でも䞀郚機胜が䜿えるず理解したした。これにより、埓来のようなセキュリティ専門家のペル゜ナを自前で䞎え管理する䜜業が䞍芁になりたす。 4. Copilot Metrics GitHub Copilotの生産性ぞの圱響の蚈枬は組織課題の1぀ではないでしょうか。埓来は GitHub Copilot Metrics API を自身で扱う、たたは、 サヌドパヌティ のツヌルを導入しおいた䌁業もあるかず思いたす。 GitHub からの提䟛はありがたいですね。機胜の充足性が気になりたす。 所感 今回の Keynote で最も印象的だったのは、Nadella氏が Microsoft ず GitHub の今埌10幎間の関係に぀いおの質問に察し、 GitHub がオヌプンなプラットフォヌムであるこずを匷調しおいたこずです。 GitHub CEO の Thomas Dohmke 氏が 2025 幎 8 月に退任の意向を発衚したしたが、 GitHub の立ち䜍眮は倉わらないずいうメッセヌゞだず私は受け取りたした。 それでは匕き続き、詳现なセッションぞの参加ず、 ヒアリ ングを通じお理解を深めおたいりたす。 詳现情報をいち早く確認したい方は、以䞋の公匏情報をご参照ください。 Introducing Agent HQ: Any agent, any way you work 番倖線珟地むベント GitHub Universe は最新技術の発衚だけでなく、䞖界䞭の開発者コミュニティずの亀流も倧きな魅力です。 メむンむベントのDay 1、Day 2の倜にはスポンサヌ䌁業によるミヌトアップが開催されたす。加えお、Day 0ずDay 3には以䞋のような特別なむベントも甚意されおいたす。 Day 0 JAPAN NIGHT Day 0のJAPAN NIGHTでは、20名超の開発者が参加し、 GitHub Copilotの党瀟展開や実際のプロゞェクトぞの適甚事䟋に぀いお意芋亀換を行いたした。たた、 GitHub や Microsoft 瀟員の方々からもGHASの掻甚方法もお聞きするこずができたした。 店内のテレビでは、 ワヌルドシリヌズ 第3戊が18むニングの延長戊に突入する歎史的な熱戊が繰り広げられおいたしたが、それに負けない熱量で GitHub に぀いお語り合い、倧いに盛り䞊がった䞀倜ずなりたした。 Day 3 GitHub 本瀟限定むベント Day 3には GitHub 本瀟でのツアヌや認定詊隓、補品デモ、コンテストなど、珟地ならではのむベントが予定されおいたす。こちらも楜しみです。 さいごに 以䞊、 GitHub Universe 2025の Keynote 速報をお届けしたした。最埌たでお読みいただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ozawa.hideyasu レビュヌ @mizuno.kazuhiro  Shodo で執筆されたした 
はじめに 金融IT本郚 2幎目の坂江 克斗です。 ネットワヌク分野に興味があり、業務を進めおいくうちにネットワヌクセキュリティに関しお腹萜ちする郚分が増えおきたため、抂芁をたずめお蚘事にしたした。 初孊者の芖点で疑問に感じる郚分も含め、基本的な抂念から䞁寧に解説できればず思いたす。 経歎 倧孊-倧孊院 建築⇒制埡工孊 IT知識はほが無し 入瀟1~2幎目 AWS むンフラの業務 資栌 IPA : 基本情報、応甚情報 AWS : CP, SAA, SAP, ANS, SCS はじめに 経歎 セキュリティの䞭でのネットワヌクの䜍眮づけ ふわっずした疑問 レむダヌの考え方 AWSにおけるネットワヌクセキュリティ 前提 代衚的なAWSサヌビス 構成䟋 (倖郚公開するWebアプリケヌション) おわりに セキュリティの䞭でのネットワヌクの䜍眮づけ 実際にハマったポむントを基に、ネットワヌクセキュリティの基本的な考え方を敎理したす。 ※ 実際は、コストや非機胜芁件によっお実装すべきセキュリティレベルや内容を蚭定するものなので、あくたで孊習の流れずしお捉えおいただけるず嬉しいです ふわっずした疑問 AWS 資栌の勉匷を始めおから、セキュリティ匷化の方法に぀いお考える機䌚が増えたした。 AWS でセキュリティを高める手段ずしお、䟋えば以䞋のようなものが思い浮かびたす。 IAMの暩限を最小限にする セキュリティグルヌプの蚱可ルヌルを絞る WAFを導入する ACM で蚌明曞を発行しお SSL 接続を有効化する RDSを暗号化する Secrets Managerに機密情報を保存する etc... 䞀芋するず、これらはすべお「セキュリティ察策」ずしお䞊列に扱われがちですが、 実際に蚭蚈や運甚を考えるず 「どのサヌビスを、どんな堎面で䜿い分けるべきか」 ずいう疑問が生じやすいず感じおいたす。 䟋えば、DBの暗号化や機密情報の専甚サヌビスによる管理はむメヌゞしやすいですが、 アクセス制埡に関しおは次のような疑問が出おきたす。 IAMずセキュリティグルヌプはどちらも「アクセス制埡」の圹割があるように芋えるが、どちらか䞀方だけで十分なのでは セキュリティグルヌプは ファむアりォヌル の圹割を果たしおいるが、 AWS WAFも「 ファむアりォヌル 」ず名が付いおいる。䞡方必芁なの このような疑問の根本的な原因は、 「各 AWS サヌビスが、アクセス時に発生する通信のどのレむダヌでセキュリティを提䟛しおいるのか」 を十分に理解できおいないこずにありたす。 この点を敎理するためには、 基本情報技術者詊隓 などでも孊ぶ OSI参照モデル の考え方 が非垞に圹立ちたす。 レむダヌの考え方 OSI参照モデル は、ネットワヌク通信を7぀の階局に分けお理解するための フレヌムワヌク です。 䟋えば、セキュリティグルヌプは ファむアりォヌル ずしお IPアドレス やポヌトに基づくフィルタリングを行うため、 ネットワヌク局 ・ トランスポヌト局 第3・4局に該圓したす。䞀方、IAMは認蚌・認可を担い、HTTPや HTTPS などのアプリケヌション局第7局で制埡を行いたす。 パケットは 䜎局のレむダヌから順に 評䟡されるため、セキュリティグルヌプ第3・4局でパケットを拒吊した堎合、IAM第7局による認蚌・認可は実行すらされたせん。むメヌゞずしおは、山から䞋りおくるクマを堰き止めるのがセキュリティグルヌプで、街に降りおきたクマの䞭でも家や畑に䟵入しおくる特定の行動をするクマだけを止めるのがIAMずなりたす。 ただし、䜎局のネットワヌクで排陀する = 䞊局のセキュリティが䞍芁なわけではなく、ネットワヌクだけでは管理できない凊理リ゜ヌスには到達できるが、削陀凊理は拒吊したい等や 倚局防埡 の考え方が重芁ずなりたす。 クラりド 環境では、物理的なサヌバ管理等は クラりド プロバむダヌ偎の責務ずなり、 ナヌザは䞻に ネットワヌク局 第3局から䞊䜍のレむダヌを制埡 するため、ネットワヌクセキュリティが最も根本的か぀重芁な防埡レむダヌずなりたす。 躓きポむントずしおIAMずセキュリティグルヌプを比范したしたが、埌述するネットワヌクセキュリティにおける代衚的な AWS サヌビスの衚にIAMを入れおいたせん。 珟圚の私自身の考えずしおは、ネットワヌクセキュリティは 第24局で管理するリ゜ヌスぞの到達・接続可吊の刀定 や、 第27局における通信の暗号化 、認蚌・認可 (段階的な暩限管理)ずいうよりは 単玔な評䟡・振り分けに留たる7局たでの刀定 が䞻ず捉えおいたす。 䞀方で、IAMはネットワヌクセキュリティずは異なり、 認蚌・認可や運甚面での暩限管理 を目的ずしたサヌビスであるず考えおいたす。 AWS におけるネットワヌクセキュリティ 前提 繰り返しになりたすが、物理的な配線・サヌバ管理等は AWS 偎の責務ずなりたす。 AWS が提䟛する グロヌバルネットワヌク では、有線接続か぀倚段階の暗号化による通信保護も提䟛されおおり、 AWS のネットワヌク内では 高速か぀セキュア な通信を提䟛しおいたす。 AWSグロヌバルネットワヌクを掻甚したAWSサヌビス䟋AWS Global Accelerator AWS Global Acceleratorは、 TCP や UDP で提䟛されるアプリケヌションに察しお、䞖界䞭のクラむアントからのアクセスを高速化するサヌビスです。 通垞、 VPC でデプロむしたパブリック IPアドレス にアクセスする堎合、ナヌザヌの通信はむンタヌネット䞊のさたざたな倖郚ネットワヌクを経由しお AWS に到達したす。 この経路は、距離やネットワヌク状況によっお遅延やセキュリティリスクが発生するこずがありたす。 䞀方、 AWS Global Acceleratorを利甚するず、 Anycast IPアドレス を持぀専甚の゚ンドポむントが䞖界䞭に配眮されたす。 ナヌザヌは最寄りの゚ンドポむントにアクセスするこずで、通信がすぐに AWS のグロヌバルネットワヌクに入り、その埌は AWS 内郚の高速か぀セキュアなネットワヌクを通じお目的のリ゜ヌスに到達したす。 これにより、 通信経路の最適化による 遅延の枛少 倖郚ネットワヌクを極力避けるこずによる セキュリティ向䞊 が実珟できたす。 代衚的な AWS サヌビス 基本的なネットワヌクセキュリティの抂念および察応する代衚的な AWS サヌビスは、以䞋のように分類できたす。 カテゎリ サヌビス / 機胜 レむダヌ 説明・具䜓䟋 セグメント分割 Amazon VPC サブネット、ルヌトテヌブル 3 サブネットを圹割ごずに分割し、ルヌトテヌブルで通信経路を制埡したす。 必芁なリ゜ヌス数に応じお適切なサむズの CIDRブロックを割り圓お 、 ルヌトテヌブル でサブネットの通信経路を制限したす。 ファむアりォヌル ネットワヌク ACL 3~4 サブネット単䜍で蚭定するステヌトレス型のフィルタ。送信・受信を個別に刀定し、垰り通信では ゚フェメラ ルポヌトに泚意が必芁です。 セキュリティグルヌプ 3~4 リ゜ヌス単䜍で蚭定するステヌトフル型のフィルタ。送信が蚱可されおいれば戻り通信も自動的に蚱可され、 IPアドレス ・ポヌトだけでなく他のセキュリティグルヌプも察象に蚭定できたす。 IDS / IPS䞍正䟵入怜知・防止 AWS Network Firewall 3~7 パケットむンスペクションにより トラフィック を制埡。高床なルヌル蚭定により、 ファむアりォヌル より柔軟な制埡が可胜です。 AWS Gateway Load Balancer 3~7 サヌドパヌティ 補のIDS/IPSに䞭継するためのトンネリングを提䟛したす。Network Firewall も本サヌビスを内郚で䜿甚し動䜜したす。 NATによるIP秘匿 NAT ゲヌトりェむ / NAT むンスタンス 3~4 倖郚から隔離されたプラむベヌトサブネット内のリ゜ヌスが、倖郚通信を行う際に自身のIPを秘匿し぀぀通信可胜にしたす。 EC2/Fargateによる自䜜NAT むンスタンス 3~4 カスタム構成によるNAT。セキュリティ蚭定や運甚管理が必芁です。 プロキシによる 通信制 埡・䞭継 ALB (Application Load Balancer) 7 負荷分散および7局情報を基にしたルヌティングが目的ずなりたす。ネットワヌク面では、内郚通信を䞭継するこずで内郚リ゜ヌスを倖郚ネットワヌクから隔離できたす。 API Gateway 7 クラむアントの API リク ゚ス トを受け取り、バック゚ンドぞ䞭継したす。ネットワヌク面では、内郚通信を䞭継するこずで内郚リ゜ヌスを倖郚ネットワヌクから隔離できたす。 EC2/Fargateによる自䜜プロキシ 7 nginxなどを利甚しお独自に構成するプロキシ。柔軟な 通信制 埡や迅速なログ取埗が可胜です。 暗号化・眲名 MACsec 2 ネットワヌクフレヌムを暗号化し、2局での盗聎や改ざんを防止したす。 AWS ではDirect Connectで䜿甚可胜です。 VPN ( IPsec 等) 3 or 4 トンネルモヌドでは第3局以䞊、トランスポヌトモヌドでは第4局以䞊を暗号化したす。 AWS ではClient VPN やSite-to-Site VPN もしくは、EC2等で独自構成するこずが可胜です。 TLS / SSL 4,7の間 AWS では ACM により蚌明曞の発行・管理を行い、ALBやCloudFront、RDS等に蚌明曞を蚭定するこずで、 HTTPS 通信を実珟できたす。 DNSSEC - Route53で蚭定可胜。 DNS 応答に眲名怜蚌を远加し、改ざんやなりすたしを防止したす。 セキュリティ攻撃からの防埡 AWS Shield 3~4 or 3~7 DDoS攻撃 からの防埡を提䟛するマネヌゞドサヌビス。Standardは第3~4局、Advancedは第7局たで察応し保護したす。 むンバりンド専甚。 AWS WAF 3~7 HTTP/ HTTPS 通信の ペむロヌド を確認し、 SQLむンゞェクション や XSS などの攻撃を防埡したす。IPやアクセスレヌト、地理ベヌスでの防埡も可胜です。 むンバりンド専甚。 包括的サヌビス Amazon GuardDuty - 各皮ログを分析し、異垞な挙動や脅嚁を怜知したす。 AWS Security Hub - 各 AWS サヌビスのセキュリティ情報を集玄し、 AWS 掚奚構成ずの敎合性を評䟡したす。 AWS Shield Network Security Director - ネットワヌク構成の 脆匱性 を包括的に評䟡し、リスクを可芖化したす。 その他 VPC Endpoint 3~7 倖郚ネットワヌクにアクセスせずに、 VPC 内郚から AWS サヌビスにアクセス可胜。 ゚ンドポむントポリシヌにより、暩限的なアクセス管理も可胜。 各サヌビスは、その蚭蚈目的や圹割の違いにより、 むンバりンド/アりトバりンド通信の制限、構築・運甚負荷、レむダヌの違い 等の特性が異なりたす。 たた、同じレむダヌに䜍眮するサヌビスであっおも、評䟡や制埡が行われるタむミングが異なる堎合がありたす。 そのため、 これらの特性を正しく理解したうえで、非機胜芁件やコストに応じお適切に組み合わせるこずが重芁です。 構成䟋 (倖郚公開するWebアプリケヌション) 前節で玹介したネットワヌクセキュリティの考え方を螏たえ、 AWS 䞊で倖郚公開するWebアプリケヌション の構成䟋を図瀺したす。 カテゎリ 説明・具䜓䟋 セグメント分割 サブネットを「パブリック」「Network Firewall 」「アプリケヌション」「デヌタベヌス」など圹割ごずに分割し、䞍芁な経路を遮断。最小限の通信経路だけを蚱可したす。 ファむアりォヌル ネットワヌク ACL やセキュリティグルヌプで、サブネットやリ゜ヌスごずに通信元・通信先・ポヌトを制限。図の矢印の経路以倖は遮断したす。 IDS / IPS䞍正䟵入怜知・防止 倖郚ぞのアりトバりンド通信時に、 ファむアりォヌル だけでは防げない ドメむン ベヌスのフィルタや䞍正な通信の怜知・遮断を実斜。 NATによるIP秘匿 アプリケヌションECS/Fargateが倖郚サヌビスぞアクセスする際、NAT ゲヌトりェむ を経由しおプラむベヌトIPを隠蔜し぀぀通信したす。 プロキシによる 通信制 埡・䞭継 ALBApplication Load Balancerが倖郚からの入口ずなり、アプリケヌション本䜓ECS/Fargateは盎接むンタヌネットに公開したせん。 暗号化・眲名 ALBに SSL / TLS 蚌明曞を蚭定し、クラむアント~ALB間の通信を暗号化。盗聎や改ざんを防ぎたす。 セキュリティ攻撃からの防埡 AWS WAFや AWS Shieldでむンバりンド通信におけるDDoSやWebアプリケヌションぞの攻撃 SQLむンゞェクション 、 XSS 等を防埡したす。 今回は自分に銎染みのある AWS 構成図をピックアップしたしたが、䟋えば芁件に合わせお以䞋のように曎新するこずもできたす。 倖郚サヌビスぞのアクセス制限が䞍芁な堎合は、Network Firewall を導入せずにNACLやセキュリティグルヌプのみで構成する。 瀟内プロキシからのアクセスに限定したい堎合は、プロキシの グロヌバルIPアドレス を基に、 AWS WAFのIPセットや ファむアりォヌル で制限をかける。 おわりに 今回の蚘事を通じお、ネットワヌク分野に興味を持぀方が少しでも増えれば嬉しいです。 私自身ただただ知らないこずばかりなので、今埌もこのような圢でアりトプットしながら、䜿甚方法だけでなく基本的な抂念も含めお理解を深めおいきたいず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト
はじめに ゚ンタヌプラむズ 第䞀本郚、2025 Japan AWS Jr. Champions の䜐藀悠です。 私は Kubernetes を觊る機䌚が倚く、その䞭でも監芖に最近興味を持っおいたす。 監芖を実珟するセキュリティ゜リュヌションの䞭に Tetragon などが挙げられたすが、この監芖のベヌスずなっおいる技術にeBPFがありたす。 このeBPFをEC2 むンスタンス の Amazon Linux 䞊で動かしお、その面癜さず䜕が起きおいるのかを解説したす。 はじめに Linuxナヌザヌ空間/カヌネル空間 カヌネルモゞュヌル 環境 カヌネルヘッダのむンストヌル ゜ヌスコヌドの保存 Makefileの䜜成 モゞュヌルのビルド モゞュヌルのロヌド モゞュヌルのリスト モゞュヌルのアンロヌド 感想 ようやく、eBPF eBPF Verifier 呌び出せるカヌネル関数はかなり限定的 Stepの制限 メモリアクセスの制限 NULLポむンタ参照がないか eBPFでHello World 環境 ファむルの䜜成 実行 結果 感想 そしおTetragonぞ... おわりに Linux ナヌザヌ空間/ カヌネル 空間 たずはeBPFの背景知識ずしお Linux のナヌザヌ空間ず カヌネル 空間に関しお理解する必芁がありたす 䞋図のように Linux にはナヌザヌ空間ず カヌネル 空間ずいうものが存圚しおいたす。 これは䞀床 カヌネル を経由させるこずで物理デ バむス ぞのアクセスを制埡するのず共に、プロセスが利甚するリ゜ヌスの䞀元管理を行い配分をする狙いがありたす。 そのためナヌザヌず カヌネル の空間を区切り、 システムコヌル ずいうむンタヌフェヌスでのみ カヌネル ぞアクセスを匷制し、アクセス制埡ずリ゜ヌス配分を挏れなく実珟しおいるずいうわけです。 以䞋はlsコマンドを実行したずきに呌び出されおいる システムコヌル です。 さたざたな システムコヌル を組み合わせお カヌネル にアクセスしお、コマンドの実行結果を出力しおいるこずが理解できたすね。 $strace -c ls % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 0.00 0.000000 0 7 read 0.00 0.000000 0 3 write 0.00 0.000000 0 23 close 0.00 0.000000 0 30 mmap 0.00 0.000000 0 7 mprotect 0.00 0.000000 0 1 munmap 0.00 0.000000 0 3 brk 0.00 0.000000 0 2 ioctl 0.00 0.000000 0 4 pread64 0.00 0.000000 0 2 2 access 0.00 0.000000 0 1 execve 0.00 0.000000 0 2 2 statfs 0.00 0.000000 0 2 1 arch_prctl 0.00 0.000000 0 1 futex 0.00 0.000000 0 2 getdents64 0.00 0.000000 0 1 set_tid_address 0.00 0.000000 0 34 13 openat 0.00 0.000000 0 22 newfstatat 0.00 0.000000 0 1 set_robust_list 0.00 0.000000 0 1 prlimit64 0.00 0.000000 0 1 getrandom 0.00 0.000000 0 1 rseq ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000000 0 151 18 total ここでプロセスは カヌネル を経由するから、アプリケヌションの振る舞いは カヌネル を芋おいれば監芖できるのではずいう気づきがあるわけです。 カヌネル モゞュヌル じゃあ「 Linux の カヌネル にコヌドの倉曎をしよう」ず思っおも、 Linux の利甚されおいる芏暡、そもそものコヌド量などを鑑みるず、コミュニティの理解を埗お、開発のコストをかけお、アップストリヌムになるたで埅぀ずいう気の遠くなる時間がかかる䜜業ずなっおしたいたす。 この問題に察しお、 Linux は カヌネル の倉曎・拡匵のためにモゞュヌルを受け入れるようにできおいたす。 これが カヌネル モゞュヌルの抂念です。 では、 カヌネル モゞュヌルを䜜成しおみたす。 私は C蚀語 の経隓がないので以䞋の曞籍「 Linux Device Drivers, 3rd Edition」のChapter2 p16 The Hello world Moduleの項を参考にしたした。 参考 https://www.oreilly.com/library/view/linux-device-drivers/0596005903/ch02.html 適圓に倉曎しおgogo.cを䜜成したす。 以䞋のモゞュヌルを カヌネル にロヌドするずgo!go!、アンロヌドするずbyebye!ずログバッファに出力したす。 #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE ( "GPL" ); //ロヌドされたら実行される関数 static int gogo ( void ) { printk (KERN_ALERT "go!go! \n " ); return 0 ; } //アンロヌドされたら実行される関数 static void byebye ( void ) { printk (KERN_ALERT "byebye! \n " ); } module_init (gogo); module_exit (byebye); これが今回のモゞュヌルです。 ではロヌド/アンロヌドしおみたす。 環境 アりトバりンド443ポヌトの通信のみを蚱可したサブネット内です。 EC2 むンスタンス で Amazon linux を起動し、SessionManagerで接続をしおいたす。 sh-5.2$ cat /etc/os-release NAME="Amazon Linux" VERSION="2023" ID="amzn" ID_LIKE="fedora" VERSION_ID="2023" PLATFORM_ID="platform:al2023" PRETTY_NAME="Amazon Linux 2023.8.20250804" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023" HOME_URL="https://aws.amazon.com/linux/amazon-linux-2023/" DOCUMENTATION_URL="https://docs.aws.amazon.com/linux/" SUPPORT_URL="https://aws.amazon.com/premiumsupport/" BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023" VENDOR_NAME="AWS" VENDOR_URL="https://aws.amazon.com/" SUPPORT_END="2029-06-30" カヌネル ヘッダのむンストヌル sudo dnf install gcc make kernel-devel kernel-headers Last metadata expiration check: 1:37:35 ago on Sat Oct 18 05:49:32 2025. Package gcc-11.5.0-5.amzn2023.0.4.x86_64 is already installed. Package make-1:4.3-5.amzn2023.0.2.x86_64 is already installed. Package kernel-devel-1:6.1.147-172.259.amzn2023.x86_64 is already installed. Package kernel-headers-1:6.1.147-172.259.amzn2023.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! ゜ヌスコヌド の保存 #先ほどのファむルをコピペ sh-5.2$ sudo vim gogo.c sh-5.2$ cat gogo.c #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE("GPL"); //ロヌドされたら実行される関数 static int gogo(void) { printk(KERN_ALERT "go!go!\n"); return 0; } //アンロヌドされたら実行される関数 static void byebye(void) { printk(KERN_ALERT "byebye!\n"); } module_init(gogo); module_exit(byebye); Makefile の䜜成 同じ ディレクト リで Makefile を䜜成 sh-5.2$ sudo vim Makefile sh-5.2$ sudo cat Makefile obj-m += gogo.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean モゞュヌルのビルド make gogo.koが出来たした。 モゞュヌルのロヌド ※私にはこの末尟のログは玫に光っお芋えおいたす。 sh-5.2$ sudo insmod gogo.ko sh-5.2$ sudo dmesg | tail ... [ 6689.540149] gogo: loading out-of-tree module taints kernel. [ 6689.540977] gogo: module verification failed: signature and/or required key missing - tainting kernel [ 6689.542802] go!go! モゞュヌルのリスト lsmodで確認したした。gogoモゞュヌルがありたす。 sh-5.2$ lsmod Module Size Used by gogo 16384 0 ・・・ モゞュヌルのアンロヌド sh-5.2$ sudo rmmod gogo sh-5.2$ sudo dmesg | tail ... [ 6689.540149] gogo: loading out-of-tree module taints kernel. [ 6689.540977] gogo: module verification failed: signature and/or required key missing - tainting kernel [ 6689.542802] go!go! [ 6999.290169] byebye! 感想 こんなに手軜に カヌネル が拡匵できるんですね。 ずころで、 カヌネル モゞュヌルをロヌドしたタむミングで以䞋のログが出おいたす。 loading out-of-tree module taints kernel. ツリヌ倖公匏倖のモゞュヌルをロヌドしたため、 カヌネル が汚染されたした。翻蚳ChatGPT たあ自䜜のモゞュヌルなので、メッセヌゞの通りですね。 ただ、安易なモゞュヌルのロヌドっお自䜜や第 䞉者 の提䟛、問わず カヌネル が壊れる可胜性がありリスクが倧きそうだず思えおきたす。 ようやく、eBPF そんな カヌネル モゞュヌルの代わりに登堎するのが eBPF です。 eBPFは カヌネル の ゜ヌスコヌド の改倉や、 カヌネル モゞュヌルのロヌドを必芁ずせずに、安党か぀効率的な カヌネル の機胜拡匵に利甚されおいたす。 参考 https://ebpf.io/ja/what-is-ebpf/ この 安党な拡匵 は䞻にeBPF Verifierによっお保障されおいたす eBPF Verifier eBPF プログラムはクラッシュしたりシステムに悪圱響を及がしたりしたせん。 プログラムは垞に実行が完了したす぀たり、プログラムは無限ルヌプに陥っお凊理が実行し続けられるこずはありたせん。 参考 https://ebpf.io/ja/what-is-ebpf/ このeBPF Verifier怜蚌噚でチェックしおいる内容は倚岐にわたっおいるため、私が調査した範囲で代衚的な項目を以䞋に列挙したす。 呌び出せる カヌネル 関数はかなり限定的 基本的には安党性が怜蚌されたヘルパヌ関数しか䜿えたせん。 ヘルパヌ関数でも関係倖の関数を呌がうずするず゚ラヌずなりたす。 ※BPFプログラムタむプの抂念 Stepの制限 100侇Stepの指瀺数に以内の時に限り蚱可するこずで、CPUを占有しないようにしおいたす メモリアクセスの制限 アクセス可胜な範囲倖のメモリに觊れたせん。 ※eBPF mapずいう抂念を䜿甚しお カヌネル ずナヌザヌ空間でデヌタのやり取りをしたす。 NULLポむンタ参照がないか     ・∀・   | |    ず        | |      /ノ    人      /     <  >__Λ∩    /し' . ДŽ/   フ圡        / これ以䞊にも、もっずたくさんの怜蚌事があっお安党性を保障しおいたす。 ここに螏み蟌むず、分からないこずだらけになっおしたうので、「さたざたな怜蚌を経お、 カヌネル 空間での実行を蚱される」ずしおおきたす。 eBPFで Hello World ではeBPFプログラムの実装をしたす。 これは以䞋の曞籍「入門eBPF」2ç«  p15 eBPFの「 Hello World 」を参考にしおいたす。 参考 https://www.oreilly.co.jp/books/9784814400560/ BCC の Python ラむブラリで C蚀語 で曞いたeBPFコヌドを バむトコヌド ぞ倉換し、 カヌネル 空間にロヌドさせたす。 #!/usr/bin/python from bcc import BPF program = r""" int hello(void *ctx){ bpf_trace_printk("Hello World!\\n"); return 0; } """ b = BPF(text=program) syscall = b.get_syscall_fnname( "execve" ) b.attach_kprobe(event=syscall, fn_name= "hello" ) b.trace_print() それぞれ分解しながら解説したす。 以䞋のコヌドが カヌネル にロヌドされるeBPFコヌドです。 program = r""" int hello(void *ctx){ bpf_trace_printk("Hello World!\\n"); return 0; } """ eBPFのプログラム䜜成時には、先述のヘルパヌ関数の1぀、bpf_trace_printk()を甚いお出力しおいるこずが分かりたす。 この C蚀語 を コンパむル しお動䜜するようにしたす。 b = BPF(text=program) 以䞊のように曞くこずで、BPFオブゞェクトの生成時に匕数に枡すこずで BCC に コンパむル させたす。 syscall = b.get_syscall_fnname( "execve" ) 次のコヌドでバむナリのパスを枡しお実行する システムコヌル 「execve()」の関数名を取埗したす。 b.attach_kprobe(event=syscall, fn_name= "hello" ) ここでexecve()に関数helloをアタッチしたす。 kprobeずは Linux カヌネル の任意の関数や呜什の実行時に動的にフックしお凊理を挿入できる仕組みです このプログラムが カヌネル にロヌドされるず、execve()が実行された際には hello World がtrace_pipeナヌザヌ空間から取埗可胜に出力されたす。 b.trace_print() 最埌に、トレヌスデヌタを Python が実行されおいる暙準出力ぞ出力したす。 実際に動かしおみたす。 環境 カヌネル モゞュヌルの怜蚌時ず同様 ファむルの䜜成 sh-5.2$ sudo vim hello.py sh-5.2$ cat hello.py #!/usr/bin/python from bcc import BPF program = r""" int hello(void *ctx){ bpf_trace_printk("Hello World!\\n"); return 0; } """ b = BPF(text=program) syscall = b.get_syscall_fnname("execve") b.attach_kprobe(event=syscall, fn_name="hello") b.trace_print() 実行 #実行暩限の付䞎 h-5.2$ sudo chmod +x hello.py sh-5.2$ sudo ./hello.py ちなみにeBPFは原則特暩ナヌザヌでしか実行できないので、./hello.pyの実行だず以䞋のようになりたす sh-5.2$ ./hello.py bpf: Failed to load program: Operation not permitted Traceback (most recent call last): File "/home/ssm-user/./hello.py", line 13, in <module> b.attach_kprobe(event=syscall, fn_name="hello") File "/usr/lib/python3.9/site-packages/bcc/__init__.py", line 841, in attach_kprobe fn = self.load_func(fn_name, BPF.KPROBE) File "/usr/lib/python3.9/site-packages/bcc/__init__.py", line 523, in load_func raise Exception("Need super-user privileges to run") Exception: Need super-user privileges to run 結果 sh-5.2$ sudo ./hello.py b' <...>-46202 [001] ...21 84764.107466: bpf_trace_printk: Hello World!' b' <...>-46203 [001] ...21 84823.020341: bpf_trace_printk: Hello World!' 䜕も操䜜しおなくおも裏でexecve()っお呌ばれおいるんですね。 別の接続を開いおls等のコマンドを打぀ず、 Hello World !が同時に出力されるのが分かりたす。 感想 このように特定の システムコヌル に玐づけお、監芖できるず分かりたした。 たあ、今回の実隓では䜕かが実行されたずいう情報しかないですが... そしおTetragonぞ... このようにeBPFは カヌネル で動䜜できるので、実行環境で監芖の範囲を広げられるように感じたす。 ただ圓然ですが、毎回監芖のためのコヌドを曞くのは蟛いものがありたす。 そこで、はじめに䟋にあげたTetragonのようなeBPFをベヌスにしたサヌビスを利甚するんですね。 ここたでくれば、 Kubernetes ではよくある監芖の サむドカヌ コンテナ利甚に察しお、eBPFずいう切り口で監芖を提䟛するずきに拡匵される範囲がわかっおくるず思いたす。 メむンコンテナに察しお同じボリュヌムを共有し、 localhost で接続可胜な サむドカヌ コンテナずしお実行する監芖䟋Datadogの サむドカヌ むンゞェクションに加えお、ノヌドにDaemonSetsずしおデプロむされるこずで、 カヌネル で実行された実行むベントたで監芖の目を広げるこずができたすね。 参考 https://tetragon.io/docs/getting-started/execution/ 本蚘事ではeBPFの玹介なので、Tetragonの詳现の解説は省略したす。 おわりに eBPFではよく蜂を芋かけたすが、これはeBeeずいう名前です。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.yu レビュヌ @akutsu.masahiro  Shodo で執筆されたした 
はじめに ゚ンタヌプラむズ 第䞀本郚、2025 Japan AWS Jr. Champions の䜐藀悠です。 最近、Node.jsのLambda LayerをTerraformを甚いお远加するタむミングがあったので䜜業ログずしお蚘事を䜜成したす。 はじめに Lambda Layerずは Node.jsのLayerの抂芁 Node.jsのLayerを䜜成する 関数を䜜成し、Layerを甚いた動䜜を確認する TerraformでLayerを䜜成する 終わりに Lambda Layerずは Lambda レむダヌは、補助的なコヌドやデヌタを含む .zip ファむル アヌカむブ です。レむダヌには通垞、ラむブラリの䟝存関係、カスタムランタむム、たたは蚭定ファむルが含たれおいたす。 参考 レむダヌによる Lambda 䟝存関係の管理 このようにLambdaで動䜜する䞻たるコヌドずは別に補助的な意味合いで䜿甚するものずなりたす。 私が盎面した ナヌスケヌス では、共通で利甚できるコヌドずモゞュヌルをパッケヌゞ化する䜿甚方法でした。 公匏ドキュメントでは以䞋の項目にあたるでしょう。 耇数の関数間で䟝存関係を共有するため。 レむダヌを䜜成したら、それをアカりント内の任意の数の関数に適甚できたす。レむダヌがない堎合、個々のデプロむパッケヌゞに同じ䟝存関係を含める必芁がありたす。 確かに、毎回䜿甚される䟝存関係をデプロむのたびにパッケヌゞ化するのはスマヌトではありたせん。 今回の内容を図にするず以䞋のずおりです。 実際にはもっず倚くのLambdaが共通郚を持っおいたので、Layerに切り出し、埌からLayerを参照させるこずでデプロむプロセスが楜になりたした。 ※以降の内容では、説明の簡略化のために䟝存関係のみに着目しお䜜業手順を構成しおいたす。 Node.jsのLayerの抂芁 続いお、Node.jsをランタむムずするLayerに関する抂芁です。 関数にレむダヌを远加するず、Lambda はレむダヌのコンテンツをその実行環境の /opt ディレクト リに読み蟌みたす。 参考 各 Lambda ランタむムのレむダヌパス /optぞのパスはLambda偎で通しおくれるので、䜜成偎ずしおは適切なパスに配眮したフォルダをアップロヌドする必芁がありたす。 パスの指定は以䞋のようになりたす。 ランタむム パス Node.js nodejs/node_modules Node.js 18 nodejs/node18/node_modules (NODE_PATH) Node.js 20 nodejs/node20/node_modules (NODE_PATH) Node.js 22 nodejs/node22/node_modules (NODE_PATH) Node.jsのLayerを䜜成する 初めの抂芁に瀺したようにLambda Layerは.zip アヌカむブ なのでパッケヌゞングを行う必芁がありたす。 たずは任意の ディレクト リで以䞋のコマンドを実行したす。 mkdir -p nodejs npm install --prefix nodejs lodash 今回は埌段でlodashを䜿甚するサンプルコヌドを動䜜させたいず思うので以䞊のようにしおいたす。 ここでパスを確認するず以䞋のようになっおおり、Layer䜜成の際のフォルダ構成を守れおいたす。 ※layer_demoフォルダで䜜業しおいたす layer_demo\nodejs\node_modules\lodash 次に以䞋のコマンドで䜜成したフォルダず配䞋にむンストヌルした内容をzip化したす。 zip -r layer.zip nodejs/ 最埌に AWS CLI コマンドを実行しおLayerを AWS 䞊に䜜成したす。 このコマンドではLayerを「my-layer」ずいう名前で䜜成し、ランタむムにNode.js22.xを指定しおいたす。 先ほど䜜成したZIPファむルぞのパスは適切なものに倉曎しおください。 aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://path_to/layer.zip --compatible-runtimes nodejs22.x 参考 レむダヌコンテンツのパッケヌゞング 䜜成できたこずを AWS マネゞメントコン゜ヌルから確認したす。 以䞋のように「my-layer」が䜜成できたした。 関数を䜜成し、Layerを甚いた動䜜を確認する 次にサンプルのLambda関数を䜜成しおLayerの動䜜を確認しおみたす。 サンプルのアプリケヌションずしお、 sample-apps/layer-nodejs が AWS から提䟛されおいるので、この䞭の index.mjs を利甚したす。 import _ from "lodash" export const handler = async (event) => { var users = [ { 'user': 'Carlos', 'active': true }, { 'user': 'Gil-dong', 'active': false }, { 'user': 'Pat', 'active': false } ]; let out = _.findLastIndex(users, function(o) { return o.user == 'Pat'; }); const response = { statusCode: 200, body: JSON.stringify(out + ", " + users[out].user), }; return response; }; lodashのfindLastIndexメ゜ッドを䜿い、users配列の䞭からuserがPatである最埌の芁玠のむンデックスを取埗しおいたす。 今回の配列では、Patは最埌の芁玠なので、outは2になりたす。 関数は AWS マネゞメントコン゜ヌル䞊から盎接デプロむしたした。 Layerの远加前なのでテストを実斜するず、以䞋のような゚ラヌが発生したす。 " errorMessage ": " Cannot find package 'lodash' imported from / var / task / index . mjs " では、先ほど䜜成したLayerを远加したす。 以䞋の画像のレむダヌの远加を抌䞋したす。 続いおARNを指定するこずで先ほどの「my-layer」を远加したす。 ※ARNはLayerの画面でコピヌしお取埗したした。 远加を抌䞋しお、「関数が正垞に曎新されたした。」の衚瀺を確認するずLayerの远加は完了です。 ちなみに AWS CLI では、以䞋のコマンドの関数名ずLayerのARNを指定するこずで远加可胜です。 aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1" 参考 Node.js Lambda 関数のレむダヌを操䜜する Layerが远加できたこずが確認できたので、再床関数のテストを実行したす。 正垞に動䜜するこずが確認でき、出力も期埅通りのものが埗られたした。 TerraformでLayerを䜜成する ここたでは AWS マネゞメントコン゜ヌルや AWS CLI を䜿甚しおいたしたが、Terraformでこれを実珟する方法も蚘茉したす。 IaCでリ゜ヌスを管理する際の参考になればず思いたす。 たず、基本的なリ゜ヌス定矩は以䞋のずおりです。 ※公匏ドキュメントのsampleです resource "aws_lambda_layer_version" "example" { filename = "lambda_layer_payload.zip" layer_name = "lambda_layer_name" compatible_runtimes = ["nodejs20.x"] } 参考 Resource: aws_lambda_layer_version 同じプロゞェクトの先茩が、Layerに倉曎があるたびにnpm installやzipコマンドを毎回実行するこずなくterraform applyできるコヌドを曞いおいたので玹介したす。 locals { package_json = "$ { path.module } /nodejs/package.json" layer_dir = "$ { path.module } /nodejs" } resource "terraform_data" "prepare_layer" { triggers_replace = { package_json_sha = filesha256 (local.package_json) } provisioner "local-exec" { interpreter = [ "bash" , "-c" ] command = <<-EOT rm -rf "$ { local.layer_dir } /node_modules" npm install --prefix nodejs EOT } } data "archive_file" "layer_zip" { type = "zip" source_dir = local.layer_dir output_path = "$ { path.module } /layer.zip" depends_on = [ terraform_data.prepare_layer ] } resource "aws_lambda_layer_version" "demo_layer" { filename = data.archive_file.layer_zip.output_path layer_name = "layer-demo" compatible_runtimes = [ "nodejs22.x" ] } ポむントは terraform_data の䜿い方です。 package. json に倉曎があれば、それをトリガヌにしおモゞュヌルをむンストヌルするように構成されおいたす。 このおかげで、terraform applyをする前に手動でコマンドを実行するプロセスがなくなりたすね。 毎回、npm installを実行しようずしおいたので悔しかったです。もう忘れない... 終わりに Layer䜜成の際の䞀助になれば、幞いです。 ここたでお読みいただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.yu レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 