Lapis Lazuli

technical blog for web developer

terraformのベストプラクティスとは

terraformは手軽にファイルに書いて実行できますが、しばらくするとある事で悩む事になります。
それは・・・terraform自体の構成をどうするかという事です。

最初は同じファイルにどんどんリソースを定義していくと思います。それで数が増えたら種類毎にファイルを分けたりとか。
しかしこの方法だと同じディレクトリに全てのリソースが存在することになり、planするだけで全読み込みは結構無駄な感じがしてきます。
そこでディレクトリ構成をどうにかしようと思うのですが、私はどうすればいいのかが中々見つからずに頭を悩ませました。
なので今回はベストプラクティスは何か。について書いていきます。

環境が分けられている場合

最もやりやすいのがインフラ環境が分けられている場合です。
これはworkspaceを使って開発と本番環境を切り離すことで、同じ構成を別環境に構築できるので、開発→本番のフローで構成が異なる可能性がなくなります。
ただ、それぞれの環境で独自に定義したい場合は各workspaceにそれぞれリソースを定義していく必要があるので、多いとやや面倒です。

共通で利用したいリソース

モジュール機能を使う事でディレクトリ外のtfファイルを読み込み共通化して利用することができます。
これはworkspaceと違って汎用化できることが可能なので、使えるシチュエーションは多いと思います。
複数のtfファイルを管理する場合、例えばEC2だったらインスタンスタイプだけを変えたいときがあると思いますが、リソースの定義だけをしておいて、variablesなどで差異を吸収するという形で使う事でできます。

ただこれもモジュールのアンチパターンがあるので適当に定義するとあとから痛い目にあいます(経験談
一つのリソースだけを定義したモジュールを作るのは最もたる例です。
単一モジュールだと、リソースが増えるにしたがってモジュールが増えていきますし、それだけ汎用性を失っていくことになります。
どこまで汎用化するのは中々難しいところがありますが、この辺りは運用しながら見極めていくしかありません。
インフラがスケールするに従って定義していく形になると思います。


今回はterraformのベストプラクティスについて考えてみました。
まだまだ使い始めて日が浅いので、どういうのが効率的かつスケーラブルなのかを日々考えていきたいと思います。