1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

YAMLでAWSアーキテクチャ図を描けるDiagram-as-code(awsdac)を知ってほしい

Last updated at Posted at 2025-12-06

はじめに

皆さんはAWSアーキテクチャ図を作成する際、どんなツールを使っていますか?
Microsoft PowerPointですか?draw.ioですか?それとも…?
何を使っているにせよ、リージョンやサブネットなどの枠を適切なサイズに広げ、各種アイコンの位置を揃えるといった作業でイライラしませんか?
そんな方に是非使ってみてほしいのが今回紹介するDiagram-as-code(awsdac)です!

Diagram-as-code(awsdac)とは?

Diagram-as-code(awsdac)とはAWSが公開しているOSSで、YAMLファイルからAWSアーキテクチャ図を出力するツールです。
枠のサイズは自動で決定され、アイコンの細かい位置調整も自動で実行されます。
また、アーキテクチャ図の生成元がYAMLファイルなので、Gitで更新履歴を管理しやすいです。
現在、ベータ版としてAWS CloudFormationテンプレートからAWSアーキテクチャ図を出力する機能も提供されています。

実際に使ってみる

今回はApplication Load Balancer・Amazon EC2・Amazon RDSで構成される典型的なWebアプリケーションのAWSアーキテクチャ図を作成してみます。
Diagram-as-codeを使用するにはGo 1.21以上が必要なので、あらかじめインストールしておきます。
Go環境が整ったら、Diagram-as-codeをインストールします。

Diagram-as-codeインストールコマンド
go install github.com/awslabs/Diagram-as-code/cmd/awsdac@latest

次に、DACファイルと呼ばれるYAMLファイルを用意します。

DACファイル
Diagram:
  DefinitionFiles:
    - Type: URL
      Url: https://raw.githubusercontent.com/awslabs/Diagram-as-code/main/definitions/definition-for-aws-icons-light.yaml

  Resources:
    Canvas:
      Type: AWS::Diagram::Canvas
      Direction: vertical
      Children:
        - Users
        - AWSCloud
    Users:
      Type: AWS::Diagram::Resource
      Preset: Users
    AWSCloud:
      Type: AWS::Diagram::Cloud
      Children:
        - Region
    Region:
      Type: AWS::Region
      Title: Region (ap-northeast-1)
      Children:
        - VPC
    VPC:
      Type: AWS::EC2::VPC
      Align: top
      Children:
        - AStack
        - ALB
        - CStack
      BorderChildren:
        - Position: N
          Resource: IGW
    AStack:
      Type: AWS::Diagram::VerticalStack
      Children:
        - PublicSubnetA
        - PrivateSubnetA
    ALB:
      Type: AWS::ElasticLoadBalancingV2::LoadBalancer
      Preset: Application Load Balancer
    CStack:
      Type: AWS::Diagram::VerticalStack
      Children:
        - PublicSubnetC
        - PrivateSubnetC
    IGW:
      Type: AWS::EC2::InternetGateway
    PublicSubnetA:
      Type: AWS::EC2::Subnet
      Preset: PublicSubnet
      Title: Public subnet (AZ a)
      Children:
        - PublicSubnetAEmptyResource
    PrivateSubnetA:
      Type: AWS::EC2::Subnet
      Preset: PrivateSubnet
      Title: Private subnet (AZ a)
      Direction: vertical
      Children:
        - EC2A
        - RDSA
    PublicSubnetC:
      Type: AWS::EC2::Subnet
      Preset: PublicSubnet
      Title: Public subnet (AZ c)
      Children:
        - PublicSubnetCEmptyResource
    PrivateSubnetC:
      Type: AWS::EC2::Subnet
      Preset: PrivateSubnet
      Title: Private subnet (AZ c)
      Direction: vertical
      Children:
        - EC2C
        - RDSC
    PublicSubnetAEmptyResource:
      Type: AWS::Diagram::Resource
    PublicSubnetCEmptyResource:
      Type: AWS::Diagram::Resource
    EC2A:
      Type: AWS::EC2
      Title: Amazon EC2
    RDSA:
      Type: AWS::RDS
      Title: Amazon RDS (Primary)
    EC2C:
      Type: AWS::EC2
      Title: Amazon EC2
    RDSC:
      Type: AWS::RDS
      Title: Amazon RDS (Secondary)

  Links:
    - Source: Users
      SourcePosition: S
      Target: IGW
      TargetPosition: N
      TargetArrowHead:
        Type: Open
    - Source: IGW
      SourcePosition: S
      Target: ALB
      TargetPosition: N
      TargetArrowHead:
        Type: Open
    - Source: ALB
      SourcePosition: W
      Target: EC2A
      TargetPosition: N
      TargetArrowHead:
        Type: Open
      Type: orthogonal
    - Source: ALB
      SourcePosition: E
      Target: EC2C
      TargetPosition: N
      TargetArrowHead:
        Type: Open
      Type: orthogonal
    - Source: EC2A
      SourcePosition: S
      Target: RDSA
      TargetPosition: N
      TargetArrowHead:
        Type: Open
    - Source: EC2C
      SourcePosition: S
      Target: RDSA
      TargetPosition: N
      TargetArrowHead:
        Type: Open
      Type: orthogonal
    - Source: RDSA
      SourcePosition: E
      Target: RDSC
      TargetPosition: W
      TargetArrowHead:
        Type: Open
      LineStyle: dashed
      Labels:
        SourceLeft:
          Title: Replication

AWS CloudFormationテンプレートの記法に少し似ており、テンプレートを作成したことのある方はとっつきやすいと思います。
文法について詳しく知りたい方はDiagram-as-codeのGitHubリポジトリか私が以前執筆したZennの記事を参照してください。

DACファイルを用意したら、Diagram-as-codeを使ってアーキテクチャ図を出力します。

Diagram-as-code画像出力コマンド
$ awsdac PATH_TO_DAC_FILE

20251207_001.png

結構綺麗に描画できていると思いませんか?
ただ、いくつか「惜しい」部分がありますね…。

ここが「惜しい」…!

本記事は「惜しい」技術への愛を語る Advent Calendar 2025の一環で作成しています。
そのため、ここからはDiagram-as-codeの「惜しい」点について述べていきます。

リソースがリソースを跨げない

流派によってはApplication Load BalancerのアイコンがPublic subnet (AZ a)とPublic subnet (AZ c)を跨ぐようにAWSアーキテクチャ図を描きたいでしょう。

20251207_002.png

しかし、現時点でこれを実現することはできません。
以下の画像のように、枠が枠を跨げない問題はIssue #36として起票されているので、将来解決されるかもしれません。

20251207_003.png
https://github.com/awslabs/Diagram-as-code/issues/36より引用

線がリソースのラベルに被っている

リソースの位置の微調整が難しいので、Application Load Balancerから伸びる矢印がSubnetの文字に被ってしまうのは仕方ありません。
しかし、Amazon EC2から伸びる矢印が文字に被っているのは気になります。

20251207_004.png

これもIssue #172として起票されているので、将来解決されるかもしれません。

線のラベルを中央に配置できない

本当は「Replication」の文字を矢印の中央付近に配置したいところですが、現時点では矢印の始点付近または終点付近にしか配置できません。

20251207_005.png

ただ、ラベルの位置までこだわりだすと何のためにDiagram-as-codeを使っているのか分からなくなるため、現状の仕様のままでよい気もします。

さいごに

いくつか惜しい点はありますが、Diagram-as-codeはまだまだ開発途上なのでこれからも期待できそうです。
Diagram-as-codeに興味を持った方は以下のAWS公式ブログもぜひ読んでみてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?