4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeとdraw.io MCPでCloudFormationテンプレートからAWS構成図を自動生成する

4
Posted at

はじめに

AWS環境の構成図を手作業で描くのは、地味に時間がかかります。
CloudFormationテンプレートがあるなら、その情報を読み取って構成図を自動生成できたら便利ですよね。

本記事では、Claude Codedraw.io MCPサーバーを組み合わせて、CloudFormationテンプレートからAWS公式アイコンを使った構成図を自動生成する方法を紹介します。

この記事でやること

  1. ローカルプロジェクトの作成
  2. Claude Codeの設定(.claude/CLAUDE.md
  3. draw.io MCPサーバーの設定(.mcp.json
  4. CloudFormationテンプレートの配置
  5. Claude Codeにプロンプトを送って構成図を生成

前提条件

  • Claude Codeがインストール済みであること
  • Node.js(v18以上)がインストール済みであること
  • ブラウザが利用可能であること(draw.ioの表示用)

1. ローカルプロジェクトの作成

まず、作業用のプロジェクトディレクトリを作成します。

mkdir aws-diagram-project
cd aws-diagram-project

2. Claude Codeの設定

2.1 .claude ディレクトリとCLAUDE.mdの作成

プロジェクトルートに .claude ディレクトリを作成し、その中に CLAUDE.md を配置します。
CLAUDE.md は、Claude Codeに対するプロジェクト固有の指示書です。

mkdir .claude

.claude/CLAUDE.md を以下の内容で作成します。

.claude/CLAUDE.md
# CLAUDE.md

## Conversation Guidelines
- 常に日本語で会話する
- 技術的な説明も日本語で行う
- コード内のコメントは日本語で記述
- エラーメッセージの解説は日本語で
- README.mdなどのドキュメントも日本語で作成

CLAUDE.mdとは?
Claude Codeがプロジェクトを読み込む際に自動的に参照される設定ファイルです。会話のルールやコーディング規約などを記述しておくと、毎回指示しなくてもClaude Codeがそのルールに従って動作します。

3. draw.io MCPサーバーの設定

3.1 .mcp.json の作成

プロジェクトルートに .mcp.json を作成します。
このファイルで、Claude Codeが利用するMCPサーバーを定義します。

.mcp.json
{
  "mcpServers": {
    "aws-documentation": {
      "type": "stdio",
      "command": "uv",
      "args": [
        "tool",
        "run",
        "--from",
        "awslabs.aws-documentation-mcp-server@latest",
        "awslabs.aws-documentation-mcp-server"
      ],
      "env": {
        "AWS_REGION": "ap-northeast-1"
      }
    },
    "drawio": {
      "type": "stdio",
      "command": "cmd",
      "args": ["/c", "npx", "@drawio/mcp@latest"]
    }
  }
}

MCPサーバーとは?
MCP(Model Context Protocol)は、Claude Codeの機能を拡張する仕組みです。MCPサーバーを追加することで、外部ツールとの連携が可能になります。今回はdraw.ioとの連携を追加しています。

3.2 MCPサーバーの動作確認

Claude Codeを起動して、draw.io MCPサーバーが認識されているか確認します。

claude

起動後、/mcp コマンドを実行すると、接続中のMCPサーバー一覧が表示されます。

> /mcp

drawio が一覧に表示されていれば設定完了です。

4. CloudFormationテンプレートの配置

構成図を作成したいCloudFormationテンプレートをプロジェクトルートに配置します。

4.1 ディレクトリ構成

最終的なディレクトリ構成は以下のようになります。

aws-diagram-project/
├── .claude/
│   └── CLAUDE.md
├── .mcp.json
├── sample-ec2-template.yaml
├── sample-alb-template.yaml
└── sample-db-template.yaml

4.2 サンプルテンプレート

今回は、以下の3つのCloudFormationテンプレートを用意しました。
典型的な3層Webアプリケーション構成(ALB + EC2 + RDS)のテンプレートです。

EC2テンプレート(sample-ec2-template.yaml

sample-ec2-template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Sample EC2 instance template

Parameters:
  LaunchTemplateVersion:
    Type: String
    Default: "1"
    Description: 'Launch Template Version Number.'

  NameTag:
    Type: String
    Default: sample-ec2-web

Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      LaunchTemplate:
        LaunchTemplateId: lt-xxxxxxxxxxxxxxxxx
        Version: !Ref LaunchTemplateVersion
      Tags:
        - Key: Name
          Value: !Ref NameTag

Outputs:
  InstanceId:
    Description: The ID of the launched EC2 instance
    Value: !Ref MyEC2Instance
  InstancePrivateIP:
    Description: The private IP address of the launched EC2 instance
    Value: !GetAtt MyEC2Instance.PrivateIp

ALBテンプレート(sample-alb-template.yaml

sample-alb-template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Sample ALB and TargetGroup template

Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
    Default: vpc-xxxxxxxxxxxxxxxxx

  Subnets:
    Type: List<AWS::EC2::Subnet::Id>
    Default: subnet-xxxxxxxxxxxxxxxxx,subnet-yyyyyyyyyyyyyyyyy

  TargetInstanceId:
    Type: AWS::EC2::Instance::Id

  TgName:
    Type: String
    Default: sample-tg

  HealthCheckPath:
    Type: String
    Default: /

  AlbSecurityGroupId:
    Type: AWS::EC2::SecurityGroup::Id
    Default: sg-xxxxxxxxxxxxxxxxx

  NameTag:
    Type: String
    Default: sample-alb

Resources:
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: !Ref NameTag
      Scheme: internet-facing
      Type: application
      IpAddressType: ipv4
      Subnets: !Ref Subnets
      SecurityGroups:
        - !Ref AlbSecurityGroupId
      Tags:
        - Key: Name
          Value: !Ref NameTag

  TargetGroup80:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: !Ref TgName
      VpcId: !Ref VpcId
      Protocol: HTTP
      Port: 80
      TargetType: instance
      HealthCheckEnabled: true
      HealthCheckProtocol: HTTP
      HealthCheckPort: '80'
      HealthCheckPath: !Ref HealthCheckPath
      Matcher:
        HttpCode: '200-399'
      Targets:
        - Id: !Ref TargetInstanceId
          Port: 80

  HttpListener80:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref TargetGroup80

Outputs:
  AlbDnsName:
    Description: Public DNS name of the ALB
    Value: !GetAtt ApplicationLoadBalancer.DNSName
  TargetGroupArn:
    Description: ARN of the Target Group (HTTP:80)
    Value: !Ref TargetGroup80

RDSテンプレート(sample-db-template.yaml

sample-db-template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Sample RDS MySQL template

Parameters:
  DBInstanceIdentifier:
    Type: String
    Default: sample-db

  DBName:
    Type: String
    Default: sample_dev

  MasterUsername:
    Type: String
    Default: admin

  MasterUserPassword:
    Type: String
    NoEcho: true

  DBSubnetGroupName:
    Type: String
    Default: sample-db-subnet-group

  VpcSecurityGroupId:
    Type: String
    Default: sg-yyyyyyyyyyyyyyyyy

  AvailabilityZone:
    Type: String
    Default: ap-northeast-1a

Resources:
  MyRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      Engine: mysql
      EngineVersion: '8.0'
      DBInstanceClass: db.t3.micro
      DBInstanceIdentifier: !Ref DBInstanceIdentifier
      DBName: !Ref DBName
      MasterUsername: !Ref MasterUsername
      MasterUserPassword: !Ref MasterUserPassword
      MultiAZ: false
      AvailabilityZone: !Ref AvailabilityZone
      PubliclyAccessible: false
      DBSubnetGroupName: !Ref DBSubnetGroupName
      VPCSecurityGroups:
        - !Ref VpcSecurityGroupId
      StorageType: gp3
      AllocatedStorage: 20
      StorageEncrypted: true
      DeletionProtection: false

Outputs:
  DBEndpointAddress:
    Description: RDS endpoint hostname
    Value: !GetAtt MyRDSInstance.Endpoint.Address
  DBEndpointPort:
    Description: RDS endpoint port
    Value: !GetAtt MyRDSInstance.Endpoint.Port

5. Claude Codeで構成図を生成する

5.1 Claude Codeの起動

プロジェクトディレクトリでClaude Codeを起動します。

cd aws-diagram-project
claude

5.2 構成図生成プロンプト

以下のプロンプトをClaude Codeに送信します。

以下のCloudFormationテンプレートを参照し、drawio MCPを使って構成図を作成してください。
AWSサービスはAWS公式アイコンを配置してほしい。
構成図の書き方はAWS公式ドキュメントを参照すること。
対象テンプレート:sample-ec2-template.yaml、sample-alb-template.yaml、sample-db-template.yaml

5.3 実行結果

プロンプトを送信すると、Claude Codeが以下の処理を自動で行います。

  1. テンプレートの読み取り - 各YAMLファイルの内容を解析
  2. 構成の理解 - リソース間の依存関係やネットワーク構成を把握
  3. AWS公式ドキュメントの参照 - 構成図のベストプラクティスを確認
  4. draw.io XMLの生成 - AWS公式アイコンを使った構成図XMLを作成
  5. ブラウザで表示 - draw.ioエディタが自動で開く

5.4 生成される構成図の内容

Claude Codeが生成した構成図には、以下の要素が含まれます。

image.png

要素 内容
AWS Cloud AWS公式グループ枠
Region ap-northeast-1
VPC VPC グループ枠
Subnet 2つのサブネット
Security Group ALB用、DB用の2つ
ALB Application Load Balancer(internet-facing)
Target Group HTTP:80、ヘルスチェック設定
EC2 Launch Templateから起動するWebサーバー
RDS MySQL 8.0、db.t3.micro、暗号化有効
CloudFormation 3つのスタック情報
S3 テンプレート格納バケット

使用されるAWS公式アイコン:

mxgraph.aws4.application_load_balancer  - ALB
mxgraph.aws4.ec2_instance              - EC2
mxgraph.aws4.rds_instance              - RDS
mxgraph.aws4.rds_mysql_instance        - MySQL
mxgraph.aws4.resourceIcon + s3         - S3
mxgraph.aws4.resourceIcon + cloudformation - CloudFormation
mxgraph.aws4.group_aws_cloud_alt       - AWSクラウド枠
mxgraph.aws4.group_vpc2                - VPC枠
mxgraph.aws4.group_subnet              - サブネット枠
mxgraph.aws4.group_security_group      - セキュリティグループ枠

プロンプトのコツ

実際に試してみてわかった、より良い構成図を生成するためのコツを紹介します。

1. AWS公式アイコンの指定を明示する

AWSサービスはAWS公式アイコンを配置してほしい。

この指示がないと、汎用的な図形で描画される場合があります。

2. 参照するテンプレートを明確にする

対象テンプレート:sample-ec2-template.yaml、sample-alb-template.yaml、sample-db-template.yaml

ファイル名を具体的に指定することで、Claude Codeが正確にファイルを読み取ります。

3. AWS公式ドキュメントの参照を指示する

構成図の書き方はAWS公式ドキュメントを参照すること

AWS公式の構成図ガイドラインに沿ったレイアウトになります。

4. 修正が必要な場合は追加で指示する

生成された構成図に修正が必要な場合は、追加でプロンプトを送ります。

AWS公式アイコンを利用してください
セキュリティグループの枠線を赤色の破線にしてください

Claude Codeは前回の会話コンテキストを保持しているため、差分の指示だけで修正してくれます。

draw.ioでの編集・保存

ブラウザで開いたdraw.ioエディタでは、以下の操作が可能です。

  • レイアウト調整 - 要素のドラッグ&ドロップで位置を調整
  • PNG/SVG/PDFエクスポート - File > Export as から各形式で出力
  • XML保存 - File > Save as でXMLファイルとして保存
  • 追加編集 - アイコンの追加、接続線の修正など

まとめ

項目 内容
必要なファイル .claude/CLAUDE.md.mcp.json、CFnテンプレート
MCPサーバー @anthropic/draw.io-mcp
生成方法 Claude Codeにプロンプトを送信
出力 draw.ioエディタがブラウザで自動起動
アイコン AWS Architecture 2021/2024公式アイコン

CloudFormationテンプレートさえあれば、数分で構成図が生成できます。
手作業で描くと30分以上かかるような構成図も、プロンプト一発で作成可能です。

便利ですが、一部アイコンがおかしいところや、構成図としてまだまだ不十分なところもあるため、手直しは必要ですね。
ただ、テンプレートから構成図のイメージが浮かばない複雑な構成な場合もあるので、作成のイメージに使えて便利だなと思います。

生成された構成図はdraw.ioで自由に編集できるため、ベースをClaude Codeで作成し、細かい調整は手動で行うという使い方がおすすめです。

参考リンク

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?