はじめに
AWSのインフラ構成図を作成する際、手動でdraw.ioを使って描くことが多いが、MCPサーバを使えばLLMに指示するだけで構成図を生成できるようになる。
今回は、draw.ioの公式MCPサーバである@drawio/mcpを使って、以下の3つのアプローチでAWSの構成図作成を試してみる。
自然言語での指示
テキストで構成を伝えて構成図を描かせるTerraformコードの読み込み
.tfファイルを渡して構成図を自動生成するkiro CLIでの既存リソース解析
kiroのCLIを使って既存AWSリソースのリージョンを解析し、構成図を作成する
環境
VS Code: 1.109.0
GitHub Copilot
Node.js: v22.x
@drawio/mcp: 1.1.0
Terraform: 1.10.x
kiro CLIdraw.io MCPサーバとは
draw.ioの公式MCPサーバで、LLMからdraw.ioの図を作成・表示できるようにするものである。
jgraph/drawio-mcp
https://github.com/jgraph/drawio-mcp@drawio/mcp - npm
https://www.npmjs.com/package/@drawio/mcp
以下の3つのツールが用意されている。
| ツール名 | 説明 |
|---|---|
open_drawio_xml | draw.ioのXMLコンテンツでエディタを開く |
open_drawio_csv | CSVデータを図に変換して開く |
open_drawio_mermaid | Mermaid.js記法の図を変換して開く |
仕組みとしては、MCPサーバがコンテンツ(XML/CSV/Mermaid)を受け取り、pakoで圧縮してbase64エンコードし、draw.ioのURLを生成してブラウザで開くという流れとなる。
MCPサーバのセットアップ
VS Codeでの設定
VS Codeのsettings.json(またはワークスペースの.vscode/mcp.json)に以下を追加する。
{
"mcp": {
"servers": {
"drawio": {
"command": "npx",
"args": ["@drawio/mcp"]
}
}
}
}設定後、MCPサーバがrunningになっていることを確認する。
Claude Desktopでの設定
Claude Desktopを使う場合は、claude_desktop_config.jsonに以下を追加する。
{
"mcpServers": {
"drawio": {
"command": "npx",
"args": ["@drawio/mcp"]
}
}
}実践1: 自然言語の指示で構成図を作成する
まずは、テキストで構成を伝えて構成図を作成できるか試してみる。
以下のようなプロンプトで指示を出す。
open_drawio_xmlを使って、以下のAWS構成図を作成してください。
- VPC (10.0.0.0/16)
- パブリックサブネット x2 (ap-northeast-1a, 1c)
- ALB
- プライベートサブネット x2 (ap-northeast-1a, 1c)
- EC2 x2 (Auto Scaling Group)
- プライベートサブネット x2 (ap-northeast-1a, 1c)
- RDS (Multi-AZ)
- Route 53
- CloudFront
- S3 (静的コンテンツ)LLMがopen_drawio_xmlツールを呼び出し、AWSのアイコンを配置したXMLを生成する。
生成されたURLをブラウザで開くと、draw.ioのエディタ上に構成図が表示される。
結果
指示した通りの構成が描画されるかを確認する。ポイントは以下の通り。
- VPCの中にサブネットが正しくネストされているか
- AZが分かれて配置されているか
- ALB → EC2 → RDSの接続が正しいか
- AWSの公式アイコンが使われている
以下のようになった。
自然言語の指示だけでも、基本的な構成図は生成できる。
ただ、レイアウトの細かい調整や、アイコンの正確性については手動で修正が必要になる場合がある。
実践2: Terraformコードから構成図を作成する
次に、Terraformの.tfファイルを読み込ませて構成図を作成できるか試してみる。
サンプルのTerraformコード
以下のようなmain.tfを用意する。
# VPC
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "main-vpc"
}
}
# Public Subnets
resource "aws_subnet" "public_1a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "public-subnet-1a"
}
}
resource "aws_subnet" "public_1c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.2.0/24"
availability_zone = "ap-northeast-1c"
tags = {
Name = "public-subnet-1c"
}
}
# Private Subnets
resource "aws_subnet" "private_1a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.10.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "private-subnet-1a"
}
}
resource "aws_subnet" "private_1c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.11.0/24"
availability_zone = "ap-northeast-1c"
tags = {
Name = "private-subnet-1c"
}
}
# ALB
resource "aws_lb" "main" {
name = "main-alb"
internal = false
load_balancer_type = "application"
subnets = [aws_subnet.public_1a.id, aws_subnet.public_1c.id]
}
# EC2 Instances
resource "aws_instance" "app_1a" {
ami = "ami-0abcdef1234567890"
instance_type = "t3.medium"
subnet_id = aws_subnet.private_1a.id
tags = {
Name = "app-server-1a"
}
}
resource "aws_instance" "app_1c" {
ami = "ami-0abcdef1234567890"
instance_type = "t3.medium"
subnet_id = aws_subnet.private_1c.id
tags = {
Name = "app-server-1c"
}
}
# RDS
resource "aws_db_instance" "main" {
identifier = "main-db"
engine = "mysql"
engine_version = "8.0"
instance_class = "db.t3.medium"
allocated_storage = 20
multi_az = true
db_subnet_group_name = aws_db_subnet_group.main.name
tags = {
Name = "main-db"
}
}
resource "aws_db_subnet_group" "main" {
name = "main-db-subnet-group"
subnet_ids = [aws_subnet.private_1a.id, aws_subnet.private_1c.id]
}プロンプト
以下のTerraformコードを読み込んで、open_drawio_xmlを使ってAWS構成図を作成してください。
リソース間の依存関係を矢印で表現し、VPCやサブネットは入れ子構造で描いてください。
[main.tfの内容を貼り付け or ファイルパスを指定]結果
Terraformのリソース定義から以下の要素が読み取られ、構成図に反映される。
aws_vpc→ VPCの枠aws_subnet→ サブネットの枠(AZ情報付き)aws_lb→ ALBのアイコンaws_instance→ EC2のアイコンaws_db_instance→ RDSのアイコンmulti_az = true→ Multi-AZ構成の表現- サブネットの紐づけ → 正しいサブネット内にリソースを配置
以下のようになった。
Terraformコードでリソース間の依存関係が明示されているため、自然言語よりも正確な構成図が生成される傾向にある。
ただし、セキュリティグループのルールなど、ネットワーク的なフローまでは自動的に矢印にならないことがあるので、必要に応じて追記する。
実践3: kiro CLIで既存リソースを解析して構成図を作成する
最後に、kiroのCLIを使って既存のAWSリソースを解析し、構成図を作成してみる。
kiroとは
kiroはAWSが提供するAIを活用した開発ツールで、CLIモード(kiro-cli)でも利用できる。
既存AWSアカウントのリソースをスキャンし、構成情報を取得することができる。
手順
1. kiro CLIのセットアップ
kiroのCLIをインストールし、AWSの認証情報を設定する。
# AWSの認証情報が設定済みであること
aws sts get-caller-identity2. 既存リソースの解析
kiro-cliを使って対象リージョンのリソースを解析する。
kiro-cli analyze --region ap-northeast-1これにより、指定リージョンの既存リソース(VPC、サブネット、EC2、RDS、ALBなど)の一覧と依存関係が取得できる。
3. 解析結果をもとに構成図を作成
解析結果をLLMに渡し、draw.ioのMCPサーバで構成図を生成する。
以下のAWSリソースの解析結果をもとに、open_drawio_xmlを使ってAWS構成図を作成してください。
リージョンはap-northeast-1です。結果
既存環境の実際のリソースから構成図を生成できるため、ドキュメントが追いついていない環境の可視化に有用そうだ。
ポイントとしては以下の通り。
- 実際に稼働しているリソースが正確に反映される
- リソース間のネットワーク的な依存関係も含まれる
- タグ情報なども構成図のラベルに活用できる
ただし、リソース数が多い場合は構成図が大きくなるため、サービス単位やVPC単位でフィルタリングして描くのがよいと思われる。
参考
jgraph/drawio-mcp
https://github.com/jgraph/drawio-mcp@drawio/mcp - npm
https://www.npmjs.com/package/@drawio/mcpdraw.io
https://www.draw.io/Terraform Registry - AWS Provider
https://registry.terraform.io/providers/hashicorp/aws/latest
おわりに
draw.ioのMCPサーバを使って、3つのアプローチでAWSの構成図作成を試してみた。
自然言語での指示は手軽だが、正確性にはやや欠ける。
Terraformコードからの生成はリソース定義が明確なため比較的正確な構成図が得られる。kiroのCLIを使った既存リソースの解析は、ドキュメントが追いついていない環境の可視化に特に有効だと感じた。
いずれのアプローチでも、生成後にdraw.io上で微調整は必要になるが、ゼロから手動で構成図を描くよりも大幅に時間を短縮できる。
以前もやってみたが、今度はdraw.ioのMCPサーバを活用することで、よりスムーズに構成図作成ができるようになったと感じた。