はじめに
前回の入門編では、Kiro CLIとMCP Serverを使ったAWS図の生成を紹介しました。
今回はStrands Agents SDK + Amazon Bedrockを使って、構成図をコード管理する運用フローを作ります。
入門編との違い
| 入門編 | 応用編 | |
|---|---|---|
| ツール | Kiro CLI | Strands Agents SDK |
| 操作 | 対話的(チャット) | プログラム実行 |
| 出力 | 画像のみ | Pythonコード + 画像 |
| 用途 | お試し・単発生成 | 運用・継続的な更新 |
Kiro CLIは手軽に試せて便利なんですが、生成されるのは画像だけなのでコードとして管理できないのが課題でした。今回はPythonコードを生成することで、継続的な更新ができるようにします。
やりたいこと
入門編で生成したこの構成図を、Pythonコードに変換して管理します。
1. 既存の構成図(PNG)をエージェントに渡す
↓
2. エージェントが画像を解析
↓
3. Python Diagramsのコードを生成・保存
↓
4. コードを実行して構成図を出力
【以降の更新】
Pythonコードを編集 → 実行 → 図が更新される
これができると、
- 構成図をコードとして管理できる
- コードを修正すれば図も更新される
- Gitで変更履歴が追える
- PRで構成図のレビューができる
といったメリットがあります。draw.ioとかで作った構成図って、誰かが勝手に編集して壊れたり、どこが変わったかわからなくなったりしがちですよね。コード化しておけばそういった問題を防げます。
前提条件
- Python(今回は3.13.0を使用)
- AWSアカウント
- Bedrockで「Claude Haiku 4.5」などのモデルが有効化済み
環境構築
1. プロジェクト作成
mkdir diagram-agent && cd diagram-agent
python -m venv .venv
source .venv/bin/activate
2. パッケージインストール
pip install strands-agents diagrams
strands-agentsがエージェントのSDK、diagramsが構成図を生成するライブラリです。
3. Graphvizインストール
Python Diagramsが内部で使っているので、これも必要です。
# macOS
brew install graphviz
# Ubuntu
sudo apt-get install graphviz
4. AWS認証設定
Bedrockを使うので、AWS認証を設定しておきます。
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxx
export AWS_DEFAULT_REGION=xxx
プロジェクト構成
最終的にこんな構成になります。
diagram-agent/
├── agent.py # エージェント本体
├── input/
│ └── architecture.png # 変換したい構成図
└── output/
├── diagram_code.py # 生成されるPythonコード ← これが重要!
└── architecture.png # 生成される構成図
output/diagram_code.pyが生成されるのがポイントです。これをGitで管理していくイメージで検証します。
エージェントの作成
agent.py
エージェントのコードは以下のように記載しました。
from pathlib import Path
from strands import Agent
from strands.models import BedrockModel
from strands.types.content import ContentBlock
# Bedrock モデル設定
model = BedrockModel(
model_id="us.anthropic.claude-haiku-4-5-20251001-v1:0",
region_name="us-east-1"
)
# Python Diagramsのコード例
CODE_EXAMPLE = '''
from diagrams import Diagram
from diagrams.aws.compute import Lambda
from diagrams.aws.database import Dynamodb
from diagrams.aws.network import APIGateway
from diagrams.aws.storage import S3
from diagrams.onprem.client import User
with Diagram("Serverless API", filename="output/architecture", show=False):
user = User("Client")
api = APIGateway("API Gateway")
func = Lambda("Lambda")
db = Dynamodb("DynamoDB")
storage = S3("S3")
user >> api >> func >> [db, storage]
'''
SYSTEM_PROMPT = f"""あなたはAWSアーキテクチャとPython Diagramsの専門家です。
構成図の画像を分析し、Python Diagramsライブラリを使った再現コードを生成してください。
## 出力ルール
- Pythonコードのみを出力(説明文は不要)
- コードブロックで囲む
- from diagrams import ... で始める
- 出力ファイル名は "output/architecture" とする(.pngは自動付与される)
- 日本語ラベルは使わず英語で書く
## Python Diagramsの書き方例
{CODE_EXAMPLE}
"""
def main():
image_path = "input/architecture.png"
if not Path(image_path).exists():
print(f"画像が見つかりません: {image_path}")
return
# 出力ディレクトリ作成
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)
# 画像をバイトで読み込み
with open(image_path, "rb") as f:
image_bytes = f.read()
# エージェント定義
agent = Agent(
model=model,
system_prompt=SYSTEM_PROMPT
)
print("構成図を解析中...")
# ContentBlockを使って画像とテキストを渡す
content_blocks = [
ContentBlock(image={"format": "png", "source": {"bytes": image_bytes}}),
ContentBlock(text="この構成図をPython Diagramsのコードに変換してください。")
]
result = agent(content_blocks)
# コードを抽出
result_text = str(result)
if "```python" in result_text:
code = result_text.split("```python")[1].split("```")[0].strip()
elif "```" in result_text:
code = result_text.split("```")[1].split("```")[0].strip()
else:
code = result_text.strip()
# コードを保存
code_path = output_dir / "diagram_code.py"
code_path.write_text(code)
print(f"コード生成完了: {code_path}")
# 生成されたコードを実行
print("構成図を生成中...")
exec(code)
print("構成図生成完了: output/architecture.png")
if __name__ == "__main__":
main()
やってることはシンプルで、
- 画像を読み込んで
- Bedrockのモデルに渡して
- 返ってきたPythonコードを保存・実行
という流れです。ContentBlockを使って画像とテキストを一緒に渡せます。
ちなみにStrands AgentsにはSwarmというマルチエージェント機能もあって、複数のエージェントを連携させて複雑なタスクを処理できます。
例えば「画像解析エージェント → レポート作成エージェント」みたいな連携ができたりします。興味があれば公式ドキュメントを見てみてください。
他にもいろんなサンプルがあるので、参考にどうぞ。
実行
input/ディレクトリに変換したい構成図を置いて実行します。
python agent.py
実行例
構成図を解析中...
コード生成完了: output/diagram_code.py
構成図を生成中...
構成図生成完了: output/architecture.png
生成されたコード
output/diagram_code.pyを見てみると、こんなコードが生成されていました。
from diagrams import Diagram
from diagrams.aws.compute import Lambda
from diagrams.aws.database import Dynamodb
from diagrams.aws.network import APIGateway
from diagrams.aws.storage import S3
from diagrams.onprem.client import User
with Diagram("Serverless API Architecture", filename="output/architecture", show=False):
client = User("Client")
api_gateway = APIGateway("API Gateway")
lambda_func = Lambda("Lambda Function")
dynamodb = Dynamodb("DynamoDB")
s3_bucket = S3("S3 Bucket")
client >> api_gateway >> lambda_func >> [dynamodb, s3_bucket]
ちゃんと元の構成図を解析して、Python Diagramsのコードに変換してくれています。
出力画像
生成された構成図がこちら。
API Gatewayのアイコンが紫色になってますね!!...それはさておき、コードが生成できたので次に修正してみましょう。
コードを修正して図を更新
ここからが本番です。生成されたコードを編集すれば、図も簡単に更新できます。
例:RDSを追加してみる
RDSを追加してみます。変更箇所は3つだけ。
from diagrams import Diagram
from diagrams.aws.compute import Lambda
from diagrams.aws.database import Dynamodb, RDS # RDSを追加
from diagrams.aws.network import APIGateway
from diagrams.aws.storage import S3
from diagrams.onprem.client import User
with Diagram("Serverless API Architecture", filename="output/architecture", show=False):
client = User("Client")
api_gateway = APIGateway("API Gateway")
lambda_func = Lambda("Lambda Function")
dynamodb = Dynamodb("DynamoDB")
rds = RDS("RDS") # 追加
s3_bucket = S3("S3 Bucket")
client >> api_gateway >> lambda_func >> [dynamodb, rds, s3_bucket] # 変更
Gitで差分を確認
コードを修正したら、まずGitで差分を確認してみましょう。
git diff output/diagram_code.py
from diagrams import Diagram
from diagrams.aws.compute import Lambda
-from diagrams.aws.database import Dynamodb
+from diagrams.aws.database import Dynamodb, RDS # RDSを追加
from diagrams.aws.network import APIGateway
from diagrams.aws.storage import S3
from diagrams.onprem.client import User
@@ -10,6 +10,7 @@ with Diagram("Serverless API Architecture", filename="output/architecture", show
api_gateway = APIGateway("API Gateway")
lambda_func = Lambda("Lambda Function")
dynamodb = Dynamodb("DynamoDB")
+ rds = RDS("RDS") # 追加
s3_bucket = S3("S3 Bucket")
- client >> api_gateway >> lambda_func >> [dynamodb, s3_bucket]
+ client >> api_gateway >> lambda_func >> [dynamodb, rds, s3_bucket] # 変更
コードなので、どこが変わったか一目瞭然ですよね。これがコード管理の良いところです。
図を再生成
差分を確認したら、コードを実行して図を更新します。
python output/diagram_code.py
これで更新された構成図が生成されます。
RDSが追加されていますね!
モデルの選択
今回はClaude Haiku 4.5を使いましたが、Claude Sonnetなど他のモデルでも動くと思います。複雑な構成図の場合はSonnetの方が精度が出るかもしれません。
Bedrockで使えるモデルの一覧はこちらを参考にしてください。
発展:CI/CDへの組み込み
GitHub Actionsなどに組み込めば、コードの変更で図を自動生成することもできそうです。
例えば、こんなワークフローが考えられます。
- ブランチを切って
diagram_code.pyを修正 - Pushすると GitHub Actions が発火
-
python diagram_code.pyで図を再生成 - PRを作成してレビュー → マージで反映
これで、コードと一緒に図の変更もレビューできるようになりますね。
まとめ
Strands Agents SDKを使って、構成図をPythonコードに変換するエージェントを作ってみました。
入門編と応用編の使い分け
個人的な所感ですが、ちょっと試したいだけなら入門編のKiro CLIが手軽でいいと思います。継続的に更新したい場合やCI/CDに組み込みたい場合は、今回のようにPythonコードを出力する方が扱いやすいかなと思いました。
| ユースケース | おすすめ |
|---|---|
| ちょっと試したい | 入門編(Kiro CLI) |
| 継続的に更新したい | 応用編(Strands Agents) |
| CI/CDで自動化したい | 応用編(Strands Agents) |
触ってみての感想
入門編ではKiro CLIで画像を生成しましたが、今回のようにPythonコードを出力すれば、以降はコードを編集するだけで図を更新できます。
実際にやってみると、構成図をコードで管理できるのは思った以上に便利でした。「この変更いつ入ったっけ?」がgit logで追えるのは大きいですよね。
構成図の管理に困っている方は、ぜひ試してみてください!


