🦔

Pythonでシステム構成図を自動生成する — Diagrams入門

に公開

はじめに

システム構成図を PowerPoint や Visio で手作業で描いていませんか?
構成が変わるたびに修正が必要になり、図の更新が追いつかないことも多いと思います。

そんなときに役立つのが Python 製のライブラリ「Diagrams」 です。
コードで構成図を定義すれば、変更点の反映や再利用が簡単になり、
常に最新の構成図を自動で生成できるようになります。

この記事では、Python の Diagrams を使って
手作業の構成図作成を自動化する方法 を紹介します。

セットアップ

この記事では、Google Colab 上で Diagrams を動かすことを前提に進めます。
ローカル環境でも同じ手順で構いませんが、Colab ならインストールと実行が手軽です。

1. ライブラリのインストール

まず、Diagramsをインストールします。
Colab のセルに以下を入力して実行してください。

!pip install diagrams

2. Google ドライブをマウント(任意)

Google ドライブに構成図を保存したい場合は、以下のコードを実行してマウントします。

from google.colab import drive
drive.mount('/content/drive')

Diagramsとは

Diagrams は Python で書ける構成図作成ライブラリです。
コードで構成を定義できるため、構成変更があっても自動で最新の図を生成できます。

Diagrams

Diagrams では、AWS や GCP、オンプレのサーバなどを簡単に図として表現できます。
Diagrams 自体は「描画キャンバス」の役割を持ち、そこにノード(Node)を配置し、エッジ(Edge)で接続することで構成図を作成できます。

Cluster

Cluster を使うと、サーバやサービスをグループ化して階層構造を表現できます。
例えば、同じ VPC 内の複数サーバをまとめるときに便利です。

from diagrams import Diagram, Cluster
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS

with Diagram("Cluster Example", show=False):
    with Cluster("VPC"):
        web = EC2("web")
        db = RDS("db")
        web >> db

Node

Node は構成図上の各要素(サーバ、データベース、サービスなど)を指します。
Node は必ず Diagram 内で定義します。

from diagrams.aws.compute import EC2
web = EC2("web-server")

Edge

Edge はノード同士の接続を表します。
>>」または「<<」演算子で向きを指定できます。

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS

with Diagram("Edge Example", show=False):
    EC2("web") >> RDS("db")

プロンプトを作る

Diagrams を使った構成図作成は Python のコードで行いますがコードを書くのは手間がかかります。
そこで、DiagramsのPythonコードを生成するにプロンプトを作成しました。
以下プロンプトを編集して使います。

diagrams用のPythonコードを自動生成して出力してください

出力設定:
title:RPA Structure
outformat:png
filename:ファイルパス
show:True

描画設定:
以下条件で作成してください。()は表示名
Cluster("Client")
 {
 ・OnPrem.client Users("user")
 ・Custom[/content/drive/MyDrive/Custom/SH.png]("SharePoint")
 }

Cluster("Automation Gateway")
 {
 ・Custom[/content/drive/MyDrive/Custom/PA.jpg]("PowerAutomate")
 }

Cluster("UiPath\nExecutionLayer")
 {
 ・Custom[/content/drive/MyDrive/Custom/Uipath.png]("UiPath\nOrchestrator")
 ・Custom[/content/drive/MyDrive/Custom/robot.png]("Robot")
 }

Cluster("PowerAutomate\nExecutionLayer")
 {
 ・Custom[/content/drive/MyDrive/Custom/PA.jpg]("PowerAutomate\nFrow")
 }


接続線の設定:
結合は線のみ
繋ぐは矢印
()内は線のLavel,色,style
・userからSharePointを結合(SelectFlow,赤,点線)
・SharePointからPowerAutomateを繋ぐ(id,赤,実線)
・PowerAutomateからUiPath Orchestratorを繋ぐ(APICall,赤,実線)
・UiPath OrchestratorからRobotを繋ぐ(start,赤,実線)
・PowerAutomateからPowerAutomate\nFrowを繋ぐ(start,赤,実線)

python--------------------------------------------------------
■留意事項
1.importするものは描画内容に記載のものと一致させること
2.pythonコードは以下の構成を変えずに#codeを変更すること
3.末尾のdiを必ず入れること
4.インデントは以下のように記述すること
  -With Cluster()の左はスペース2個分

with Diagram() as di:
  #code
di
--------------------------------------------------------------
コードを生成する前に留意事項4点を確認すること

出力設定

■title
システム構成図の下に表示されるタイトルです。
■outformat
png, jpg, svg, pdfのいずれかを指定します。
■filename
ファイルパスを指定してください。
■show
trueにするとcolab上で表示されます。

描画設定

Cluster("Client")
 {
 ・OnPrem.client Users("user")
 }

Clusterとその中に入れるNodeを記述してください。
Nodeの記述方法
1.既存Node

  Node名(表示名)

※Node一覧は以下参照
https://qiita.com/lunar_sword3/items/6a488b4b65ea65be8fb8

2.カスタムNode
 Customノードを使う場合はアイコンを指定の場所に保存し、以下書式で入力してください。

 Custom[アンコンのパス](表示名)

接続線の設定

どのNodeからどのNodeに繋ぐかを指定します。

・userからSharePointを結合(SelectFlow,赤,点線)

以下書式で入力してください

・{(1)}から{(2)}を{(3)}((4))

(1)From:表示名で記載
(2)To:表示名で記載
(3)結合 or 繋ぐ
 ※結合は線、繋ぐは矢印
(4)接続線のLaval,色、線をカンマ区切りで記載

構成図を作る

作成したプロンプトをChatGPTに張り付け

ChatGPTが自動生成したPythonコード

from diagrams import Diagram, Cluster, Edge
from diagrams.onprem.client import Users
from diagrams.custom import Custom

with Diagram("RPA Structure",outformat="png",filename="/content/drive/MyDrive/Output/rpa.png",show=True, direction="LR") as di:

  with Cluster("Client"):
    user = Users("user")
    sharepoint = Custom("SharePoint", "/content/drive/MyDrive/Custom/SH.png")

  with Cluster("Automation Gateway"):
    powerautomate = Custom("PowerAutomate", "/content/drive/MyDrive/Custom/PA.jpg")

  with Cluster("UiPath\nExecutionLayer"):
    orchestrator = Custom("UiPath\nOrchestrator", "/content/drive/MyDrive/Custom/Uipath.png")
    robot = Custom("Robot", "/content/drive/MyDrive/Custom/robot.png")

  with Cluster("PowerAutomate\nExecutionLayer"):
    paflow = Custom("PowerAutomate\nFrow", "/content/drive/MyDrive/Custom/PA.jpg")

  # 接続線設定
  user - Edge(label="SelectFlow", color="red", style="dotted") - sharepoint
  sharepoint >> Edge(label="id", color="red", style="solid") >> powerautomate
  powerautomate >> Edge(label="APICall", color="red", style="solid") >> orchestrator
  orchestrator >> Edge(label="start", color="red", style="solid") >> robot
  powerautomate >> Edge(label="start", color="red", style="solid") >> paflow

di

これをGoogleColabに張り付けて実行すると図が生成される

注意点

ChatGPTが出力するコードのインデントがおかしい場合がある。
with Clusterのインデントが下がっていない場合は以下のように修正すること

with Diagram()
 with Cluster()

Discussion