Diagramsでインフラ構成図を描いてみた
初めまして!5月からiCAREに入社したずやです。
現在社内で唯一のインフラエンジニアとして働いています。
みなさん、インフラ構成図描いていますか!?(唐突)
昨今ではCacooやdraw.ioなど、構成図を描くのに便利な作図ツールがいくつも存在しています。
今回は、その中の一つであるDiagramsというOSSを紹介したいと思います。
Diagramsとは
DiagramsはPythonのコードでインフラ構成図を作成することができるOSSです。
https://diagrams.mingrammer.com/
AWS、GCP、Azureといった主要なクラウドサービスから、各種DB、CI、モニタリングツールなど幅広いタイプのノードをサポートしています。
https://diagrams.mingrammer.com/docs/nodes/onprem
使ってみる
環境
Diagramsを利用するには下記環境が必要です。
- Python 3.6以上
- Graphviz
ローカルPCに上記ツールをインストールしてもよいですが、今回はDockerで環境を構築したいと思います。
Dockerイメージの作成
まずはDockerfileを作成します。
Diagrams実行に必要な環境に加え、グラフ内で日本語文字を使えるようにNotoSansフォントを追加しています。
このDockerfileを元にDockerイメージを作成します。
docker build -t diagrams .
今回、diagrams
という名前でイメージを作成しました。
Pythonスクリプトの作成
次に、メインとなるPythonのスクリプトコードを用意します。
Dockerfileがあるディレクトリにapp
ディレクトリを作成し、diagrams.py
という名前でファイルを作成します。
以下、サンプルコードです。
実行
最後に、作成したPythonスクリプトを実行して構成図を作成します。
docker run --rm -v `pwd`/app:/app diagrams diagram.py
実行完了後、app
ディレクトリ内にシステム構成図.png
というファイルが作成されています。
スクリプトの書き方
基本的には必要なノードを定義して各ノード間をエッジ(辺)で繋いでいきます。
エッジは、>>
と<<
で有向の、-
で無向のものを描くことができます。
ec2 = EC2()
User() >> ec2
ec2 - S3()
リストを使うことで、ノードをひとまとめにして扱うこともできます。
ELB() >> [EC2(), EC2(), EC2()]
また、diagrams.Cluster
を使えば複数のノードをグルーピングすることができます。
with Cluster("DB Cluster"):
rds_primary = RDS("primary")
rds_secondary = RDS("secondary")
これらのコンポーネントは、diagrams.Diagram
オブジェクト内に生成していきます。
diagrams.Diagram
のコンストラクタにパラメータを渡すことで、構成図の設定を変更することができます。
設定できるパラメータには以下のようなものがあります。
- name: 図のタイトル。
- outformat: 出力ファイルのフォーマット(png, jpg, svg, pdf)。デフォルトはpng。
- filename: 出力ファイルの名前。指定しないとnameの値を元に自動で決まる。
- show: 生成したファイルを自動的に開くかどうか。デフォルトはtrue。
- direction: データフローの方向(TB, BT, LR, RL)。デフォルトはLR。
- curvestyle: エッジを直線と曲線どちらで描くか(ortho, curved)。デフォルトはortho。
- graph_attr, node_attr, edge_attr: Graphvizの設定で図をより詳細にカスタム可能(参考)
おわりに
今回はPythonで構成図を作成できるDiagramsを紹介しました。
使ってみた感想ですが、やはりコードベースで図を描けるというのは非常に便利で、コンポーネントの追加や複製、修正もコードを少し変更するだけで可能なので作図作業がとても楽になります。gitでバージョン管理する場合、コードなので変更点が追いやすいという点も魅力的です。
その反面、ノードの配置や細かいスタイリングなどは融通が効かず、システム規模が大きくなるほど図の出来上がりがイマイチになってしまう傾向がありました。
現実的には、プロダクト開発初期はシステム構成の変更に併せてDiagramsで頻繁に構成図のアップデートを行い、構成が固まって落ち着いた頃にCacoo等で清書するというような使い方がベターかなと思っています。
とはいえDiagramsは開発が活発に行われているため、今後ますます便利になっていくことを期待です。