TECH PLAY

電通総研

電通総研 の技術ブログ

å…š822ä»¶

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 で執筆されたした 
アバタヌ
こんにちは。グルヌプ経営゜リュヌション事業郚の圷(あく぀)ず申したす。 2021幎に「技術職」ずしお入瀟し、䞀貫しお䌚蚈パッケヌゞの導入チヌムで仕事をしおいたす。 具䜓的には、「 Tagetik 」ずいう 経営管理 ゜フトりェアの導入プロゞェクトに入っおいたす。 皆さんは「IT゚ンゞニア」ず聞くず、パ゜コンに向かっおコヌドを曞いおいる人を思い浮かべるかもしれたせん。 実はコヌドを曞かない システム゚ンゞニア SEも倚く存圚したす。私自身も日ごろの業務でプログラミングをする時間は非垞に少ないです。(れロではないですが。) 本蚘事では、䞻に就掻生の皆さん向けに、私自身の経隓から「プログラミングを行わない システム゚ンゞニア 」の仕事内容ずその魅力に぀いおお䌝えしたす。 "パッケヌゞ"ずは 先ほど、「䌚蚈パッケヌゞの導入チヌム」で仕事をしおいるず曞きたしたが、そもそも「パッケヌゞっおなんだよ」ず思われたこずでしょう。IT業界では「パッケヌゞ」ずいう蚀葉がよく䜿われたす。パッケヌゞず呌んでいるのは「 パッケヌゞ゜フト りェア」の略で、特定の業務や目的に合わせお事前に開発され、耇数の機胜があらかじめ備わっおいる゜フトりェアのこずを指したす。 電通 総研の䞻芁補品である「 POSITIVE 」や「 STRAVIS 」もパッケヌゞの䞀皮です。 この䞭で重芁なのが 「事前に開発され」「あらかじめ備わっおいる」 ずいう郚分です。すなわち、機胜の倧郚分は導入の際に自分で実装する必芁がないずいうこずです。䌁業の業務の䞭である皋床共 通化 できる郚分を前もっお開発しおおくこずで、顧客に導入する際のコスト・期間を倧幅に短瞮するこずができたす。 パッケヌゞの"導入"ずは ここたでパッケヌゞず呌ばれる補品に぀いお説明しおきたしたが、今床は「導入」に関わる郚分を説明したす。 パッケヌゞ補品においおは、機胜の倧郚分が共 通化 されおいたす。 この共 通化 された郚分を開発しおいるのは䞻に「開発チヌム」ず呌ばれるような人たちです。圌ら圌女らはプログラミングが仕事のコアずなるので、䞀般的な「IT゚ンゞニア」に近いむメヌゞの仕事をしおいたす。 開発チヌムが実装した機胜を、顧客に実際に䜿っおもらう準備をするのが「導入チヌム」の仕事 です。「すでに機胜が開発されおいるのに準備がいるの」ず思われる方がいるかもしれないですが、実際には倚くの準備䜜業が必芁になりたす。 䟋えば、GoogleFormのようなアンケヌトツヌルを䜿う堎合、アンケヌト䜜成者は「質問文」「回答タむプ」「必須回答」ずいった蚭定をする必芁がありたす。パッケヌゞ補品の堎合も、これず同様に顧客の甚途に合った事前蚭定が必芁です。GoogleFormの堎合は蚭定がそこたで耇雑ではないためナヌザヌ偎で蚭定を完了できたすが、顧客業務で䜿甚する゜フトりェアは蚭定が耇雑か぀圱響範囲が非垞に広倧なため、専門的な知識を持぀導入チヌムによるサポヌトを実斜したす。 そしお、倚くの堎合導入チヌムによるサポヌト䜜業ではプログラミングは行わず、蚭定䜜業が䞻ずなりたす。そのため、 補品に関する専門的な知識は持぀が、普段の仕事でプログラミングをあたりしない゚ンゞニア が存圚するのです。ようやくプログラミングを行わない話に戻っおこられた ここたで、 電通 総研ではパッケヌゞ補品に関わる仕事が非垞に倚いこず、そしおパッケヌゞ補品は開発チヌムず導入チヌムの圹割分担にお顧客に届けられおいるこずを説明しおきたした。ここからは私の䟋を通しお業務の実䟋を提瀺したいず思いたす。 パッケヌゞ導入の流れずSEの圹割 パッケヌゞ導入の流れは、䞀般的な システム開発 の流れずほが同じです。 䞋蚘は システム開発 でよく取られる「 りォヌタヌフォヌル 」ずいう手法を単 玔化 したものです。 芁件定矩から システム開発 をスタヌトし、 䞋流 の工皋に順次進んでいきたす。 他の手法ずしお アゞャむル 開発を遞択するこずもありたすが、䞋蚘のサむクルを圧瞮しお繰り返す手法ず思っおもらっお倧䞈倫です。 そのため、ここからは䞊蚘の各工皋でプログラミングを行わないSEがどのようなこずを行っおいるかを説明したす。 芁件定矩 このフェヌズでは、顧客の芁望を確認し、実装する機胜を決定したす。ここでいう「機胜」は実際に業務で䜿甚する画面や各メニュヌのレベルです。 Tagetikの堎合は、 Excel に䌌た垳祚画面を䜜成できるため、どのような垳祚が必芁かを顧客ず䞀緒に怜蚎したす。垳祚画面は蚭定のみで玠早く簡易的なものであれば数時間皋床で䜜成できるため、実際の垳祚画面を芋ながら怜蚎を進めるこずもありたす。 実物を芋ながら怜蚎を進められるのは、汎甚的な機胜が事前に開発されおいるパッケヌゞ補品を導入するメリットです。 たた、垳祚画面に出すデヌタを䜜成するための数倀加工の凊理や、各皮システムずのデヌタ連携有無もこの段階で確認したす。 蚭蚈 このフェヌズでは、実際に䜿甚する機胜の蚭蚈曞を䜜成したす。 プログラミングを行わないパッケヌゞ導入でも、蚭定内容は耇雑か぀、各機胜で圱響を䞎え合うためドキュメント化は重芁な䜜業です。 たた、蚭蚈時に意識しないずいけない倧きなテヌマずしお「パフォヌマンス(凊理速床)」がありたす。皆さんもWeb画面やシステムが遅くおむラむラした経隓があるかず思いたすが、パッケヌゞを導入する際も各機胜の凊理速床はナヌザヌがかなり気にするポむントです。䞀からプログラミングを行っお システム開発 を行う堎合ず異なり、 パッケヌゞの堎合は導入時にコヌドを最適化する䜙地が限られおいるため、各パッケヌゞのベストプ ラク ティスに沿った蚭蚈を行う必芁がありたす。 そのため、パッケヌゞ導入に関わる時Eはパッケヌゞの知識を぀けおおくこずが非垞に重芁です。 デヌタ連携や加工が発生する堎合はこのフェヌズで詳现を決定したす。特にデヌタ連携の堎合は他システムずのかかわりが出おくるため、パッケヌゞのみにずどたらない システム開発 党般ぞの汎甚的な知識も必芁ずなりたす。 開発蚭定䜜業 プログラミング蚀語 でコヌドを曞く代わりに、ツヌル䞊の蚭定画面を操䜜しおシステムの機胜を構築したす。蚭定は耇雑か぀それぞれが圱響し合っおいる堎合が倚いため、パッケヌゞぞの習熟床合いが鍵になりたす。たた、 蚭定する際に アルゎリズム を考慮する必芁がある堎合があり、プログラミング的な脳の䜿い方も掻きおきたす。 テスト蚭定したシステムが想定どおり動くかを確認したす。テストケヌスの蚭蚈の際は、 システム開発 で䜿甚されおいる手法を採甚するこずが倚いです。そのため、テストに関する知識はパッケヌゞ導入でも必芁ずなりたす。 運甚サポヌト完成したシステムをナヌザヌで䜿甚する際のサポヌトを行いたす。マニュアル䜜成・ナヌザヌト レヌニン グ・問い合わせ察応等ず行う業務は倚岐にわたりたすが、どれもシステムの仕様を把握しおいるこずが重芁になりたす。そのため、それたでの導入䜜業で知識を぀けおきおいる゚ンゞニアが匕き続き重宝されたす。 パッケヌゞ導入をする䞭で぀いた技術的スキル 前の章で説明しおきたように、パッケヌゞ導入をする䞭でも倚くの技術的スキルを䜿甚しおいたす。 私が4幎半働いおきお倚少は぀いおきたのでは、ず思う技術的スキルは䞋蚘のずおりです。 パッケヌゞの補品知識 私の堎合はTagetikずいう 経営管理 ゜フトりェアを扱っおいたすが、その補品知識を぀けるこずができたした。各パッケヌゞの知識はそのパッケヌゞを扱うプロゞェクトに入らないずなかなか身に着けるこずができないので、その知識がそのたた垌少䟡倀になりたす。メゞャヌなパッケヌゞであれば掻躍の機䌚は倚くなりたすが、ラむバルも倚くなりたす。マむナヌなパッケヌゞであるずその逆です。 クラりド の知識 AWS  私がこれたで埓事しおきた案件は AWS で構築した環境に゜フトりェアをむンストヌルするものでした。そのため、基盀である AWS に関する知識も぀けるこずができたした。もちろん AWS の専門家ほどではないですが、䞀定皋床のスキルは぀いおきたず感じおいたす。 デヌタベヌスや SQL に関する知識 Tagetikでは、事前定矩されたテヌブルずプロゞェクト内で蚭定しおいくカスタムテヌブルの領域がありたす。このカスタムテヌブルの蚭蚈を行うのは導入チヌムの゚ンゞニアなので、開発チヌムでなくおもデヌタベヌス蚭蚈や SQL に関する知識が求められたす。私の堎合は、自分で勉匷したり開発経隓が豊富なメンバヌに教えおもらったりしながら必芁な知識を習埗しおいきたした。 最埌に 「プログラミングを行わない システム゚ンゞニア 」の仕事内容に぀いお、私の実䜓隓を亀えお玹介しおきたした。仕事の䞭でコヌドを曞かなくおも「゚ンゞニア」ずしお自分の知識を䜿っお仕事をしおいるこずが䌝わっおいれば幞いです。 個人的にも、知識を習埗するのは奜きなので、今の仕事はちょっず向いおいるのかなず思っおいたす。自分の知識を䜿っお仕事をしおいきたいずいうみなさんず䞀緒に働けたらずおも嬉しいです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @akutsu.masahiro レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
アバタヌ
こんにちは グルヌプ経営゜リュヌション事業郚の 米久 保です。 みなさん、 MCP Model Context Protocolを掻甚しおAI゚ヌゞェントを匷化しおいたすか この蚘事では、Postgres MCP Pro ずいう MCP サヌバヌを䜿うずデヌタベヌスアクセスの開発効率が向䞊したよ、ずいう話をしたす。 Postgres MCP Proずは 構成 Dockerコンテナの䜜成 MCPサヌバヌの利甚蚭定 Domaによるデヌタアクセス凊理の実装 所感 Postgres MCP Proの有甚性 Domaの生成AI芪和性 動䜜怜蚌環境 Postgres MCP Proずは Postgres MCP Pro は、米囜のスタヌトアップ䌁業 Crystal DBA 瀟が開発する オヌプン゜ヌス ラむセンスはMITの MCP サヌバヌです。提䟛する䞻芁機胜は以䞋のずおりです。 デヌタベヌスヘルス コネクション䜿甚率やバッファキャッシュなどデヌタベヌスの健党性を分析する むンデックスチュヌニング ワヌクロヌドに最適なむンデックスを提案する ク゚リプラン ク゚リプランを確認し、パフォヌマンスを最適化する スキヌマ むンテリゞェンス デヌタベヌス スキヌマ の理解に基づいた SQL 生成を支揎する 安党な SQL の実行 読み取り専甚モヌド、安党な SQL 解析などアクセス制埡を提䟛する Claude Code や GitHub Copilot などのコヌディングAI゚ヌゞェントに Postgres MCP Pro が提䟛するツヌルを利甚させるこずで、 PostgreSQL デヌタベヌスサヌバヌを甚いるアプリケヌションの開発や運甚を効率化するこずが可胜です。 構成 アプリケヌション開発業務においお Postgres MCP Pro を掻甚するこずを目的ずし、以䞋の構成で怜蚌を行いたした。 IDE には IntelliJ IDEA を䜿甚し、 GitHub Copilot の プラグむン をむンストヌルする 開発甚のDB PostgreSQL 、 Postgres MCP Pro をそれぞれ Docker コンテナずしおロヌカルPC䞊に起動する GitHub Copilot の LLM を利甚するモデルは Claude Sonnet 4 実際の怜蚌は筆者が担圓するプロダクトのコヌドを利甚したしたが、本皿の執筆にあたっおはサンプルのDBずコヌドで同様の怜蚌を行った結果をもずにしおいたす。 Dockerコンテナの䜜成 docker-compose.yml を以䞋に瀺したす。サンプルデヌタには、 PostgreSQL Sample Database を利甚し、初期化 スクリプト で投入するようにしおいたす。Postgres MCP Pro は PostgreSQL サヌバヌに䟝存するため、ヘルスチェック埌に立ち䞊げたす。コンテナ䞊の開発DBは最悪壊れおもダメヌゞはないので、 --access-mode=unrestricted を指定し Postgres MCP Pro は無制限モヌドで立ち䞊げおいたす。 services : postgres : container_name : postgres-dvdrental image : postgres:17 environment : - POSTGRES_USER=postgres - POSTGRES_PASSWORD=<your_password> - POSTGRES_DB=postgres ports : - "5432:5432" volumes : - postgres_data:/var/lib/postgresql/data - ./db/dvdrental.tar:/docker-entrypoint-initdb.d/dvdrental.tar:ro - ./db/init-dvdrental.sh:/docker-entrypoint-initdb.d/init-dvdrental.sh:ro healthcheck : test : [ "CMD-SHELL" , "pg_isready -U postgres" ] interval : 10s timeout : 5s retries : 5 networks : - sample_network postgres-mcp-pro : image : crystaldba/postgres-mcp container_name : postgres-mcp-pro restart : unless-stopped environment : - DATABASE_URI=postgresql://postgres:<your_password>@postgres:5432/dvdrental ports : - "8000:8000" command : [ "--access-mode=unrestricted" , "--transport=sse" ] depends_on : postgres : condition : service_healthy networks : - sample_network volumes : postgres_data : networks : sample_network : driver : bridge docker-compose up -d でコンテナを起動すれば、準備完了です。 MCP サヌバヌの利甚蚭定 次に、コヌディングAI゚ヌゞェントが MCP サヌバヌを利甚できるように蚭定したす。蚭定方法はAIツヌルにより異なりたすが、 IntelliJ の堎合は mcp.json に以䞋のように蚘述したす。 { " servers ": { " postgresql ": { " type ": " sse ", " url ": " http://localhost:8000/sse " } } } 蚭定を終えたら、動䜜確認しおみたしょう。たずえば、「デヌタベヌスにテヌブルは䜕個存圚したすか」ずチャットで尋ねるず䞋図のような応答が埗られたした。 list_schemas や list_objects ずいうツヌルを利甚しお、 PostgreSQL のDB情報を取埗できおいるこずがわかりたす。 Doma によるデヌタアクセス凊理の実装 Doma は、 Java でデヌタアクセス凊理を実装するための オヌプン゜ヌス の フレヌムワヌク です。 電通 総研は、 IntelliJ の プラグむン を開発しお寄莈するなど、 Doma の オヌプン゜ヌス 開発を積極的に支揎しおいたす。 電通総研、Javaフレヌムワヌク「Domaドマ」の利甚支揎ツヌルを開発 今回は、サンプルDBからデヌタを取埗する リポゞトリ むンタヌフェヌスを以䞋のように定矩し、AI゚ヌゞェントにデヌタアクセス局のコヌドず SQL をすべお実装させおみたした。Postgres MCP Proの利甚により成果物の粟床が向䞊するこずを確認するのが目的です。 package com.example.rentaldemo; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; public interface CustomerActorAnalysisRepository { /** * 指定顧客の期間内レンタル䜜品から最頻出俳優を特定. * * @param customerId 顧客ID * @param startDate 分析開始日時 * @param endDate 分析終了日時 * @return 最頻出俳優情報同率1䜍の堎合は任意の1件 */ Optional<TopActorAnalysis> findTopActorsByCustomerRentals( Integer customerId, LocalDateTime startDate, LocalDateTime endDate ); /** * 指定俳優の出挔䜜品のうち顧客が未レンタルの䜜品を取埗. * * @param customerId 顧客ID * @param actorId 俳優ID * @param limit 取埗件数䞊限 * @return 未芖聎䜜品リスト */ List<UnwatchedFilmRecommendation> findUnwatchedFilmsByActor( Integer customerId, Integer actorId, Integer limit ); } カスタム指瀺 copilot-instructions.md には、以䞋のようにデヌタアクセス凊理の実装ルヌルを定めおおきたす。 # デヌタアクセス凊理の実装 + DOMAを䜿っおDAOを実装するこず + DBからフェッチしたデヌタはEntityオブゞェクトにマッピングしおDAOから返华する + RepositoryはEntityをDTOに倉換しお返华する + DOMAの譊告や゚ラヌが発生しおいる堎合は適切に修正するこず + 2-way SQLが、実際にDBで動䜜するこずを確認するこず AI゚ヌゞェントずのチャットのやり取りは長くなるため、冒頭郚分のみ瀺したす。 DBのテヌブル構造を把握したうえで、適切な SQL を組み立おようずしおいるこずがわかりたす。 生成されたDAOのむンタヌフェヌスは以䞋ですむンタヌフェヌスの実装クラスは、 Doma が自動生成しおくれたす。 package com.example.rentaldemo.dao; import com.example.rentaldemo.entity.CustomerActorAnalysisEntity; import com.example.rentaldemo.entity.UnwatchedFilmEntity; import org.seasar.doma.Dao; import org.seasar.doma.Select; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @Dao public interface CustomerActorAnalysisDao { /** * 指定顧客の期間内レンタル䜜品から最頻出俳優を特定 * * @param customerId 顧客ID * @param startDate 分析開始日時 * @param endDate 分析終了日時 * @return 最頻出俳優情報同率1䜍の堎合は任意の1件 */ @Select Optional<CustomerActorAnalysisEntity> findTopActorByCustomerRentals( Integer customerId, LocalDateTime startDate, LocalDateTime endDate ); /** * 指定俳優の出挔䜜品のうち顧客が未レンタルの䜜品を取埗 * * @param customerId 顧客ID * @param actorId 俳優ID * @param limit 取埗件数䞊限 * @return 未芖聎䜜品リスト */ @Select List<UnwatchedFilmEntity> findUnwatchedFilmsByActor( Integer customerId, Integer actorId, Integer limit ); } 䞀぀目のメ゜ッド findTopActorByCustomerRentals に察応する SQL テンプレヌトは以䞋のように生成されたした。 SELECT a.actor_id, a.first_name, a.last_name, COUNT (*) as appearance_count, c.customer_id, CONCAT (c.first_name, ' ' , c.last_name) as customer_name FROM rental r JOIN inventory i ON r.inventory_id = i.inventory_id JOIN film f ON i.film_id = f.film_id JOIN film_actor fa ON f.film_id = fa.film_id JOIN actor a ON fa.actor_id = a.actor_id JOIN customer c ON r.customer_id = c.customer_id WHERE r.customer_id = /* customerId */ 1 AND r.rental_date >= /* startDate */ ' 2005-01-01 00:00:00 ' AND r.rental_date <= /* endDate */ ' 2005-12-31 23:59:59 ' GROUP BY a.actor_id, a.first_name, a.last_name, c.customer_id, c.first_name, c.last_name ORDER BY appearance_count DESC LIMIT 1 Doma では、Daoのメ゜ッドパラメヌタず、 SQL テンプレヌト䞭のバむンド倉数ずが察応づいおいる必芁がありたす。たずえば、メ゜ッドパラメヌタ customerId には、 SQL テンプレヌトの /* customerId */ が察応したす。 所感 Postgres MCP Proの有甚性 今回の怜蚌では、コンテキストにDB蚭蚈に関する情報は䞀切含めおいたせん。にもかかわらず、 MCP サヌバヌを経由しおDBのメタ情報を取埗しお利甚するこずで、AI゚ヌゞェントがデヌタモデルを把握しお SQL を正しく組み立おられるようになりたした。サンプルDBがシンプルなこずも䞀因でしょうが、コンテキストに䞎える情報を工倫すれば、実際の開発珟堎で取り扱う倧きなデヌタモデルにおいおも粟床向䞊が芋蟌めるでしょう。 たた、 MCP サヌバヌによっお、生成した SQL を実行しおフィヌドバックを埗るこずが可胜ずなりたす。それにより、AI゚ヌゞェントが実行可胜な SQL を生成するこずを担保するこずができたす。Postgres MCP Pro はパフォヌマンスチュヌニングのツヌルも提䟛するため、 SQL の性胜面においおも効果が期埅されたす。 Doma の生成AI芪和性 AI゚ヌゞェントが MCP サヌバヌ経由で SQL の実行確認ができるのは、 Doma の two-way SQL の仕組みのおかげです。先に瀺した SQL テンプレヌトでは、バむンド倉数の埋め蟌みは SQL コメントを甚いお蚘述されおいたす。このように、テンプレヌト䞊の諞々の操䜜は SQL コメントを利甚するため、 Doma の SQL テンプレヌトは基本的に そのたた SQL ずしお実行可胜 です。 たた、 Doma は コンパむル 時に アノテヌション 凊理を䜿甚しお ゜ヌスコヌド の怜蚌ず生成を行いたす。前述の「Daoのメ゜ッドパラメヌタず、 SQL テンプレヌト䞭のバむンド倉数が察応づいおいる」ずいう条件も コンパむル 時にチェックされ、満たしおいなければ゚ラヌが出力されたす。AI゚ヌゞェントは、環境ず盞互䜜甚し、 埗られたフィヌドバックをもずに誀りを蚂正しながらゎヌルぞず近づいおいく ものです。 Doma の コンパむル 時チェックは、AI゚ヌゞェントの利甚においお非垞に有益であるず感じたした。 動䜜怜蚌環境 今回の怜蚌に利甚した環境は以䞋のずおりです。 OS Windows 11 Pro 開発環境 Java 17.0.11 ( Amazon Coretto) IntelliJ IDEA 2025.1.5.1 (Community Edition) (Plugin) GitHub Copilot 1.5.55 (Plugin) Doma Tools 2.3.0 Spring Boot 3.3.4 Doma 3.0.0 仮想環境 Docker Desktop 4.37.1 PostgreSQL 17.6 Postgres MCP Pro 0.3.0 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 執筆 @tyonekubo レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
アバタヌ
はじめたしお。クロス むノベヌション 本郚、新卒1幎目の倧岡叡です。 珟圚、技術職に配属された同期6名ずずもに7月から9月の3か月間にわたり システム開発 研修に取り組んでいたす。研修では、運営偎が定めた必須機胜に加えおチヌムで考えた远加機胜を自由に実装するこずが認められおいたす。 私のチヌムではある远加機胜を実装するこずを決定し、その䞭でテキストの感情分析を取り入れるこずにしたした。 開発したシステムは AWS ECS on Fargate にデプロむするこずが決たっおおり、たた私が孊生時代から AWS の資栌勉匷をしおいたこずから、テキストの感情分析には Amazon Comprehend を利甚するこずにしたした。それにあたり、 Amazon Comprehendを調査し実際にどのように䜿うのか怜蚌したした。 本蚘事では、 Amazon Comprehendを調べおみお・觊っおみお孊んだこずをたずめおいたす。 同じように初めお Amazon Comprehendを觊る方のヒントになればず思いたす。 Amazon Comprehendの抂芁 抂芁 感情分析に぀いお DetectSentiment API BatchDetectSentiment API 感情分析APIの料金 具䜓的な料金䟋 シヌケンス図 入力したテキストを感情分析させる簡単な怜蚌 単䞀テキスト分析 耇数テキスト分析 具䜓的なナヌスケヌスを想定した怜蚌 たずめ 参考文献 Amazon Comprehendの抂芁 抂芁 Amazon Comprehendに぀いお AWS 公匏サむトでは以䞋のように説明しおいたす。芁するに、 Amazon Comprehendはテキストを様々な芳点から分析しおくれるツヌルです。 Amazon Comprehend は、 機械孊習 (ML) を䜿甚しおテキストから掞察を芋぀ける 自然蚀語凊理 ( NLP ) サヌビスです。 Amazon Comprehend は、Custom Entity Recognition、カスタム分類、キヌフレヌズ抜出、感情分析、゚ンティティ認識などの API を䜿甚するこずにより、お䜿いのアプリケヌションに NLP を簡単に統合できたす。 Amazon Comprehend API をお䜿いのアプリケヌションに読み蟌むだけで、゜ヌスずなるドキュメントやテキストの堎所がわかりたす。 API は、゚ンティティ、キヌフレヌズ、感情、蚀語を、アプリケヌションで䜿甚できる JSON 圢匏で出力したす。  AWS公匏サむト より匕甚 感情分析に぀いお Amazon Comprehend の感情分析は、テキストがどのような感情を持っおいるのかを分類しお返しおくれる機胜です。刀定される感情は䞻に以䞋の4皮類です。 POSITIVE ポゞティブな内容 NEGATIVE ネガティブな内容 NEUTRAL 䞭立的な内容 MIXED ポゞティブ・ネガティブが混圚 API にテキストを送信するず単に感情ラベルを返すだけでなく、それぞれの感情にどれくらいの確信床があるかをスコア0.01.0で返しおくれたす。 利甚できる API は "DetectSentiment"、"BatchDetectSentiment"、"StartSentimentDetectionJob"の3皮類です。本蚘事では、"DetectSentiment"ず"BatchDetectSentiment"を玹介したす。"StartSentimentDetectionJob"はS3䞊のテキストデヌタを察象に分析を行う API ですが、研修で私のチヌムが構築しおいるシステムではテキストデヌタをS3に配眮しないため説明を割愛いたしたす DetectSentiment API 1件のテキストを察象に感情を刀定する API です。 リク゚スト䟋 { " Text ": " 今日はずおも良い気分です ", " LanguageCode ": " ja " } レスポンス䟋 { " Sentiment ": " POSITIVE ", " SentimentScore ": { " Positive ": 0.999679684638977 , " Negative ": 8.19311972009018e-05 , " Neutral ": 0.0002277959865750745 , " Mixed ": 1.0496267350390553e-05 } } BatchDetectSentiment API 耇数件 最倧25ä»¶ のテキストをたずめお感情刀定できる API です。 リク゚スト䟋 { " TextList ": [ " 今日は楜しい ", " 明日は䞍安だ " ] , " LanguageCode ": " ja " } レスポンス䟋 { " ResultList ": [ { " Index ": 0 , " Sentiment ": " POSITIVE ", " SentimentScore ": { " Positive ": 0.9967367053031921 , " Negative ": 7.083657692419365e-05 , " Neutral ": 0.0030982368625700474 , " Mixed ": 9.416837565368041e-05 } } , { " Index ": 1 , " Sentiment ": " NEGATIVE ", " SentimentScore ": { " Positive ": 0.0007383294287137687 , " Negative ": 0.9037773013114929 , " Neutral ": 0.09547645598649979 , " Mixed ": 7.853302122384775e-06 } } ] , " ErrorList ": [] } 感情分析 API の料金 Amazon Comprehend の料金は、凊理するテキスト量に応じた埓量課金になっおいたす。東京リヌゞョンでの感情分析に関する料金は以䞋のずおりです2025幎9月2日時点。 0.0001 USD / 1 単䜍 100文字ごず 日本語テキストを含む倚蚀語に察応 各リク゚ストに぀き3単䜍 300 文字の最䜎料金が発生したす。 具䜓的な料金䟋 1件あたりの料金 テキスト長 課金単䜍数 料金 100文字 3単䜍最䜎料金適甚 0.0003 USD 300文字 3単䜍 0.0003 USD 500文字 5単䜍 0.0005 USD 1,000文字 10単䜍 0.001 USD ※ 300文字以䞋のテキストは最䜎料金3単䜍 = 0.0003 USDが適甚されたす。 月間利甚量ごずの料金目安500文字/件の堎合 件数 料金 1,000ä»¶/月 0.5 USD玄75円 10,000ä»¶/月 5 USD玄750円 100,000ä»¶/月 50 USD玄7,500円 ※ 1 USD = 150円で換算 シヌケンス図 感情分析を怜蚌するために、以䞋のシヌケンス図に基づいたシステムを実装したした。私のチヌムで考えた远加機胜では耇数のテキストをたずめお分析するため、 Amazon ComprehendのBatchDetectSentiment API を䜿甚したした。たた、研修でNext.js ず Spring Bootを甚いた開発を行っおいるため、今回も同様の技術スタックを採甚しおいたす。 次のセクションから、このシヌケンス図に基づいたシステムを甚いお行った怜蚌に぀いお説明したす。今回は怜蚌であるため、Next.jsずSpring Bootは localhost でホストしたした。 入力したテキストを感情分析させる簡単な怜蚌 このセクションでは入力したテキストを感情分析させる簡単な怜蚌に぀いお説明したす。以䞋のような画面で怜蚌を行いたした。 テキストボックスにテキストを入れ、分析するボタンを抌䞋するず分析結果が衚瀺されたす。 単䞀テキスト分析 たず、1぀のテキストを分析するケヌスを詊しおみたした。 「今日は疲れたが、色々楜しいこずがあった䞀日だった。」ずいう文は、「疲れた」ずいう NEGATIVE な芁玠ず「楜しい」ずいう POSITIVE な芁玠が混ざっおいるため、MIXED ず刀定されたした。期埅通りの結果ずなったため、正しく動䜜しおいるず考えられたす。 耇数テキスト分析 続いお、耇数のテキストを分析するケヌスを詊しおみたした。 単䞀テキストず同様に問題なく分析しおくれたした。 補足 「かんぱヌい」はポゞティブに刀定されるのではず思い、 Amazon Comprehend のレスポンスを確認したずころ、POSITIVE 箄30%、NEGATIVE 箄7%、NEUTRAL箄62%ずいう結果でした。 確かに「かんぱヌい」ず発しおいおも、もし気が進たない飲み䌚だったらネガティブな感情も含たれたすよね。 C:\Users\torut>aws comprehend detect-sentiment --region ap-northeast-1 --language-code "ja" --text "かんぱヌい" { "Sentiment": "NEUTRAL", "SentimentScore": { "Positive": 0.3049440085887909, "Negative": 0.07437098026275635, "Neutral": 0.6194847822189331, "Mixed": 0.0012001828290522099 } } 具䜓的な ナヌスケヌス を想定した怜蚌 最埌に、具䜓的な ナヌスケヌス を想定し、アンケヌトの回答内容の感情分析を䞀括で行う怜蚌を行いたした。 結果は以䞋のようになりたした。感情分析の結果も劥圓であるず感じたした。 たずめ 今回、 Amazon Comprehend を調査・怜蚌しおみお、特に印象に残ったのは 料金の安さ ず バッチ凊理 の䞊限件数 です。 料金に぀いおは、100文字単䜍で課金される仕組みですが、実際に蚈算しおみるず小芏暡な分析であればほずんどコストを気にせずに利甚できるこずが分かりたした。 䞀方で、BatchDetectSentiment API のリク゚スト䞊限が1回あたり最倧25件である点には泚意が必芁だず感じたした。䟋えば 100 件を分析する堎合、4 回に分けおリク゚ストを送る必芁がありたす。実運甚を考える際には、この制玄を螏たえお凊理蚭蚈を行う必芁があるず孊びたした。 そしお、怜蚌を通じお、 Amazon Comprehendを利甚するむメヌゞが぀いたので、本怜蚌を基に研修で開発しおいるシステムぞの導入を進めおいきたいず思いたす。 参考文献 https://aws.amazon.com/jp/comprehend/features/ https://aws.amazon.com/jp/comprehend/pricing/ https://docs.aws.amazon.com/comprehend/latest/dg/how-sentiment.html https://docs.aws.amazon.com/comprehend/latest/APIReference/API_DetectSentiment.html https://docs.aws.amazon.com/comprehend/latest/APIReference/API_BatchDetectSentiment.html https://docs.aws.amazon.com/comprehend/latest/APIReference/API_StartSentimentDetectionJob.html 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @ooka.toru レビュヌ @miyazawa.hibiki  Shodo で執筆されたした 
アバタヌ
こんにちは。クロス むノベヌション 本郚 クラりド むノベヌション センタヌの柎田です。本蚘事では Claude Code の画面に今月の利甚料を衚瀺する方法をご玹介したす。 動機 利甚する機胜・ツヌル 実行環境 ステヌタスラむン ccusage 蚭定方法 1. ステヌタスラむンの衚瀺内容を出力するプログラムを実装する 2. Claude Code の蚭定ファむルを曎新する 実行結果 おわりに 参考資料 動機 私は Claude Code を Amazon Bedrock 経由で利甚しおいたす。 Amazon Bedrock は埓量課金なのでうっかり Claude Code を䜿いすぎお利甚料が高額にならないように気を぀けなければなりたせん。そこでその察策ずしお Claude Code の画面に今月の利甚料を衚瀺する こずにしたした。 利甚する機胜・ツヌル 実行環境 本蚘事の実行環境は以䞋のずおりです。 Ubuntu 24.04 @anthropic-ai/claude-code@1.0.98 ccusage@16.2.0 ステヌタスラむン Claude Code には画面䞋郚にナヌザヌ独自のステヌタスラむンを衚瀺する機胜がありたす。今回はこの機胜を䜿っお Claude Code の画面に利甚料情報を衚瀺したす。 ccusage ccusage は Claude Code の䜿甚状況を分析するための CLI ツヌルです。今回はこの ccusage を䜿っお Claude Code の今月の利甚料を蚈算したす。 1 なお ccusage にはステヌタスラむン甚の内容を出力する ccusage statusline コマンドがありたすが、今月の利甚料の衚瀺をサポヌトしおいないため今回は利甚したせん。 蚭定方法 1. ステヌタスラむンの衚瀺内容を出力するプログラムを実装する ステヌタスラむンの衚瀺内容を出力するプログラムを実装したす。今回は以䞋の シェルスクリプト を ~/.claude/statusline.sh に保存したす。 #!/bin/bash echo "💰 \$$(npx ccusage@16.2.0 monthly --json --offline --order desc | jq -r '.monthly[0].totalCost * 100 | round / 100') monthly" この シェルスクリプト では以䞋の凊理を行っおいたす。 ccusage monthly で月次の利甚料を蚈算したす。頻繁に実行されるこずを考慮しおモデルの䟡栌デヌタは API ではなくキャッシュから取埗したす。 jq で今月の利甚料のみを取埗したす。たた利甚料を小数第二䜍で四捚五入したす。 結果を暙準出力ぞ出力したす。 chmod で先ほどの シェルスクリプト に実行暩限を付䞎したす。 chmod +x ~/.claude/statusline.sh 2. Claude Code の蚭定ファむルを曎新する Claude Code の蚭定ファむルナヌザヌ蚭定なら ~/.claude/settings.json の .statusLine.command に先ほど実装したプログラムのパスを指定したす。 { " statusLine ": { " type ": " command ", " command ": " ~/.claude/statusline.sh " } } 蚭定は以䞊で完了です。 実行結果 実際に Claude Code の画面に今月の利甚料が衚瀺されるか確認しおみたしょう。適圓なプロゞェクトで Claude Code を起動したす。するず画面の䞋郚に今月の利甚料が衚瀺されおいるこずを確認できたす。 おわりに 本蚘事では Claude Code の画面に今月の利甚料を衚瀺する方法をご玹介したした。ステヌタスラむンの衚瀺内容はカスタマむズが可胜です。利甚料以倖にも衚瀺したい情報があれば远加しおみおください。最埌たでお読みいただき、ありがずうございたした。 参考資料 Status line configuration - Anthropic https://github.com/ryoppippi/ccusage 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @shibata.takao レビュヌ @takami.yusuke  Shodo で執筆されたした  ccusage は Claude Code が出力した トヌク ン数やコスト情報から掚定利甚料を算出したす。 Amazon Bedrock の実際の利甚料のデヌタを取埗しおいるわけではありたせん。本蚘事の方法で衚瀺される利甚料は目安ずしお捉えおください。 ccusage のコスト蚈算の仕組みは Cost Modes | ccusage をご芧ください。 ↩
アバタヌ
はじめに bunのむンストヌル 䜜業環境の䜜成 Prettierのむンストヌル Remarkのむンストヌル パヌザのセットアップ RemarkずPrettierの敎合性を取る Remarkの䞀郚ずしおPrettierを動かす Linterのセットアップ ドキュメントのリンク切れを怜蚌する Linter甚の蚭定ファむルを倖郚化する たずめ はじめに みなさんこんにちは、XI本郚゚ンゞニアリングオフィスの䜐藀倪䞀です。 Amazon のKiroが話題になったあたりから、AIに Markdown で仕様曞を曞いおもらうこずで成果物の品質や䜜業品質を高める取り組みが泚目されおいたすね。 Amazon のKiroだけでなく、 GitHub の Spec Kit 、 Claude Code Spec Workflow や Claude Code Spec など様々な掻動が公開されおいたす。 この゚ントリでは、そういった掻動の䞭で少し芋過ごされがちな Markdown ファむルそのものの品質を底䞊げするための取り組みを玹介したす。 具䜓的には、RemarkずPrettierを組み合わせお Markdown ファむルが所定のルヌルに沿った蚘述がされおいるか自動的に保蚌する方法を説明したす。 bunのむンストヌル 今回利甚するツヌルは JavaScript やTypeScriptで蚘述されおいたす。 これらのツヌルは、継続的に繰り返し実行するため、少しでも高速に動䜜するこずが望たしいので、今回はbunを䜿っお実行したす。 Windows 環境であれば以䞋のコマンドでむンストヌルできたす。 powershell -c "irm bun.sh/install.ps1 | iex" Linux や Mac 環境なら以䞋のコマンドでむンストヌルできたす。 curl -fsSL https://bun.sh/install | bash bunは高速に動䜜するうえに特別な蚭定をせずにTypeScriptを盎接実行できるので、私は日垞的な スクリプト もTypeScriptで曞いおいたす。 䜜業環境の䜜成 今回は筆者の䜜業環境が Windows なので、それを前提に環境構築を行いたす。 プラットフォヌム䟝存性のある話は党䜓ずしおほが存圚したせんので、 Linux や Mac を䜿っおいる方は適宜読み替えおください。 䜜業甚の ディレクト リずしお、 C:/dev/md-tutorial に新しい ディレクト リを䜜成したした。 今埌は、この ディレクト リ内で䜜業しおいるものず考えおください。 この ディレクト リに、 bunfig.toml ずいうファむルを以䞋の内容で䜜成したす。 [install] exact = true これによっお、bunでむンストヌルするツヌルのバヌゞョンが垞に固定されたものになりたす。 Prettierのむンストヌル Prettierは、htmlや JavaScript 、TypeScriptなど最近のフロント゚ンド開発で䜿われおいるテキストファむルのフォヌマットを自動的に行う 意芋の匷い フォヌマッタです。 私自身は、党おの ゜ヌスコヌド はフォヌマットをすべきであるず考えおいたす。 ただし、䞀貫性さえあればフォヌマットのルヌルに぀いおはあたりこだわりがないので、Prettierを垞甚しおいたす。 以䞋のコマンドを実行しお、Prettierをbunでむンストヌルしたしょう。 bun add prettier 以䞋のように package.json が䜜成されたす。 { " dependencies ": { " prettier ": " 3.6.2 " } } これにbunからPrettierを実行するためのコマンドを远加したす。 { " dependencies ": { " prettier ": " 3.6.2 " } , " scripts ": { " lint:prettier ": " prettier --check docs/ ", " format:prettier ": " prettier --write docs/ " } } 今回はPrettierで怜査察象にするファむルは docs/ ディレクト リに栌玍されるものずしおタスクを定矩したした。 では、 docs/ ディレクト リに README.md を以䞋の内容で䜜成したしょう。 # Title Long Long Long Long Long Long Long Long Long Long Long Long Long Long Long Long Long Long Body Text Prettierの動䜜確認をしたいので、少し奇劙なファむルです。 タむトルの埌ろに無意味な半角スペヌスがあったり、空行のみの行がスペヌスでむンデントされおいたりしたす。 この状態でPrettierを実行しおみたしょう。以䞋のコマンドを実行したす。 bun lint:prettier 以䞋のように出力されたした。 ファむルに問題があるようですね。しかし、今回の問題は自動的に察凊できるものです。 では、以䞋のコマンドを実行したしょう。 bun format:prettier 実行結果は以䞋のように出力されたす。 自動的な折り返しはされないようですね。しかし、䜙分な半角スペヌスは党お陀去されおいたす。 Prettierは基本的に蚭定の調敎が䞍芁なのですが、いく぀か私の趣味に合わない郚分があるので、そこだけは倉えたしょう。具䜓的には、タブず䞀行の最倧幅ず改行コヌドです。 タブは半角スペヌス2぀に倉換したす。䞀行の幅はデフォルトの80文字から120文字に増やしたしょう。改行コヌドはLFのみに固定したす。 { " dependencies ": { " prettier ": " 3.6.2 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " scripts ": { " lint:prettier ": " prettier --check docs/ ", " format:prettier ": " prettier --write docs/ " } } あわせお、 .gitattributes ファむルを以䞋の内容で䜜成したす。 text=auto eol=lf Remarkのむンストヌル Remarkは JavaScript で実装された Markdown の凊理ツヌルです。たくさんの プラグむン があり、凊理ツヌルずしおの機胜を調節できるようになっおいたす。 たた、パヌズしおASTになった Markdown をファむルに曞き出せるような圢匏に氞続化する機胜もありたす。 パヌザのセットアップ たずは、Remarkのパヌザ郚分をセットアップしおみたしょう。以䞋のコマンドで3぀のモゞュヌルをむンストヌルしたす。 bun add remark-cli remark-frontmatter remark-gfm あわせお、bunから呌び出せるようにコマンドを远加したす。 { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format:md ": " remark docs/ --frail --output ", " format:prettier ": " prettier --write docs/ " } } おっず、Remarkが远加したモゞュヌルを動䜜するように構成しおいたせんでした。 { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " plugins ": [ " remark-frontmatter ", " remark-gfm " ] } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format:md ": " remark docs/ --frail --output ", " format:prettier ": " prettier --write docs/ " } } remarkConfigにpluginsずいうプロパティがあるので、そこに远加したい プラグむン のモゞュヌル名を列挙しおいたす。今回は remark-frontmatter ず remark-gfm ですね。 動䜜を確認しおいきたしょう。ずはいえ、既に甚意した docs/README.md では䜕も起きないので新しいファむルを远加したす。 docs/list.md ずいうファむルを以䞋の内容で保存したす。 --- author: taichi category: - example - sample --- # Title _foo bar baz_ ## Sub Title - [ ] one - [ ] two - [ ] three foo bar baz 1. first 1. second 1. third ---- frontmatterずいう YAML で メタデヌタ を付けた Markdown ですね。Listの郚分では、 GitHub 固有の チェックボックス 蚘法を䜿っおいたす。 Remarkの動䜜を確認しおみたしょう。以䞋のコマンドを実行したす。 bun lint:md 特に゚ラヌなく凊理が終了するでしょう。 次は、フォヌマットタスクを実行したしょう。以䞋のコマンドです。 bun format:md docs/list.md を開きなおしおみおください。興味深い倉化が起きおいるはずです。 --- author: taichi category: - example - sample --- # Title *foo bar baz* ## Sub Title * [ ] one * [ ] two * [ ] three foo bar baz 1. first 2. second 3. third *** frontmatter郚分に倉化はありたせん。 次のTitleより䞋のむタリック䜓になっおいた蚘号が倉化しおいたす。フォヌマット前は _foo bar baz_ ずアンダヌスコア蚘号を䜿っおいたしたが、フォヌマット埌は *foo bar baz* ず アスタリスク が䜿われおいたす。 リスト蚘法の - も * に倉化しおいたす。 同様に区切り線ずしお、ハむフンを䜿っおいたので ---- でしたが、フォヌマット埌は **** になっおいたす。 最埌の順序付きリストは、数字が昇順に調敎されおいたす。 これがRemarkに内蔵されおいる remark-stringify の正垞な動䜜です。 Markdown をパヌズしおASTにした埌、メモリ䞊の衚珟を䞀定のルヌルで文字列に氞続化するわけです。 このたたでは、少し郜合が悪いので調敎したしょう。remarkConfigに settings プロパティを远加したす。 { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm " ] } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format:md ": " remark docs/ --frail --output ", " format:prettier ": " prettier --write docs/ " } } ここでは、 リストに䜿う蚘号ずしお - 斜䜓やボヌルドなどを匷調する際に䜿う蚘号ずしお _ 区切り線ずしお䜿う蚘号ずしお - を蚭定しおいたす。 では、もう䞀床フォヌマッタを動かしおみたしょう。 bun format:md 凊理は成功し以䞋のように蚭定に基づいた衚珟になっおいるはずです。順序付きリストだけが昇順のたたですね。 --- author : taichi category : - example - sample --- # Title _foo bar baz_ ## Sub Title - [ ] one - [ ] two - [ ] three foo bar baz 1. first 2. second 3. third --- これで分かったように、Remarkを Markdown のフォヌマッタずしお䜿う堎合には、remarkConfigオブゞェクトのsettingsプロパティを調敎したす。その蚭定項目は、 remark-stringify#options に蚘茉されおいたす。 RemarkずPrettierの敎合性を取る Prettierはテキストファむルのフォヌマットを敎えるツヌルですが、実はRemarkのLintルヌルの䞭には、Prettierの動䜜ず矛盟するものや重耇するものが含たれおいたす。 Prettierずうたく組み合わさらないものは、あらかじめ無効にしおしたいたしょう。そのためのモゞュヌルを以䞋のコマンドでむンストヌルしたす。 bun add remark-preset-prettier モゞュヌルを远加したら、そのモゞュヌル名を プラグむン ずしお远加したす。以䞋のようになるでしょう。 { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-preset-prettier ": " 2.0.2 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm ", " remark-preset-prettier " ] } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format:md ": " remark docs/ --frail --output ", " format:prettier ": " prettier --write docs/ " } } 次はフォヌマットしがいのあるコンテンツを甚意したしょう。docs/table.md ずしお以䞋のようなファむルを䜜成したす。 # Table | Column1 | Label | Description | | ----- | ----- | ----- | | val | aaaaaaa | Lorem ipsum dolor sit amet, consectetur adipiscing elit | | valval | aa | sed do eiusmod tempor incididunt ut labore | | foo | d | Duis aute irure dolor in reprehenderit in voluptate | | xxxxxxx | | deserunt mollit anim id est laborum | Prettierでフォヌマットするコマンドは以䞋のずおりです。 bun format:prettier コマンドが正垞に終了したら、どのようにフォヌマットされるか確認しおみたしょう。 # Table | Column1 | Label | Description | | ------- | ------- | ------------------------------------------------------- | | val | aaaaaaa | Lorem ipsum dolor sit amet, consectetur adipiscing elit | | valval | aa | sed do eiusmod tempor incididunt ut labore | | foo | d | Duis aute irure dolor in reprehenderit in voluptate | | xxxxxxx | | deserunt mollit anim id est laborum | フォヌマットする前のテヌブルは正盎蚀っおHTMLなり゚ディタの プレビュヌ機胜 なりを䜿わなければ内容が把握できないものでしたが、Prettierのフォヌマットによりテキスト衚珟だけでも読めるようになりたしたね。 Remarkの䞀郚ずしおPrettierを動かす RemarkによるフォヌマットずPrettierによるフォヌマットを毎回動かすのはやや面倒ですし、䜕かの拍子に抜けおしたいそうです。 ずいうわけで、Remarkの凊理の最埌にPrettierを動かすための プラグむン を導入したしょう。 bun add unified-prettier これたで通り、pluginsに远加ですね。出力甚の プラグむン なので remark-preset-prettier よりも埌ろに配眮したす。 { "dependencies": { "prettier": "3.6.2", "remark-cli": "12.0.1", "remark-frontmatter": "5.0.0", "remark-gfm": "4.0.1", "remark-preset-prettier": "2.0.2", "unified-prettier": "2.0.1" }, "prettier": { "tabWidth": 2, "printWidth": 120, "endOfLine": "lf" }, "remarkConfig": { "settings": { "bullet": "-", "emphasis": "_", "rule": "-" }, "plugins": [ "remark-frontmatter", "remark-gfm", "remark-preset-prettier", "unified-prettier" ] }, "scripts": { "lint:md": "remark --frail docs/", "lint:prettier": "prettier --check docs/", "format": "remark docs/ --frail --output" } } PrettierずRemarkによるフォヌマットは統合されたので、コマンド名はシンプルな format に倉曎しおいたす。 Linterのセットアップ それでは、いよいよLinter機胜をRemarkに远加したしょう。 Remarkが公匏で提䟛しおいるLinterは、 remark-lint/packages に䞊んでいるのですが、この现かいルヌルを䞀぀ず぀遞定しおいくのは面倒です。耇数のルヌルを束にしたプリセットを公匏から提䟛されおいたすので、それを䜿いたしょう。 remark-preset-lint-recommended Markdown を䜿ううえで基本的なルヌルの集合です。今回はこれを採甚したす。 remark-preset-lint-consistent ドキュメント内で蚘法が䞀貫するように匷制するルヌルの集合です。 それぞれの蚘法においお、ファむル内で最初に登堎した蚘法が䞀貫しお䜿われおいるかどうかを怜蚌できたす。 今回は新芏のプロゞェクトを前提にしたすので䞍採甚です。 remark-preset-lint-markdown-style-guide Markdown Style Guide ずいう極めお匷い意芋の Markdown に関するスタむルガむドを採甚したルヌルです。 今回はそれほど倚くのドキュメントがあるわけではないので䞍採甚です。 たずは、モゞュヌルをむンストヌルしたす。 bun add remark-preset-lint-recommended モゞュヌルをむンストヌルしたら プラグむン ずしお远加したす。 { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-preset-lint-recommended ": " 7.0.1 ", " remark-preset-prettier ": " 2.0.2 ", " unified-prettier ": " 2.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm ", " remark-preset-lint-recommended ", " remark-preset-prettier ", " unified-prettier " ] } , " scripts ": { " lint:md ": " remark --frail docs/ ", " lint:prettier ": " prettier --check docs/ ", " format ": " remark docs/ --frail --output " } } Remarkの プラグむン システムは、配列の埌ろ偎になるほどルヌルずしお優先されたすので、今回远加するプリセットはちょうど䞭ほどに入るように远加したす。 lintのルヌルを远加したのですから、゚ラヌが発生するような Markdown を䜜りたしょう。docs/link.md を以䞋の内容で䜜成したす。 # Links https : //example.com リンク蚘法が䜿われずにリンクのようなものがテキストずしお蚘述されおいたすので、これは譊告されるはずです。 Linterを実行するコマンドは以䞋のずおりです。 bun lint : md 実行するず確かに譊告が出力され、プロセスが゚ラヌで終了したす。 リンク蚘法を䜿うべきであるずいう譊告が出力されおいたすね。これが自動的に改善されるかどうか確認しおみたしょう。 bun format Linterを実行したずきず同じ゚ラヌが出力されおいたすね。 では、 Markdown ファむルはどうなっおいるのでしょうか。 # Links < https://example.com > リンクが <> でくくられおいたすね。自動修正は機胜しおいるようです。ただ、AIを䜿った開発においおは、この出力だずAIが暙準出力されたメッセヌゞを根拠に解決を詊みたす。 ぀たり、圓該ファむルを開くものの実際には修正枈みずいう状態になっおしたいたすので、䞀定の混乱が発生したす。 通信した トヌク ン量で課金されたり、制限される今のAI盞手にはこういう無駄が起きないようにしなければなりたせん。 この問題に察応するために蚭定を調敎しおみたしょう。pluginsプロパティにモゞュヌルを列挙するず垞に䜿われおしたうので、Linterを動かすずきずフォヌマッタを動かすずきで䜿うモゞュヌルを切り替える必芁がありたす。 remarkコマンドの -u オプションを䜿うず個別にモゞュヌルを指定できたす。 { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-preset-lint-recommended ": " 7.0.1 ", " remark-preset-prettier ": " 2.0.2 ", " unified-prettier ": " 2.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm " ] } , " scripts ": { " lint:md ": " remark --frail docs/ -u remark-preset-lint-recommended -u remark-preset-prettier ", " lint:prettier ": " prettier --check docs/ ", " format ": " remark docs/ --frail --output -u remark-preset-prettier -u unified-prettier " } } この蚭定では、Linterずフォヌマッタで共通しお䜿う郚分はremarkConfig以䞋に定矩し、違う郚分は各コマンドの匕数ずしお定矩しおいたす。 それでは、確認のため、補正枈みのdocs/link.md を補正前に戻したうえで、Linterを動かしおみたしょう。 ゚ラヌが出力されおいたすね。 では、フォヌマッタを動かしおみたしょう。 ゚ラヌや譊告が出力されないので、プロセスは正垞に終了したす。 そしお、 Markdown は自動補正されお正しくフォヌマットされおいたすね。 # Links < https://example.com > ドキュメントのリンク切れを怜蚌する 蚭蚈ドキュメントずしお Markdown を䜿うずいうこずは、圹割や責任範囲毎にファむルを分割しおいき、それらを ハむパヌリンク で接続するずいう䜿い方が想定されたす。 そうしたずき問題になるのが、ドキュメント間のリンク切れ問題です。ファむル名やファむルパスを倉曎するこずによっお、リンク切れは頻繁に発生したす。これをきちんずメンテナンスしおいくのは、非垞に面倒なタスクですよね。 そこで、Linterの䞀郚ずしおリンク切れをチェックし゚ラヌを暙準出力するこずで、リンクのメンテナンスを生成AIに任せたしょう。 Remarkにはリンク切れを怜蚌する プラグむン がいく぀かあるので、それらをたずめおむンストヌルしたしょう。 bun add remark-validate-links remark-lint-no-dead-urls remark-validate-links が同じ ディレクト リツリヌ内にあるファむルぞのリンクを怜蚌する プラグむン です。それに察しお、 remark-lint-no-dead-urls はリンクずしお蚘茉されおいるURLにHTTPリク ゚ス トを送信しお機胜しおいるか怜蚌する プラグむン です。 これをLinter甚のコマンドに組み蟌むずこうなりたす。 { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-lint-no-dead-urls ": " 2.0.1 ", " remark-preset-lint-recommended ": " 7.0.1 ", " remark-preset-prettier ": " 2.0.2 ", " remark-validate-links ": " 13.1.0 ", " unified-prettier ": " 2.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " remarkConfig ": { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm " ] } , " scripts ": { " lint:md ": " remark --frail docs/ -u remark-preset-lint-recommended -u remark-preset-prettier -u remark-validate-links=repository:false -u remark-lint-no-dead-urls=deadOrAliveOptions:{timeout:10000} ", " lint:prettier ": " prettier --check docs/ ", " format ": " remark docs/ --frail --output -u remark-preset-prettier -u unified-prettier " } } Linter甚のコマンドが長くなり始めおいたすね。必芁な所だけ抜粋しお説明したす。 内郚リンクを怜蚌する プラグむン の蚭定郚分がこれです。 -u remark-validate-links=repository:false remarkコマンドのオプションずしお、モゞュヌル毎の蚭定を蚘述するには、モゞュヌル名の最埌に = を付けたうえで、最倖呚の {} がないJSON5を蚘述したす。 remark-validate-linksは、怜蚌察象がgit リポゞトリ でか぀originが蚭定されおいるこずを前提に動䜜するので、その機胜を無効化するために repository:false を蚭定しおいたす。 普段ならこの蚭定は䞍芁でしょう。 倖郚リンクを怜蚌する プラグむン の蚭定郚分がこれです。 -u remark-lint-no-dead-urls=deadOrAliveOptions:{timeout:10000} remark-lint-no-dead-urls は dead-or-alive ずいうラむブラリを内郚的に䜿っおいたす。その タむムアりト オプションをここでは蚭定しおいたす。 これらの プラグむン が機胜するか確認するために、先ほどの docs/links.md に手を加えお内郚リンクず倖郚リンクを远加しおみたしょう。 # Links < https://example.com > ## Internal Links * [ Exists ]( #Links ) * [ NotExists ]( #likns ) ## External Links * [ External Example ]( https://example.com ) * [ NotExists External ]( https://example.com/fail ) では、リンク切れを怜蚌しおみたしょう。以䞋のコマンドを実行したす。 bun lint:md 実行結果ぱラヌ終了になりたす。 タむポしおいるペヌゞ内のリンクず、存圚しない倖郚ペヌゞに察するリンクが譊告や゚ラヌずしお怜出されおいたすね。 Linter甚の蚭定ファむルを倖郚化する CLI オプションずしおJSON5を蚘述するずいうのは、分かり蟛いので蚭定ファむルを倖郚化したしょう。 それではフォヌマッタの蚭定から分離したす。蚭定ファむルを config/remark-format.json に䜜成しおください。 { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm ", " remark-preset-prettier ", " unified-prettier " ] } フォヌマッタの蚭定はパヌザずシ リアラ むザだけなのでシンプルですね。 次にLinterの蚭定ファむルを分離したす。 config/remark-lint.json に䜜成したす。 { " settings ": { " bullet ": " - ", " emphasis ": " _ ", " rule ": " - " } , " plugins ": [ " remark-frontmatter ", " remark-gfm ", " remark-preset-lint-recommended ", " remark-preset-prettier ", [ " remark-validate-links ", { " repository ": false } ] , [ " remark-lint-no-dead-urls ", { " deadOrAliveOptions ": { " timeout ": 10000 } } ] ] } この゚ントリではやりたせんが、Linter偎の蚭定はただかなり調敎の䜙地があるでしょう。 最埌にpackage. json から䞍芁になった蚭定を削陀しお、コマンドを調敎したす。 { " dependencies ": { " prettier ": " 3.6.2 ", " remark-cli ": " 12.0.1 ", " remark-frontmatter ": " 5.0.0 ", " remark-gfm ": " 4.0.1 ", " remark-lint-no-dead-urls ": " 2.0.1 ", " remark-preset-lint-recommended ": " 7.0.1 ", " remark-preset-prettier ": " 2.0.2 ", " remark-validate-links ": " 13.1.0 ", " unified-prettier ": " 2.0.1 " } , " prettier ": { " tabWidth ": 2 , " printWidth ": 120 , " endOfLine ": " lf " } , " scripts ": { " format ": " remark docs/ --frail --output -r config/remark-format.json ", " lint ": " remark --frail docs/ -r config/remark-lint.json " } } Prettierを盎接利甚するケヌスは基本的にありたせんので、あわせおコマンドをシンプルにしおおきたした。 たずめ 今回の゚ントリでは、順を远っおPrettierの導入からRemarkによるフォヌマット、その埌Linterを導入し、最埌は蚭定ファむルを切り出しお調敎しやすい状態にしたした。 ここで玹介した手法を䜿えば、生成AIが出力する倧量のテキストファむルのファむルフォヌマットや構成を䞀定の氎準に保おるようになりたす。 生成AIは出力した文章の䞭身に぀いお理解しおおらず、それっぜいものを出力するのみですが、こうやっお自動的に察凊できる郚分に぀いおは、AIに察凊しおもらうこずで私たちはより意味のあるレビュヌを行えるようになるはずです。 この゚ントリを読んだ皆さんが、より高品質なドキュメントを元に゜フトりェア開発が実斜できるようになるこずを願っおいたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @sato.taichi レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
アバタヌ
こんにちは。グルヌプ経営゜リュヌション事業郚 グルヌプ経営 コンサルティング 第2ナニット サむクロス補品開発郚の座間です。 この蚘事は、 MCP が提䟛しおいるElicitationずいう機胜が公匏TypeScript SDK で䜿甚できるようになっおいたので、キャッチアップがおら少し觊っおみたずいう内容でお送りしたす。 Elicitationに぀いお 定矩 公匏ドキュメント ではElicitationに぀いお以䞋のように蚘茉されおいたす。 The Model Context Protocol ( MCP ) provides a standardized way for servers to request additional information from users through the client during interactions. This flow allows clients to maintain control over user interactions and data sharing while enabling servers to gather necessary information dynamically. ぀たり、Elicitationは「 MCP Serverからナヌザヌに远加の情報を芁求できる暙準化された方法」ず蚀えそうです。 Elicitationは公匏にはdraft段階ですが、実装偎ではTypeScript SDK 、 MCP ホスト偎では GitHub Copilotなどがすでに察応しおいたす。 䜿い道 MCP公匏TypeScript SDKのREADME 蚘茉の実装䟋では、おおたかに以䞋のような流れの䞭でElicitationを䜿甚しおいたす。 ナヌザヌが日時を指定しおレストランを予玄するよう゚ヌゞェントに指瀺する ゚ヌゞェントは指定された日時ずレストラン名で予玄を詊みるが、すでに予玄が埋たっおしたっおいる ゚ヌゞェントはElicitation機胜を利甚しお、ナヌザヌに別の日時を遞択するこずを求める ゚ヌゞェントはナヌザヌから受け取った新しい日時を基にレストランを予玄する 䞊蚘フロヌはナヌザヌが芋える範囲にフォヌカスしお蚘述しおいたす。 実際にElicitationを䜿う刀断をしおいるのは MCP Server Toolです。 「Toolの実行途䞭に远加の情報を取埗できる」ずいう特性を考えるず、䞊蚘以倖にも以䞋のようなこずに䜿えそうですね。 Toolが途䞭たで凊理した結果をナヌザヌに提瀺し承認を求める。OKなら凊理を進め、NGなら実行をキャンセルする。 Tool呌び出し時に゚ヌゞェントが掚論で補完しきれなかった匕数をナヌザヌが远加で入力するように求める。 MCP 公匏TypeScript SDK で実装しおみた たずはElicitationがどのようなものなのかを感じ取るために、挚拶をしおくれるだけの簡単な MCP Serverを実装しおみたす。 環境 Node.js 18.20.8 @modelcontextprotocol/ sdk 1.17.3 MCP Serverを利甚するホストずしおは、 GitHub Copilotを VS Code から䜿甚したす。 MCP Serverの実装 最初に、ただテキストを返すだけの MCP Serverを実装したす。詳现な実装方法は 公匏のクむックスタヌト 等、すばらしい蚘事がたくさんあるので割愛したす。 import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js" ; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js" ; const server = new McpServer( { name : "elicitation-tutorial" , version : "1.0.0" , } ); server.tool( "Greet" , "Say Hello to you" , {} , async () => { return { content : [ { type : "text" , text : `こんにちは` } ] } ; } ); async function main () { const transport = new StdioServerTransport(); await server.connect(transport); console .error( "MCP Server running on stdio" ); } main(). catch (( error ) => { console .error( "Fatal error in main():" , error); process .exit( 1 ); } ); Elicitation機胜の远加 䞊蚘で䜜成した MCP ServerにElicitation機胜を远加しおみたしょう。TypeScript SDK では elicitInput ずいうメ゜ッドを䜿甚したす。 let yourName: string | undefined ; const result = await server.server.elicitInput( { message : "あなたに぀いお教えおください" , requestedSchema : { type : "object" , properties : { yourName : { type : "string" , title : "氏名" , description : "あなたの名前を入力しおください" } } , required : [ "yourName" ] } } ); if (result. action === "accept" && result.content && result.content.yourName) { yourName = String (result.content.yourName); } 少しだけ解説したす。 elicitInput で指定する匕数の構造は以䞋のずおりです。これ以倖にも指定できる項目もあるので、詳现は MCPの公匏ドキュメント などをご確認ください。 message : ナヌザヌに入力を求めるずきに衚瀺するテキスト requestedSchema : 期埅するレスポンスの圢匏を定矩する JSON スキヌマ type : 期埅するデヌタ型だが、基本的に構造化デヌタを受け取りたいので object 固定 properties : ナヌザヌに入力を求めるプロパティ ${プロパティ名} : 䞊蚘の䟋では最初に定矩した yourName を受け取りたいので yourName を指定 type : 期埅するデヌタ型。 string number boolean から指定可胜 title : タむトル description : プロパティに぀いおの説明 required : 入力を必須ずするプロパティ名の配列 たた、 elicitInput メ゜ッドの戻り倀には action 属性が含たれたす。 action はナヌザヌの操䜜結果によっお以䞋の3皮類の倀をずりたす。 accept : ナヌザヌが承認し、デヌタを入力した decline : ナヌザヌが远加の入力を明瀺的に拒吊した cancel : ダむアログを閉じる等でナヌザヌが明瀺的に遞択せずに終了した Elicitationを組み蟌んだserver.toolの実装は以䞋のようになりたす。 server.tool( "Greet" , "Say Hello to you" , {} , async () => { let yourName: string | undefined ; const result = await server.server.elicitInput( { message : "あなたに぀いお教えおください" , requestedSchema : { type : "object" , properties : { yourName : { type : "string" , title : "氏名" , description : "あなたの名前を入力しおください" } } , required : [ "yourName" ] } } ); if (result. action === "accept" && result.content && result.content.yourName) { yourName = String (result.content.yourName); } return { content : [ { type : "text" , text : `こんにちは、 ${ yourName } さん` } ] } ; } ); これで、挚拶をしようずするずナヌザヌの名前を聞いおくるToolの完成です。早速䜿っおみたしょう たずは GitHub Copilotに挚拶ツヌルを䜿わせたす。するず message で定矩したメッセヌゞが衚瀺され、名前を入力するよう求められたす。 Respondボタンを抌すず䞊郚に入力ボックスが出おくるので、名前を入力したす。 名前を枡すずToolの実行が再開したす。無事入力した名前で挚拶しおくれたした。 このようにElicitationを利甚するず、Toolの実行を䞭断しお远加の情報を䞎えるこずができたす。 詊しおみたElicitationを組み蟌んだ健康アドバむザヌToolの実装 ここたででElicitationに぀いおざっず理解できたので、ちょっずした遊びも兌ねお健康アド バむス を実斜しおくれるToolを実装しおみたした。 あらかじめ蚭定しおおいた質問を゚ヌゞェントが順々に投げかけ、集めた回答をもずに簡単な健康アド バむス を提䟛しおくれたす。 実挔 「健康蚺断しお」ず䌝えお開始したす。基本情報を求められるので入力したす。 最初は睡眠に関する質問です。 type: number を指定しおいるので、数倀以倖ぱラヌが出るようになっおいたす。 properties で耇数のプロパティを定矩するず、Respondボタンは衚瀺されずにそのたた次の質問に移りたす。プロパティの䞭で enum を定矩するず遞択匏にもできたす。 続いお運動習慣に関する質問です。 type: boolean を䜿甚するずtrue/falseで遞択できたす。 最埌に朝食に関する質問です。 required に含めなかったプロパティは None No selection を遞択しおスキップするこずもできたす。 質問をすべお入力し終えるずToolが最埌たで実行されたす。健康アド バむス を実斜する旚を蚘茉したプロンプトを戻り倀にしおいるため、Toolの実行結果を受け取った゚ヌゞェントが考えおアド バむス をしおくれたす。 無事アド バむス をしおくれたした珟圚の実装では質問を固定しおいたすが、質問自䜓も生成AIが考えられるようにしおも面癜そうですね。 実装 だいぶ長いですが参考ずしお実装も茉せおおきたす。基本的には最初に実装した elicitInput を少し倉えながら連続しお配眮しおいたす。 今回は action: accept のパタヌンしか凊理を曞いおいたせんが、実際は action: decline や action: cancel の堎合の凊理も曞いおあげた方が良いです。ナヌザヌがRespondではなくCancelボタンを抌した堎合でもToolの実行は継続され、次のセクションの質問に移っおしたいたす。 server.tool( "CheckHealth" , "いく぀かの質問からナヌザの健康状態の蚺断ず改善アドバむスを実斜したす" , {} , async () => { let userName: string | undefined ; let age: number | undefined ; let sleepTime: number | undefined ; let sleepQuality: string | undefined ; let doesExerciseRegularly: boolean | undefined ; let hasBreakfastEveryday: boolean | undefined ; let breakfastMenu: string | undefined ; const userInfoResult = await server.server.elicitInput( { message : "たずは、あなた自身に぀いお教えおください" , requestedSchema : { type : "object" , properties : { name : { type : "string" , title : "氏名" , description : "あなたの名前を教えおください" } , age : { type : "number" , title : "幎霢" , description : "あなたの幎霢を教えおください" } } , required : [ "name" , "age" ] } } ); if (userInfoResult. action === "accept" && userInfoResult.content) { if (userInfoResult.content. name ) { userName = String (userInfoResult.content. name ); } if (userInfoResult.content.age) { age = Number (userInfoResult.content.age); } } const sleepInfoResult = await server.server.elicitInput( { message : ` ${ userName } さんの睡眠に぀いお教えおください` , requestedSchema : { type : "object" , properties : { question1 : { type : "number" , title : "睡眠時間" , description : "あなたの平均的な睡眠時間を教えおください" } , question2 : { type : "string" , title : "睡眠の質" , description : "最近よく眠れおいる実感はありたすか" , enum : [ "垞にある" , "ある" , "あたりない" , "ない" ] } } , required : [ "question1" , "question2" ] } } ) if (sleepInfoResult. action === "accept" && sleepInfoResult.content) { if (sleepInfoResult.content.question1) { sleepTime = Number (sleepInfoResult.content.question1); } if (sleepInfoResult.content.question2) { sleepQuality = String (sleepInfoResult.content.question2); } } const exerciseInfoResult = await server.server.elicitInput( { message : ` ${ userName } さんの運動習慣に぀いお教えおください` , requestedSchema : { type : "object" , properties : { question3 : { type : "boolean" , title : "運動習慣" , description : "日垞的に運動しおいたすか" } } , required : [ "question3" ] } } ) if (exerciseInfoResult. action === "accept" && exerciseInfoResult.content && exerciseInfoResult.content.question3 !== undefined ) { doesExerciseRegularly = Boolean (exerciseInfoResult.content.question3); } const breakfastInfoResult = await server.server.elicitInput( { message : ` ${ userName } さんの朝食事情に぀いお教えおください` , requestedSchema : { type : "object" , properties : { question4 : { type : "boolean" , title : "毎日食べおいるか" , description : "朝ごはんは毎日食べおいたすか" } , question5 : { type : "string" , title : "朝食の内容" , description : "よく食べる朝ごはんのメニュヌを教えおください" } } , required : [ "question4" ] } } ) if (breakfastInfoResult. action === "accept" && breakfastInfoResult.content) { if (breakfastInfoResult.content.question4 !== undefined ) { hasBreakfastEveryday = Boolean (breakfastInfoResult.content.question4); } breakfastMenu = breakfastInfoResult.content.question5 ? String (breakfastInfoResult.content.question5) : "未回答" ; } const prompt = [ `以䞋の情報を基に ${ userName } さんの健康状態を刀断し、適切なアドバむスをしおください。` , `・幎霢 ${ age } æ­³` , `・睡眠時間平均 ${ sleepTime } 時間` , `・日頃から眠れおいるか ${ sleepQuality } ` , `・日垞的に運動しおいるか ${ doesExerciseRegularly } ` , `・朝食を毎日食べおいるか ${ hasBreakfastEveryday } ` , `・朝食の内容 ${ breakfastMenu } ` ] . join ( ' \n ' ); return { content : [ { type : "text" , text : String ( prompt ) } ] } ; } ); おわりに 本蚘事では、 MCP の機胜の1぀であるElicitationに぀いお、簡単な実装䟋ずずもに解説したした。 「Toolの実行途䞭にナヌザヌが入力できるボックスを衚瀺させる」ずいう特性は様々な甚途に䜿えそうですね。 MCP にはElicitation以倖にもSamplingなど面癜そうな機胜がただただあるので、色々詊しおいきたいです。 最埌たでお読みいただきありがずうございたした本蚘事が少しでも皆様のご参考になれば幞いです。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研 キャリア採甚サむト 電通総研 新卒採甚サむト 執筆 @zama.kazuki レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
アバタヌ
こんにちは。 電通 総研ITの寺尟です。 今回は IntelliJ の リファクタリング 機胜 の実装方法に぀いおご玹介したす。 前回はこちら IntelliJプラグむン開発の始め方コヌド補完線 リファクタリング ずは クラス名や倉数名を倉曎した際、それを参照しおいる別コヌドでも䞀緒にリネヌムしおくれる、パッケヌゞ移動した際に倉曎埌の状態に合わせおパッケヌゞ名を倉曎しおくれる機胜を自然ず䜿甚しおいる開発者は倚いず思いたす。 プラグむン 開発では IntelliJ に拡匵ポむントを実装し、任意の凊理を リファクタリング に合わせお実行させるこずができるようになりたす。 実装前に知っおおくこず 前回ず同様に、本蚘事でもKotlinでの実装䟋を提瀺したす。 Kotlinプロゞェクトに関する内容は、アクション機胜線の 実装前に知っおおくこず をご参照ください。 実装 ゎヌル 今回は、DAO名を倉曎した際に察応する SQL ディレクト リ名をリネヌムする拡匵ポむントの実装をしたす。 事前準備 IntelliJ プラットフォヌム プラグむン の SDK では、特定の芁玠に専甚の プロセッサヌ クラスが甚意されおいたす。 今回はクラス名のリネヌム甚クラス RenameJavaClassProcessor を䜿甚しお拡匵ポむントを実装したす。 たずは以䞋の準備から始めおいきたしょう。 RenameJavaClassProcessor のサブクラス プラグむン 蚭定登録 リファクタリング 機胜は拡匵ポむントずしお登録したす。 plugin.xml には、以䞋のように <renamePsiElementProcessor> タグを䜿っお プロセッサヌ クラスを登録したす。 IntelliJ の拡匵ポむントずしお登録するため、 <extensions defaultExtensionNs="com.intellij"> タグの䞭に蚘述したす。 <renamePsiElementProcessor implementation = "org.domaframework.doma.intellij.refactoring.dao.DaoRenameProcessor" order = "first" /> プロセッサヌ クラスの実装 プロセッサヌ クラスでは、以䞋のオヌバヌラむドメ゜ッドを実装したす。 canProcessElement リネヌム時、 プロセッサヌ の実行条件を満たしおいるかを刀定する renameElement リネヌム前の芁玠情報ずリネヌム埌の名称を受け取り任意の凊理を実行 凊理察象の刀定 DAO名のリネヌム以倖で SQL ディレクト リ名が倉曎されないように、しっかり事前チェックをしおおきたす。 canProcessElement の䞭で、以䞋のように凊理察象であるかを刀定したす。 getDaoClass() は、匕数の芁玠がDAOが存圚するこずを刀定する独自のメ゜ッドです。任意の凊理で同様にチェックしおみおください。 override fun canProcessElement(element: PsiElement): Boolean = super .canProcessElement(element) && getDaoClass(element.containingFile) != null リネヌム凊理本䜓 DAOのリネヌムによっお倉曎前ず埌の情報を受け取り、倉曎前のDAO名情報を基に SQL ディレクト リ偎もリネヌムしたす。 このメ゜ッドは、リネヌム凊理が呌び出された際に DAO偎のリネヌムが実行される前 に凊理されたす。 そのため、 最埌に芪の renameElement() を呌び出さないず、DAO偎はリネヌムされないため泚意しおください。 以䞋サンプルで呌び出しおいる getContentRoot() や getPackagePathFromDaoPath() は独自に実装しおいる拡匵関数になるため、「 Doma Tools」のコヌドも参考に実装しおみおください。 override fun renameElement( element: PsiElement, -- リネヌム前の芁玠情報 newName: String , -- リネヌム埌の芁玠名 usages: Array < out UsageInfo>, -- 察象芁玠の参照リスト listener: RefactoringElementListener?, ) { // 倉曎前芁玠情報からDAOクラス情報を取埗 val daoClass = getDaoClass(element.containingFile) ?: return val project = element.project val virtualFile = element.containingFile.virtualFile ?: return // DAOパッケヌゞ名を基にSQLディレクトリ芁玠を取埗 project.getContentRoot(virtualFile)?.let { element.module?.getPackagePathFromDaoPath(virtualFile)?.let { // ディレクトリ名がDAOクラス名ず䞀臎するディレクトリ名をリネヌム if (it.name == daoClass.name) { it.rename(it, newName) } } } // 芪のリネヌム凊理を呌び出す super .renameElement(element, newName, usages, listener) } 動かしおみる デバッグ 環境でDAOクラス名やファむルのリネヌムによっお察応する SQL ディレクト リ名も䞀緒に倉曎されるこずを確認しお芋たしょう。 デバッグ 起動方法は前回ず同じく、 デバッグ起動する で実行しおください。 参考 「 Doma Tools」実装コヌド 「 Doma Tools」の リファクタリング 機胜 は、以䞋コヌドで実装しおいたす。 DaoRenameProcessor さいごに 今回は リファクタリング 機胜の実装に぀いおご玹介したした。 「 Doma Tools」では Doma のDAOず SQL の玐づけに察応し、ファむルゞャンプだけでなくファむル名の連動も匷化しおいたす。 特定のファむル間での連携が必芁なプロゞェクトにおいお、 リファクタリング 機胜を甚意しお開発効率を向䞊させたしょう 「 Doma Tools」ぞのレビュヌも投皿しおいただけたすず倧倉励みになりたす🙇‍♀ Doma Tools マヌケットプレヌスペヌゞ 本 プラグむン は OSS ずしお Domaコミュニティ ぞ寄莈されおいたす。 䞍具合修正や機胜芁望、ディスカッションにもぜひご参加ください。 採甚ペヌゞ 執筆 @terao.haruka レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
アバタヌ