背景・目的
SNSで下記の記事を見つけて、便利そうだったので試してみます。
今回は、awsdacのみ利用します。
概要
下記の記事を基に整理します。
「このシステム、全体像を見せてもらえますか?」この質問に即座に対応できる組織はどれくらいあるでしょうか。
多くの AWS ユーザーが直面している課題の一つが、インフラストラクチャの可視化です。AWS リソースの構築は Infrastructure as Code (IaC) を実現する AWS CloudFormation や AWS CDK などの発展により自動化が進んだ一方で、それらの構成図を作成する工程は依然として人の手に委ねられていることが多いのが現状です。
以下のような課題を抱えているチームは少なくないでしょう:
- AWS CloudFormation で管理している本番環境の構成図が古いままで、実態と合っていない
- 開発環境、ステージング環境、本番環境など、複数の環境の構成図を最新に保つのが困難
- システム変更の際、アーキテクチャ図の更新まで手が回らない
- チーム内でアーキテクチャ図の描き方にばらつきがあり、レビューに時間がかかる
このような状況は、以下のような問題につながる可能性があります:
- チーム間のコミュニケーションロスによる開発の遅延
- システム変更時の影響範囲の見落とし
- 新メンバーのオンボーディングの長期化
- セキュリティレビューやコンプライアンス監査への対応の複雑化
- 構成図を最新に保つのが困難ということで、下記のような課題が生じやすい
- コミュニケーションロス
- 変更時の影響範囲の見落とし(バグにつながる)
- オンボーディングの長期化
- レビューなどの対応の複雑化・遅延
本記事では、これらの課題に対する新しいアプローチとして、定義されたドキュメントからアーキテクチャ図を生成するツールである Diagram-as-code と AWS が提供する生成 AI サービスである Amazon Bedrock を組み合わせることで、事前定義されたインフラ構成情報から自動的にアーキテクチャ図を生成し、効率的に管理する手法について実践的な例を交えて解説します。
- Diagram-as-codeとBedrockを組み合わせた事例
アーキテクチャ図生成の自動化
システム開発・運用においてアーキテクチャ図は不可欠です。アーキテクチャ図はシステムの全体像や各コンポーネント間の関係を視覚的に表現し、ステークホルダーのシステム理解を深め、コミュニケーションを円滑化します。しかしながら、アーキテクチャ図の作成と管理には相当な労力がかかり、アーキテクチャ図が存在しないまま進行しているプロジェクトや、更新が滞っており実態と異なるアーキテクチャ図しか存在しないといった状況はよくみられる課題です。
この問題に対し、アーキテクチャ図の自動生成を目指す取り組みは既に存在します。とはいえ、プロジェクトやシステムによって必要な表現や粒度が千差万別であるため、高度で繊細な作業が求められ、「やはり人の手で作成する方が正確で早い」という状況が続いているのが実情です。この現状に共感される方も多いのではないでしょうか。
- アーキテクチャ図の自動生成を目指す取り組みは既に存在するものの、プロジェクトやシステムによって多様であり、人が修正するほうが早い状況が続いている
近年、生成 AI の登場によって、この状況が変わろうとしています。生成 AI の曖昧な要件に対するタスク実行能力や、以前よりも拡大したコンテキストウィンドウを活用することで、構造化されていない文章からの情報抽出や構造化されたテキストへの変換が容易に可能となりました。これにより、アーキテクチャ図作成の自動化における大きな課題だった多様な要件の図への反映作業が簡略化できるようになります。
- 生成AIにより、構造化されていない文章からの情報抽出、構造化されたテキストへの変換が容易になった
Diagram-as-code とは
本記事で紹介する Diagram-as-code は、事前に準備された構造化されたテキストベースから自動でアーキテクチャ図を生成するツールです。図の生成にあたって画像編集ソフトウェアや手作業での配置を必要としないため、効率的にアーキテクチャ図を作成・管理することができます。
本ツールの主な特長とユースケースは以下のとおりです:
- AWS アーキテクチャガイドラインに準拠した、一貫性のある図を簡潔に生成できます
- ヘッドレスブラウザや GUI に依存せず軽量で、コンテナですぐに始めることができます。これにより CI/CD での活用に親和性があります
- CloudFormation テンプレートからツールで使用する定義ファイル (Dac ファイル) への変換機能が存在するため、IaC を実現している環境でより一貫した図を生成できます
- CLI ツールとしての提供の他、Golang のライブラリとしても提供されており、例えば import して他の IaC ツール、AI システム、または描画 GUI ツールとの統合が可能です
- 拡張可能な定義ファイル形式により、AWS サービスに限らず、様々なクラウドプロバイダーやオンプレミスコンポーネントを含むダイアグラムの作成が可能です
Diagram-as-code は CloudFormation テンプレートに類似したYAML形式のファイルを入力として、アーキテクチャ図を生成します。以下の図は活用中の CloudFormation テンプレートが存在する場合における Diagram-as-code の利用フローを示しています。
- Diagram-as-codeは、事前に準備された構造化されたテキストベースから自動でアーキテクチャ図を生成するツール
- 本ツールの主な特徴とユースケースは以下の通り
- アーキテクチャガイドラインに準拠した、一貫性のある図を簡潔に生成
- ヘッドレスブラウザや GUI に依存せず軽量で、コンテナですぐに始める事が可能
- CI/CDと親和性あり
- CLI ツールとしての提供の他、Golang のライブラリとしても提供されている
- 拡張可能な定義ファイル形式により、AWS サービスに限らず、様々なクラウドプロバイダーやオンプレミスコンポーネントを含むダイアグラムの作成が可能
Diagram-as-code を活用すれば、既存の CloudFormation テンプレートからアーキテクチャ図を効率的に生成できます。しかし実際のプロジェクトで活用する段階においては、データフローやセキュリティ境界といった CloudFormation テンプレートに明示されていない要素をアーキテクチャ図に追加する必要が不可欠であり、この部分は依然として手作業による対応が求められます。さらに、目的に応じて表現の粒度や内容を変えたい場合、生成したい図ごとに手動での作業が発生します。そのため、用途の多様化やステークホルダーの増加、図に含まれるシステムの複雑さやリソース数に比例して、下図のように手作業の工数が増大していきます。
生成 AI によるアーキテクチャ図作成の自動化
Amazon Bedrock を活用した自動化のソリューション設計
この課題に対し、Amazon Bedrock と Diagram-as-code を組み合わせることで、より効率的かつ柔軟なアーキテクチャ図の生成が可能となります。
Amazon Bedrock は、フルマネージド型のサービスで、Anthropic、Cohere、Meta、Mistral AI、Amazon などの最先端の AI 企業が提供する高性能な基盤モデル (Foundation Model) を単一の API で利用できるほか、セキュリティ、プライバシー、責任ある AI に配慮した生成 AI アプリケーションを構築するための幅広い機能を提供します。
Amazon Bedrock を活用することで、本課題に対して以下の機能を実装できます:
- 要件解釈機能: ユーザーが自然言語で入力した要件を理解する
- 構造化出力機能: 理解した要件を含む構造化されたテキストを生成する
- 対話的最適化機能: 生成結果に対するフィードバックを通じて出力したテキストの調整と改善を行う
前項で示した課題に対して Amazon Bedrock を取り入れた活用のフローは以下の通りです。ユーザーの自然言語での入力と CloudFormation テンプレートの情報から Dac ファイルの生成を行う手続きを Amazon Bedrock に任せることで、要件ごとに形式化された情報を手動で追加する作業を大幅に効率化できます。
- Amazon Bedrock を活用することで、以下の機能を実装できる
- 要件解釈機能
- 構造化出力機能
- 対話的最適化機能
前項で示した課題に対して Amazon Bedrock を取り入れた活用のフローは以下の通りです。ユーザーの自然言語での入力と CloudFormation テンプレートの情報から Dac ファイルの生成を行う手続きを Amazon Bedrock に任せることで、要件ごとに形式化された情報を手動で追加する作業を大幅に効率化できます。
- ユーザの自然言語での入力とCfnテンプレの情報からDacファイルの生成を行う手続きをBedrockに任せる
diagram-as-code
下記を基に整理します。
This command line interface (CLI) tool enables drawing infrastructure diagrams for Amazon Web Services through YAML code. It facilitates diagram-as-code without relying on image libraries.
- このCLIは、AWSのインフラをYAMLで描画する
The CLI tool promotes code reuse, testing, integration, and automating the diagramming process. It allows managing diagrams with Git by writing human-readable YAML.
- このCLIは、コードの再利用、テスト、統合、ダイアグラム生成プロセスの自動化を促進する
- YAMLを記述することでGitを使ったダイアグラム管理が可能になる
Example templates are here. Check out the Introduction Guide as well for additional information.
実践
前提条件
Cognito User Profiles Export リファレンスアーキテクチャを使用します
Step1 Diagram-as-codeのセットアップ
-
プロジェクト用のディレクトリを作成し、ワークスペースに追加します
mkdir diagram-as-code
-
移動します
cd diagram-as-code
-
下記のコマンドで、awsdacをインストールします
% go install github.com/awslabs/diagram-as-code/cmd/awsdac@latest %
-
リファレンスアーキテクチャのページからCfnテンプレートファイルをダウンロードします
% ls -l total 8 -rw-r--r--@ 1 XXXX staff 917 7 6 16:19 vpc-subnet-ec2-cfn.yaml %
-
下記のコマンドを実行すると、中間ファイルと描画結果である png ファイルの両方を生成できます
% awsdac vpc-subnet-ec2-cfn.yaml --cfn-template --dac-file [Completed] dac (diagram-as-code) data written to output.yaml [Completed] AWS infrastructure diagram generated: output.png %
-
下記のコードが生成されていました
Diagram: DefinitionFiles: - Type: URL Url: https://raw.githubusercontent.com/awslabs/diagram-as-code/main/definitions/definition-for-aws-icons-light.yaml LocalFile: "" Embed: Definitions: {} Resources: AWSCloud: Type: AWS::Diagram::Cloud Icon: "" IconFill: null Direction: "" Preset: AWSCloudNoLogo Align: center HeaderAlign: "" FillColor: "" Title: "" TitleColor: "" Font: "" Children: - VPC BorderColor: "" BorderChildren: [] Canvas: Type: AWS::Diagram::Canvas Icon: "" IconFill: null Direction: "" Preset: "" Align: "" HeaderAlign: "" FillColor: "" Title: "" TitleColor: "" Font: "" Children: - AWSCloud BorderColor: "" BorderChildren: [] EC2Instance1: Type: AWS::EC2::Instance Icon: "" IconFill: null Direction: "" Preset: "" Align: "" HeaderAlign: "" FillColor: "" Title: "" TitleColor: "" Font: "" Children: [] BorderColor: "" BorderChildren: [] EC2Instance2: Type: AWS::EC2::Instance Icon: "" IconFill: null Direction: "" Preset: "" Align: "" HeaderAlign: "" FillColor: "" Title: "" TitleColor: "" Font: "" Children: [] BorderColor: "" BorderChildren: [] Subnet1: Type: AWS::EC2::Subnet Icon: "" IconFill: null Direction: "" Preset: "" Align: "" HeaderAlign: "" FillColor: "" Title: "" TitleColor: "" Font: "" Children: - EC2Instance1 BorderColor: "" BorderChildren: [] Subnet2: Type: AWS::EC2::Subnet Icon: "" IconFill: null Direction: "" Preset: "" Align: "" HeaderAlign: "" FillColor: "" Title: "" TitleColor: "" Font: "" Children: - EC2Instance2 BorderColor: "" BorderChildren: [] VPC: Type: AWS::EC2::VPC Icon: "" IconFill: null Direction: "" Preset: "" Align: "" HeaderAlign: "" FillColor: "" Title: "" TitleColor: "" Font: "" Children: - Subnet1 - Subnet2 BorderColor: "" BorderChildren: [] Links: []
修正します
-
下記のようにoutput.yamlを修正します
EC2Instance1: Type: AWS::EC2::Instance Title: "Web Server" # ← ここを変更
-
再生成します
% awsdac output.yaml --output updated-diagram.png [Completed] AWS infrastructure diagram generated: updated-diagram.png %
考察
今回、awsdacを試してみました。次回以降、AWSブログにあるようにBedrockを組み合わせてみます。
参考