Diagramsでインフラ構成図を描いてみた | Dev Driven 開発・デザインチーム Diagramsでインフラ構成図を描いてみた | 働くひとと組織の健康を創る iCARE

BLOG

Diagramsでインフラ構成図を描いてみた

MiyakawaKazuya
2020/06/29

初めまして!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は開発が活発に行われているため、今後ますます便利になっていくことを期待です。