はじめに
インフラなどの設計を行う際に、構成図を作成する機会があると思います。
構成図は何で作成してますか?
私は Draw.io を使うことが多いのですが、Python で構成図を作図するツール「Diagram-as-code」というものを知りました。
どんな感じか、ちょっと使ってみました。
Diagram-as-code
Diagram-as-code は、Python でインフラ環境などの構成図を作図することができるツールです。
公式サイト:Diagram-as-code GitHub:diagrams
Python で構成要素を定義し、繋いでいく感じで構成図を作図することができます。
主要なクラウドサービスなどのアイコンも使えるので、だいたいの環境はいい感じの見た目で作成できそうです。

インストール
環境
- Ubuntu 24.04.3 on WSL2
Graphviz のインストール
Diagram-as-code は、Graphviz を使用しますので、先にインストールしておきます。
公式ドキュメントに従って、パッケージでサクッとインストールしておきます。
sudo apt update sudo apt install graphviz
Python 環境を作る
Python 環境は、各自のお好みでどうぞ。
いろいろ入れておく
sudo apt install -y build-essential libssl-dev zlib1g-dev libbz2-dev \ libreadline-dev libsqlite3-dev libffi-dev liblzma-dev uuid-dev \ tk-dev libncursesw5-dev xz-utils curl ca-certificates git
pyenv
# pyenv のインストール git clone https://github.com/pyenv/pyenv.git ~/.pyenv # 1) pyenv-virtualenv を導入(pyenv を ~/.pyenv に入れている前提) git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv # 2) シェル初期化設定に追記(bash の例) echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc # 3) シェル再読み込み exec $SHELL
Python を入れる
これを書いている時点の3.12系の最新版を入れる。 ※ Diagram-as-code の要件としては、Python 3.7 以上となっているので、自身の環境に合わせていいバージョンを選んでください。
pyenv install 3.12.11
Diagram-as-code のインストール
仮想環境
pyenv virtualenv 3.12.11 diagrams-env pyenv activate diagrams-env
Diagram-as-code のインストール
pip install diagrams
バージョンアップ
pip install -U diagrams
書いてみる
書き方のサンプルは、公式ドキュメントにいくつかありますので、これを参考に書いてみます。
オブジェクト
Diagram-as-code は必要なオブジェクトをインポートして使用していきます。
どのようなオブジェクトがあるのかは、公式ドキュメントを参照してください。
基本となるオブジェクトについて、簡単に試してみます。
Diagram
1つの Diagram オブジェクトが1つの構成図に紐づきます。
Diagram では、構成図の名前や生成した構成図のファイル名、フォーマットなどを指定することができます。
| オプション | 値 | デフォルト値 | 説明 |
|---|---|---|---|
| filename | 任意の文字列 | - | 出力するファイルのファイル名 |
| outformat | png jpg svg dot |
png | 出力するファイルのフォーマット |
| show | true|false | true | 生成した構成図を自動で表示する設定。 今回の環境だと true にするとエラーになるので、ひとまず false に。 |
シンプルな Diagram のコードはこんな感じ。
from diagrams import Diagram from diagrams.gcp.compute import GCE with Diagram( "Sample Diagram", filename="sample_diagram_01", show=False, ): GCE("host-a") >> GCE("host-b")
このコードから生成される構成図はこんな感じになります。
python sample.py

Cluster
複数のノードをまとめることができます。
インデントを変えることで、Cluster の中に Cluster を入れることもできます。
GCP や AWS、リージョン、AZ などを Cluster で表現する感じです。
from diagrams import Diagram, Cluster from diagrams.gcp.compute import GCE with Diagram( "Sample Diagram", filename="sample_diagram_02", show=False, ): with Cluster("GCP Project"): with Cluster("Region"): with Cluster("AZ1"): gce1 = GCE("host-a") with Cluster("AZ2"): gce2 = GCE("host-b") gce1 >> gce2

Edge
ノードをつなぐ線を定義します。
ラベルを付けたり、スタイルや色を指定したりできます。
| オプション | 値 | デフォルト値 | 説明 |
|---|---|---|---|
| label | 任意の文字列 | - | 線に付けるラベルを指定する。 |
| color | Graphviz の Doc 参照 | black | 線の色を指定する。 |
| style | Graphviz の Doc 参照 | - | 線のスタイルを指定する。 |
from diagrams import Diagram, Cluster, Edge from diagrams.gcp.compute import GCE with Diagram( "Sample Diagram", filename="sample_diagram_03", show=False, ): with Cluster("GCP Project"): with Cluster("Region"): with Cluster("AZ1"): gce1 = GCE("host-a") with Cluster("AZ2"): gce2 = GCE("host-b") gce1 >> Edge(label="Something connection") >> gce2

ノード
GCP の GCE とか、ホストなどを表すものです。
使いたいノードをインポートして、記述していきます。
ここまでのサンプルの2行目に書かれている from diagrams.gcp.compute import GCE は、GCP の GCE をインポートしています。
GCP として定義されているノードはこちらのドキュメントに書かれています。
複数のノードをインポートしたい場合は、以下のように書くことができます。
from diagrams.gcp.compute import GCE from diagrams.gcp.database import SQL
同じカテゴリ(compute)から複数インポートする場合は、こんな感じで書けます。
from diagrams.gcp.compute import GCE, GAE, GKE, Run
いくつかのノードを書いてみます。
from diagrams import Diagram, Cluster, Edge from diagrams.gcp.network import LoadBalancing from diagrams.gcp.compute import GCE from diagrams.gcp.database import SQL with Diagram( "Sample Diagram", filename="sample_diagram_04", show=False, ): with Cluster("GCP Project"): alb = LoadBalancing("Application Load Balancer") with Cluster("Region"): with Cluster("AZ1"): gce1 = GCE("host-a") with Cluster("AZ2"): gce2 = GCE("host-b") db1 = SQL("Cloud SQL") alb >> gce1 >> db1 alb >> gce2 >> db1

まとめ
構成図をコード管理できるのは便利かなと思いました。
ただ、大規模な構成図を描くとなると Draw.io を使うほうが使い勝手はよいのかなと感じます。
Diagram-as-code に慣れてくるとサクサク描けるようになるのかもしれないので、しばらく継続して使ってみようと思います。