【Anaconda×Diagrams】Python で構成図を描いてみた

はじめに

お久しぶりです。
そろそろ二年目が終わることに焦りを感じているシステムソリューション部のミコトです。

Ansible や Terraform など、IaC を自在に使えたらとても強いんだろうなぁと思う反面、Python に苦手意識があるためあんまり遊べていない今日この頃。

学生時代、Unity(C#)をちょっと触っていた程度だったのに調子に乗り、 1ミリもわからない Anaconda で Allosaurus(音声ファイルを音素に変換するやつ) なるものを動かそうとして見事に挫折し、そこから Python が嫌いになってしまいました。
今回はそんなトラウマを克服すべく、因縁の相手 Anaconda でインフラエンジニアらしく構成図をコードで生成してみようと思います。

 

実行環境について

Ubuntu 22.04 (Vagrant)
conda 25.11.1
Python 3.10

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-22.04"
  config.vm.network "private_network", ip: "192.168.55.15"
  config.vm.network "forwarded_port", guest: 8888, host: 8888 # Jupyter用

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "4096"
  end
end

(⌒3⌒)<Vagrant up の時点で Anaconda の環境構築させたらいいじゃん
今回は Anaconda のトラウマ克服が目的なので、わざわざインストールから手動でやって差し上げています。

※筆者はやればやるほど venv で良くね?と思っています。Anaconda はあくまで嫌いのままでいたくないと思って使っているだけなので、ぜひ venv をご利用ください。

 

仮想環境の構築

Anaconda のセットアップ

まずは最新バージョンの Anaconda のインストーラーをダウンロードしていきます。
※当時の最新バージョンです

$ wget https://repo.anaconda.com/archive/Anaconda3-2025.12-2-Linux-x86_64.sh

ダウンロードした Anaconda のインストーラを実行すると、インストールが始まります。
今回は conda-test というテストユーザーのホームディレクトリに anaconda3 を展開しています。

$ sh Anaconda3-2025.12-2-Linux-x86_64.sh

 

------省略--------

Anaconda3 will now be installed into this location:
/home/conda-test/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/conda-test/anaconda3] >>>
PREFIX=/home/conda-test/anaconda3

------省略--------

To install conda's shell functions for easier access, first activate, then:

conda init

Thank you for installing Anaconda3!

インストールが完了しました!
英語の指示でもある通り、インストール直後に以下を実行して anaconda を使えるようにしましょう。

conda init

設定の反映をするために、再読み込みをします。
この時点で anaconda 環境の中に移動します。

source ~/.bashrc
(base) conda-test@vagrant:~$

パスを通したら、のバージョンを確認してみましょう。

$ conda --version
conda 25.11.1

ちなみに、Anaconda のインストールが終了した時点で、Python も入ってくれているのでとっても便利ですね!

/home/conda-test/anaconda3/bin/python
Python 3.13.9

さらに、入れた時点で以下のような有名どころのライブラリがそろった状態になります。
わざわざ pip install で一個一個入れなくていいというわけです。
(今回使う Diagrams は入ってないんですけどね)
・Pandas
・NumPy
・Matplotlib
・Seaborn
・Jupyter

欲しいライブラリがあるかどうかは、コマンドラインからでも確認できます。
(⌒3⌒)<何が何だかわからんけどいっぱいあってすごいなー

$ conda list

 

Graphviz のインストール

Graphviz とは、DOT言語というデータ記述言語を使ったグラフ作成ツールです。

今回構成図を作るためのライブラリ Diagrams は、ローカル環境で動作させる場合 Graphviz が必須となっているため、インストールしていきます。

$ sudo apt install graphviz

インストールしたら、バージョンと実態の場所を確認しましょう。

$ dot -V
dot - graphviz version 2.43.0 (0)
$ which dot
/usr/bin/dot

 

仮想環境のセットアップ

次は Diagram のインストール。ではなく、仮想環境をセットアップしていきます。
私は Python 初心者で、ライブラリの依存関係で散々怒られてきた経験がある(ドヤ顔)ため、壊れたらいつでも捨てられるように仮想環境にライブラリを入れていくことにします。

Anaconda で仮想環境を作るには、以下のコマンドを使います。
今回は構成図を書くぞ!ってことで、draw-env という名前にしてみました。

$ conda create -n draw-env python=3.10

デフォルトでは仮想環境は停止しているため、起動します。
これで仮想環境の準備は整いました!
ここからは、draw-env 上で準備・開発を進めていきます。

$ conda activate draw-env
(draw-env) conda-test@vagrant:~$

この時私は思いました。
(⌒3⌒)<え、venvに似てね?
...と、一瞬よぎりましたが、何よりトラウマ克服が目的なので、これでいいんです。

 

Diagrams のインストール

いよいよここで本題である Diagrams をインストールしていきます。
前述したとおり、Anaconda をインストールするだけでは使えないものになるため、追加で入れる必要があります。

$ pip install diagrams

diagrams のインストールは作った draw-env 内でインストールします。
ここまで来たら、いよいよ構成図描画のコーディングに入ります!

 

構成図を描画する

ここからようやく構成図の描画に移ります。
今まで VS code の draw.io でちまちま描いていたあの時とはもうおさらば...したいですね。

ドキュメントを確認した限りでは、有名どころのアイコンは一式使えそうな感じがします。

Diagrams currently supports main major providers including: AWSAzureGCPKubernetesAlibaba CloudOracle Cloud etc... It also supports On-Premises nodes, SaaS and major Programming frameworks and languages.

 

