ディベロップメントサービス1課の三村です。
構成図は自動で生成されるといいなと日々思っていたところ、Diagram-as-code というツールを見つけたので使ってみました。
Diagram-as-code とは
AWS Labs により管理されている、YAML 形式のコードから AWS 構成図を画像 (PNG) 形式で生成してくれるツールです。 画像の出力には指定の形式で記述された YAML ファイルまたは CloudFormation テンプレートから作成することが可能です。
※CloudFormation テンプレートからの作成は現在 beta 版となっており、正確に図が描画されない可能性があり注意が必要です
Diagram-as-code の考え方
IaC (Infrastructure as Code) でリソースを管理することは一般的になっていますよね。 大きなメリットとして、Git によるバージョン管理が可能なことが挙げられると思います。
構成図に関しても、コードで Git 管理ができればいつどのような変更があったのかが追いやすくて良さそうです。 最新版しかない、フェーズ○○のようなファイルが複数あるといったことも防げそうです。
使ってみる
前提条件
事前に Go のインストールが必要となります。
こちらからインストールが可能です。
Diagram-as-code のインストール
以下コマンドを実行し、Diagram-as-code をインストールします。
・Windows
go install github.com/awslabs/diagram-as-code/cmd/awsdac@latest
・Mac
brew install awsdac
awsdac
コマンドが使用できるようになれば準備完了です。
構成図を作成してみる
先ほどの Diagram-as-code の GitHub のリポジトリ の examples にいくつか例となる YAML ファイルが用意されています。
今回は以下の例をベースに使用して図を描画してみます。
図を描画するための YAML(DAC ファイル)
diagram-as-code/examples/multi-region.yaml at main · awslabs/diagram-as-code · GitHub
生成される図

DAC ファイルの構成は以下です。
Diagram: # 使用する設定ファイルを定義 DefinitionFiles: ... # AWS リソースを定義 Resources: ... # AWS リソース間に描画する矢印の引き方を定義 Links:
詳細についてはドキュメントをご確認ください。
DefinitionFiles
DefinitionFiles にはリソースタイプに応じて使用するアイコンやラベル、線の色などが記述されているファイルを指定します。 基本的な図であれば、同リポジトリに用意された設定ファイルを使用することが可能です。
DefinitionFiles: - Type: URL Url: "https://raw.githubusercontent.com/awslabs/diagram-as-code/main/definitions/definition-for-aws-icons-light.yaml"
ローカルファイルを指定することも可能なので、こちらの設定ファイルをもとにカスタマイズしてみてもいいかもしれないですね。
Resources
Resources には AWS リソースを定義しますが、その他図の描画に必要な以下要素についても定義が必要です。
- AWS::Diagram::Canvas
- 何も描画しないが、全ての要素はキャンバスの子要素である必要がある
- AWS::Diagram::Cloud
- 1番外側の AWS Cloud の枠を定義
- AWS リソースはこの要素の子要素として定義する
- AWS のロゴかクラウドのロゴとするかはプリセットで変更可能
Resources: Canvas: Type: AWS::Diagram::Canvas Direction: vertical Children: # 子要素を指定 - AWSCloud AWSCloud: Type: AWS::Diagram::Cloud Direction: vertical Align: center
1度この状態で以下コマンドを実行して図を作成してみます。
awsdac .\dac_test.yml
[Completed] AWS infrastructure diagram generated: output.png
と表示され、output.png
という名前の画像ファイルが生成されます。

AWS のロゴと AWS Cloud
というラベルのみ描画された画像が生成されました。
次に、リージョンを2つ追加し、AWSCloud の子要素にリージョンを追加します。
Resources: Canvas: Type: AWS::Diagram::Canvas Direction: vertical Children: - AWSCloud AWSCloud: Type: AWS::Diagram::Cloud Direction: vertical Align: center Children: - Regions Regions: Type: AWS::Diagram::HorizontalStack Children: # 追加したリージョンを子要素として設定 - OregonRegion - VirginiaRegion OregonRegion: Type: AWS::Region Direction: vertical Title: us-west-2 VirginiaRegion: Type: AWS::Region Direction: vertical Title: us-east-1

