Diagram-as-code 使ってみた

記事タイトルとURLをコピーする

ディベロップメントサービス1課の三村です。

構成図は自動で生成されるといいなと日々思っていたところ、Diagram-as-code というツールを見つけたので使ってみました。

Diagram-as-code とは

AWS Labs により管理されている、YAML 形式のコードから AWS 構成図を画像 (PNG) 形式で生成してくれるツールです。 画像の出力には指定の形式で記述された YAML ファイルまたは CloudFormation テンプレートから作成することが可能です。

※CloudFormation テンプレートからの作成は現在 beta 版となっており、正確に図が描画されない可能性があり注意が必要です

github.com

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

生成される図

https://github.com/awslabs/diagram-as-code/blob/main/examples/multi-region.png

DAC ファイルの構成は以下です。

Diagram:
    # 使用する設定ファイルを定義
    DefinitionFiles: 
      ...
    # AWS リソースを定義
    Resources:
      ...
    # AWS リソース間に描画する矢印の引き方を定義
    Links:

詳細についてはドキュメントをご確認ください。

github.com

DefinitionFiles

DefinitionFiles にはリソースタイプに応じて使用するアイコンやラベル、線の色などが記述されているファイルを指定します。 基本的な図であれば、同リポジトリに用意された設定ファイルを使用することが可能です。

diagram-as-code/definitions/definition-for-aws-icons-light.yaml at main · awslabs/diagram-as-code · GitHub

  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 Cloud の定義のみ

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

生成される画像を確認すると垂直方向→水平方向に向きが変わっていることが分かります。

向きを変更

向きや位置の指定方法は以下に詳細な記載があるので、必要に応じて参照してみてください。

github.com

次に、リクエストの流れなど矢印で表したいときには 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.amazon.com

機会があればこちらのプロンプトのサンプルを使用して検証してみたいです。

さいごに

今回は AWS 構成図をコードから生成するツールについてご紹介しました。

図の作成するときにちょっと触ると変なところに矢印の終点が移動してしまったりするストレスが解消されそうです。

実際の業務ではテンプレートを分割していたりもするので、そのあたりも考えつつ使えそうなら使っていきたいなと思いました。

三村 菜穂 (記事一覧)

アプリケーションサービス部 ディベロップメントサービス1課

2024年5月入社