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

Strands Agents × Bedrockで構成図(PNG)をPythonコード化してGit管理する

Last updated at Posted at 2025-12-20

はじめに

前回の入門編では、Kiro CLIとMCP Serverを使ったAWS図の生成を紹介しました。

今回はStrands Agents SDK + Amazon Bedrockを使って、構成図をコード管理する運用フローを作ります。

入門編との違い

入門編 応用編
ツール Kiro CLI Strands Agents SDK
操作 対話的(チャット) プログラム実行
出力 画像のみ Pythonコード + 画像
用途 お試し・単発生成 運用・継続的な更新

Kiro CLIは手軽に試せて便利なんですが、生成されるのは画像だけなのでコードとして管理できないのが課題でした。今回はPythonコードを生成することで、継続的な更新ができるようにします。

やりたいこと

入門編で生成したこの構成図を、Pythonコードに変換して管理します。

image.png

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()

やってることはシンプルで、

  1. 画像を読み込んで
  2. Bedrockのモデルに渡して
  3. 返ってきた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のコードに変換してくれています。

出力画像

生成された構成図がこちら。

image.png

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

これで更新された構成図が生成されます。

image.png

RDSが追加されていますね!

モデルの選択

今回はClaude Haiku 4.5を使いましたが、Claude Sonnetなど他のモデルでも動くと思います。複雑な構成図の場合はSonnetの方が精度が出るかもしれません。

Bedrockで使えるモデルの一覧はこちらを参考にしてください。

発展:CI/CDへの組み込み

GitHub Actionsなどに組み込めば、コードの変更で図を自動生成することもできそうです。

例えば、こんなワークフローが考えられます。

  1. ブランチを切って diagram_code.py を修正
  2. Pushすると GitHub Actions が発火
  3. python diagram_code.py で図を再生成
  4. PRを作成してレビュー → マージで反映

これで、コードと一緒に図の変更もレビューできるようになりますね。

まとめ

Strands Agents SDKを使って、構成図をPythonコードに変換するエージェントを作ってみました。

入門編と応用編の使い分け

個人的な所感ですが、ちょっと試したいだけなら入門編のKiro CLIが手軽でいいと思います。継続的に更新したい場合やCI/CDに組み込みたい場合は、今回のようにPythonコードを出力する方が扱いやすいかなと思いました。

ユースケース おすすめ
ちょっと試したい 入門編(Kiro CLI)
継続的に更新したい 応用編(Strands Agents)
CI/CDで自動化したい 応用編(Strands Agents)

触ってみての感想

入門編ではKiro CLIで画像を生成しましたが、今回のようにPythonコードを出力すれば、以降はコードを編集するだけで図を更新できます。

実際にやってみると、構成図をコードで管理できるのは思った以上に便利でした。「この変更いつ入ったっけ?」がgit logで追えるのは大きいですよね。

構成図の管理に困っている方は、ぜひ試してみてください!

参考リンク

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