子要素を設定した AWSCloud
の枠線が描画され、枠内にリージョンが2つ追加されました。
このようにリソースを定義し、親要素に子要素とするリソースを定義することで枠内に描画されていくようです。
その他描画される方向やアイコン位置などについても調整が可能です。 リソース定義をオレゴンリージョンの VPC、パブリックサブネット2つ、IGW、ALB、EC2 とし、ユーザーアイコンも追加します。
Resources: Canvas: Type: AWS::Diagram::Canvas Direction: vertical Children: - AWSCloud - User # ユーザーを追加 AWSCloud: Type: AWS::Diagram::Cloud Direction: vertical Align: center Children: - Regions Regions: Type: AWS::Diagram::HorizontalStack Children: - OregonRegion OregonRegion: Type: AWS::Region Direction: vertical Title: us-west-2 Children: - OregonVPC OregonVPC: Type: AWS::EC2::VPC Direction: vertical Title: VPC Children: - OregonVPCPublicStack - OregonALB BorderChildren: - Position: S Resource: OregonIGW OregonVPCPublicStack: Type: AWS::Diagram::HorizontalStack Children: - OregonVPCPublicSubnet1 - OregonVPCPublicSubnet2 OregonVPCPublicSubnet1: Type: AWS::EC2::Subnet Preset: PublicSubnet Children: - OregonVPCPublicSubnet1Instance OregonVPCPublicSubnet1Instance: Type: AWS::EC2::Instance OregonVPCPublicSubnet2: Type: AWS::EC2::Subnet Preset: PublicSubnet Children: - OregonVPCPublicSubnet2Instance OregonVPCPublicSubnet2Instance: Type: AWS::EC2::Instance OregonALB: Type: AWS::ElasticLoadBalancingV2::LoadBalancer Preset: Application Load Balancer OregonIGW: Type: AWS::EC2::InternetGateway IconFill: Type: rect User: # プリセットを使用しユーザーアイコンを追加 Type: AWS::Diagram::Resource Preset: User
作成される画像

基本的に描画される順番としては子要素を指定する順に vertical
であれば上から下、horizontal
であれば左から右に描画されるようです。
キャンバスの向きを horizontal
に変更し、子要素の順を変更してみます。
Resources: Canvas: Type: AWS::Diagram::Canvas Direction: horizontal Children: - User - AWSCloud
生成される画像を確認すると垂直方向→水平方向に向きが変わっていることが分かります。

向きや位置の指定方法は以下に詳細な記載があるので、必要に応じて参照してみてください。
Links
次に、リクエストの流れなど矢印で表したいときには Links に定義することができます。
矢印の描画に必要な項目は以下です。
- Source
- 矢印の始点のリソース名
- SourcePosition
- 始点となるアイコンのどの位置から矢印をのばすか
- 例えば、W にするとアイコンの左側から矢印がのびる
- 始点となるアイコンのどの位置から矢印をのばすか
- Target
- 矢印の終点のリソース名
- TargetPosition
- 終点となるアイコンのどの位置に向けて矢印をのばすか
- 例えば、S にするとアイコンの下側に向けて矢印がのびる
- 終点となるアイコンのどの位置に向けて矢印をのばすか
- Type
- 何も指定しない場合は直線
orthogonal
を指定すると直角に曲がる線が描ける
ユーザーアイコン→ IGW → ALB → EC2 の流れを表してみます。
Links: - Source: OregonALB SourcePosition: W Target: OregonVPCPublicSubnet1Instance TargetPosition: S TargetArrowHead: Type: Open Type: orthogonal # 直角に曲がる線 - Source: OregonALB SourcePosition: E Target: OregonVPCPublicSubnet2Instance TargetPosition: S TargetArrowHead: Type: Open # Type: orthogonal の指定がないので直線 - Source: OregonIGW SourcePosition: N Target: OregonALB TargetPosition: S TargetArrowHead: Type: Open - Source: User SourcePosition: N Target: OregonIGW TargetPosition: S TargetArrowHead: Type: Open
生成される画像

こちらも詳細な設定は以下参照してください。 github.com
CloudFormation テンプレートから作成する
冒頭で CloudFormation テンプレートから図を描画する機能は beta 版と記載しておりましたが、CloudFormation テンプレートから DAC ファイルを作成することは可能です。
コマンドは以下です。
awsdac examples/vpc-subnet-ec2-cfn.yaml --cfn-template --dac-file
CloudFormation テンプレートがすでに用意されている場合にはリソース定義などはテンプレートから起こして、生成される画像を確認しつつ微調整をするのが良さそうです。
自動化できないか
コード管理できるとはいえ、CloudFormation テンプレートとは別にコード書かないといけないのはちょっとめんどくさいですよね。 欲を言えば CloudFormation テンプレートから作成してさらに配置をいい感じにするところまでやってほしい、、、
AWS のブログに Amazon Bedrock を使用するのが良さそうという記事を見つけました。
機会があればこちらのプロンプトのサンプルを使用して検証してみたいです。
さいごに
今回は AWS 構成図をコードから生成するツールについてご紹介しました。
図の作成するときにちょっと触ると変なところに矢印の終点が移動してしまったりするストレスが解消されそうです。
実際の業務ではテンプレートを分割していたりもするので、そのあたりも考えつつ使えそうなら使っていきたいなと思いました。