はじめに
AWS環境の構成図を手作業で描くのは、地味に時間がかかります。
CloudFormationテンプレートがあるなら、その情報を読み取って構成図を自動生成できたら便利ですよね。
本記事では、Claude Codeとdraw.io MCPサーバーを組み合わせて、CloudFormationテンプレートからAWS公式アイコンを使った構成図を自動生成する方法を紹介します。
この記事でやること
- ローカルプロジェクトの作成
- Claude Codeの設定(
.claude/CLAUDE.md) - draw.io MCPサーバーの設定(
.mcp.json) - CloudFormationテンプレートの配置
- 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.md
## Conversation Guidelines
- 常に日本語で会話する
- 技術的な説明も日本語で行う
- コード内のコメントは日本語で記述
- エラーメッセージの解説は日本語で
- README.mdなどのドキュメントも日本語で作成
CLAUDE.mdとは?
Claude Codeがプロジェクトを読み込む際に自動的に参照される設定ファイルです。会話のルールやコーディング規約などを記述しておくと、毎回指示しなくてもClaude Codeがそのルールに従って動作します。
3. draw.io MCPサーバーの設定
3.1 .mcp.json の作成
プロジェクトルートに .mcp.json を作成します。
このファイルで、Claude Codeが利用するMCPサーバーを定義します。
{
"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)
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)
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)
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が以下の処理を自動で行います。
- テンプレートの読み取り - 各YAMLファイルの内容を解析
- 構成の理解 - リソース間の依存関係やネットワーク構成を把握
- AWS公式ドキュメントの参照 - 構成図のベストプラクティスを確認
- draw.io XMLの生成 - AWS公式アイコンを使った構成図XMLを作成
- ブラウザで表示 - draw.ioエディタが自動で開く
5.4 生成される構成図の内容
Claude Codeが生成した構成図には、以下の要素が含まれます。
| 要素 | 内容 |
|---|---|
| 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で作成し、細かい調整は手動で行うという使い方がおすすめです。
