Diagram-as-code で Google Cloud の構成図を作図する

はじめに

インフラなどの設計を行う際に、構成図を作成する機会があると思います。

構成図は何で作成してますか?
私は Draw.io を使うことが多いのですが、Python で構成図を作図するツール「Diagram-as-code」というものを知りました。
どんな感じか、ちょっと使ってみました。

Diagram-as-code

Diagram-as-code は、Python でインフラ環境などの構成図を作図することができるツールです。

公式サイト:Diagram-as-code GitHubdiagrams

Python で構成要素を定義し、繋いでいく感じで構成図を作図することができます。
主要なクラウドサービスなどのアイコンも使えるので、だいたいの環境はいい感じの見た目で作成できそうです。

インストール

環境

Graphviz のインストール

Diagram-as-code は、Graphviz を使用しますので、先にインストールしておきます。

Graphviz Download

公式ドキュメントに従って、パッケージでサクッとインストールしておきます。

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
pdf
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 を入れることもできます。

GCPAWS、リージョン、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 に慣れてくるとサクサク描けるようになるのかもしれないので、しばらく継続して使ってみようと思います。