普段、手続き型のプログラミング言語に慣れていると、Terraformの記述言語であるHCLにもどかしさを感じることがあります。もっと柔軟にループや条件分岐が書ければと感じるかもしれません。
その書きにくさ、記述力の弱さこそがTerraformの利点だと私は考えています。
宣言型という名のガードレール
HCLは、「どうやるか(How)」を記述する手続き型とは異なり、「どうあるべきか(What)」という最終的な状態を定義する宣言型の言語です。
- 手続き型: 「もしサーバーAがなければ作る。次に、サーバーBを立てる…」
- 宣言型: 「サーバーAとサーバーBが存在している状態が理想」
この宣言型という制約は、意図的に複雑なロジックを書きにくくするガードレールとして機能します。その結果、誰が読んでもインフラの最終形を理解しやすく、意図しない挙動(副作用)が起きにくいコードになるのです。
(というのが理想ですが、往々にして読みにくいコードができあがることはあります)
書きにくいは "複雑すぎる" のサイン
逆説的ですが、Terraformの表現力の制約が、インフラ構成の無秩序な複雑化を防いでいます。
もしあなたのTerraformコードが、複雑なlocal値*1、何重にもネストした三項演算子で埋め尽くされているとしたら、一度立ち止まってみましょう。それはツールの限界ではなく、インフラのアーキテクチャそのものが複雑になりすぎている危険信号かもしれません。
Terraformはその構成は本当に運用できますか?と問いかけてくれる複雑さの検知器となります。
道具の思想を活かすために
もちろん、この恩恵を最大限に受けるには、私たちエンジニアの側にも工夫が必要です。
Terraformは適切なモジュール化やStateの分割といったベストプラクティスと組み合わせることで真価を発揮します。
まとめ
Terraformの絶妙な記述力は、私たちをよりシンプルでメンテナンスしやすいインフラ設計へと導いてくれる優れたガイドです。次に「書きにくい」と感じたときは、ぜひインフラ構成そのものに目を向けるときっと新しい発見があるかもしれません。
*1:local値と組み込み関数を組み合わせると複雑な処理が書けます