python ファイルを作成してみる

今回目標にしているのは、以下のような構成です。
(今回のために、drawio で描画しました;;)

個人的にターミナルでコードを書くのは難しいので、Python ファイルは VS Code で作成しています。

from diagrams import Cluster, Diagram, Edge
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import VPC, PrivateSubnet, PublicSubnet, CF, ELB
from diagrams.aws.security import WAF
from diagrams.aws.storage import S3
from diagrams.aws.general import Users, Client

with Diagram("", direction="LR", show=False) as diag:

    # 1. ユーザー層
    user = Users("Users")
    client = Client("Clients")

    # 2. 外部サービス層
    s3 = S3("S3")
    with Cluster("", graph_attr={"style":"none", "penwidth":"0"}):
        waf = WAF("WAF")
        cf = CF("CloudFront")
        waf - cf

    # 3. ネットワーク層(VPC)
    with Cluster("VPC"):
        with Cluster("Public Subnet"):
            lb = ELB("ALB")
            bastion = EC2("EC2(Bastion)")

        with Cluster("Private Subnet"):
            webs = [EC2("EC2"),
                    EC2("EC2")]
            db_primary = RDS("Writer")
            db_replica = RDS("Reader")
            db_primary - Edge(style="dashed") - db_replica

    # 4. 経路の定義
    user >> cf >> lb >> webs >> db_primary
    client >> bastion >> webs
    webs >> s3

 

実行してみる

実行はいたって簡単です。
python で作成したファイルを実行するだけ!

python draw-test.py

果たして結果は。。。

drwxrwxr-x 2 conda-test conda-test   4096 Feb 21 11:55 ./
drwxr-x--- 9 conda-test conda-test   4096 Feb 21 11:55 ../
-rw-rw-r-- 1 conda-test conda-test   1440 Feb 21 11:55 draw-test.py
-rw-rw-r-- 1 conda-test conda-test 132253 Feb 21 11:55 web_services.png

おお、画像ファイルができてる!
ということでダウンロードしてみてみると。。

お、おお~~、ちゃんと並んどる!!!🎉🎉🎉
縦(TB)だと長くなりすぎたので、横(LR)に変更してスッキリさせました。
(⌒3⌒)<(ただちょっと矢印が乱立してて見にくいかも)

 

Python ファイルの書き方

ここからはおまけ程度なのでいらない方は飛ばしていただければと思うのですが、自分用もかねて簡単に中身の解説をしていきます。

ここはわかりやすいと思うのですが、以下が AWS のアイコンを持ってくる処理が以下になります。
インポートしてくる各リソースの書き方はドキュメントに記載がありますので、ご参考までに。

from diagrams import Cluster, Diagram, Edge
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import VPC, PrivateSubnet, PublicSubnet, CF, ELB
from diagrams.aws.security import WAF
from diagrams.aws.storage import S3
from diagrams.aws.general import Users, Client

ユーザー層は VPC や Subnet 等の枠内に入れないリソースを記述しています。この場合は Cluster で囲う必要はなく、単体で記述できます。

    # 1. ユーザー層
    user = Users("Users")
    client = Client("Clients")

外部サービス層・ネットワーク層の記述ですが、わかりやすいように枠を作ってその中に収めたい場合、Cluster というクラスの中に内側にあるリソースを記述しています。
※Cluster にも名前を付けることができ、表示・非表示の設定が別途可能です。
※非表示にする場合は、引数を空にします。

    # 2. 外部サービス層
    s3 = S3("S3")
    with Cluster("", graph_attr={"style":"none", "penwidth":"0"}):
        waf = WAF("WAF")
        cf = CF("CloudFront")
        waf - cf

各リソースの記述です。
並列して描かせたい場合は [] の配列を使って並べます。
Edge を使うことで、線の見た目を変えることができます。

        with Cluster("Private Subnet"):
            webs = [EC2("EC2"),
                    EC2("EC2")]
            db_primary = RDS("Writer")
            db_replica = RDS("Reader")
            db_primary - Edge(style="dashed") - db_replica

最後に経路部分です。
">>" で向き先を指定していきます。ここはわかりやすいですね!
S3 を CloudFront から直接配信する構成なら、cf >> s3 と書くだけで配置が変わります。

    # 4. 経路の定義
    user >> cf >> lb >> webs >> db_primary
    client >> bastion >> webs
    webs >> s3

 

最後に

いかがでしたでしょうか。
今回は Anaconda のトラウマ克服のために仮想環境を建てて構成図を生成してみました。

実際エンジニアとして働き始めてから使ってみると、案外苦戦することなく実行環境の設定から実行まで行けたかな、と思います。

次回は Anaconda をもっと有用に使えるように勉強してみようと思います!
それでは!!!!

 

参考

https://qiita.com/sakai_noriko/items/53d65f3177b891f6cfcc
https://qiita.com/lighlighlighlighlight/items/8f624751df808d89d48c
https://dev.classmethod.jp/articles/graphviz-beginner/
https://qiita.com/hiesiea/items/860c42a96b031f929b94
https://dev.classmethod.jp/articles/diagrams-introduction/

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
6
X facebook はてなブックマーク pocket

この記事をかいた人

About the author

ミコト

文系学部から2024年4月に入社したインフラエンジニアです。
ニックネームは思いつかなかったので母がよく使っているものにしました。
ハシビロコウってかわいいよね。