Terraform graph を少し見やすく画像化してみました

とりあえず結論を先に書いてしまうと、四角い箱で表現されてしまうノードを画像で置き換える、Graphvizdot コマンドを置き換える形で使用可能なコマンドを作りました。

github.com

実行結果の例

terraform graph | tfdot -ograph.png

f:id:semnil:20200704062738p:plain

作るまでの経緯

  1. terraform graph の結果そのままを図にしたものが難解
    かなり無機質な感じで箱と矢印が配置される事になるので、あまり理解しやすい雰囲気になりません。正直見辛いです。draw.io とかで書き直して欲しくなります。
    f:id:semnil:20200704062256p:plain

  2. Python のコードから良い感じの画像を作れる Diagrams と言うものがあるらしい
    複数の方から教えていただいて、存在はちょっと前から知ってはいましたが使う機会はありませんでした。
    dev.classmethod.jp

  3. 1 から 2 へうまく変換できたらいけるかも・・・

発生した課題

何をどう変換すれば良いかわからない

terraform graphDiagrams の仕掛けも何もわからないところからだったので、出力をファイルに吐き出しながら探っていく事にしました。最終的には下記のことが分かったので、Python で Diagrams を利用するコマンド (パッケージ) を作る事にしました。

最終的に画像を作るのは Graphviz

過去にどこかでお世話になった方も多いのではないでしょうか。
terraform graph コマンドも Diagrams も、画像を生成するため最終的に使っているのは Graphviz でした。

graphviz.org

どちらも中間ファイルとして DOT 言語 で書かれたファイル (以下 dot ファイル) を吐き出しているので、その中身を良い感じに変換してやれば良い事になります。

dot ファイルを取り込んで編集する手段がよく分からない

良い感じに変換できそうなのですが、Graphviz に含まれているインターフェースでは dot ファイルを読み込んだ後に編集する機能がありませんでした。
とりあえずこのプランの実現性を測るため、dot ファイルを sed とか awk を使って荒っぽくこねるシェルスクリプトを書いてお茶を濁しつつ、下記のライブラリにたどり着きました。

github.com ja.stackoverflow.com

Python のパッケージを作ったことがない

これは歴史的な事情が積み重なって、現時点でのベストプラクティスを探すのに大変苦労しました。
おそらく Portey を使っておくと全体的に楽なのではないかと言う印象です。下記のページが大変参考になりました。ありがとうございます。

kk6.hateblo.jp

CLI 対応のために argparse を使ったのは失敗でした・・・。python-fire を使っておけば良かったと大変後悔しています。

qiita.com

CI への組み込み

前々から GitHub Actions を使いたかったので今回使ってみようと思ったのがさらに時間を消費する原因になりましたが、terraform と今回作ったコマンドをセットにしてコンテナにまとめました。

hub.docker.com

フォントがインストールされていなくて、出力された画像内の文字が豆腐になってがっかりしたりもしました。

qiita.com

CircleCI とかもそうですけどなんと言うか地味で上手く行った後も喜びがそこまで大きくないので辛いですね。

今後について

とりあえず AWS の一部リソースにしか対応できていないですが、他のリソースもマッピングを追加すれば使えるようになります。・・・が、そう言う方向性で良いのか悩みます (大変面倒で正直やりたくありません)。
おそらく Diagrams にコミットしていくのが一番近道なのだと思います。
実際これに関する issue はかなり前から存在するようです。
Diagrams に追加のリソースアイコンをコミットしつつ、マージの可能性を探っていくのが良いとは思うのですが。