Terraform v0.12

まったくどこも話題にしていないっぽいので、ひとまず記事として挙げておこうと思う。

Terraformは0.11でそこそこ大がかりな変更を加え(プラグインの分離とかですね)、しばらく静かでしたが、v0.12のプレビューを出したのが昨年。そして現在は5月に0.12が、そして6月に0.12.1がリリースされている状態です。
またあの毎日がアップデートの日々が帰ってきやがった!

あちらこちらで見かける記事は、v0.11、あるいはそれ以前の記述が多いのですが、v0.12ではさらに大きな変更が入っています。

特に僕が気になっているのはforステートメントの導入。multiplesな不定数エンティティを一つのリソースの中で繰り返し記述しなければならないケースが増え、モジュールの記述も難しくなり、どうしてもリテラルに書かざるを得なくなっていたtfファイルですが、ついにforステートメントが導入されました。
ついでにDynamicブロックも。

しかも、いままではmoduleに対してcountを用いた条件分岐を適用することはできませんでした。

こちらのissueは構造的に難しい、と回答されていて、リクエストも閉じてしまっていたので期待していなかったのですが、

For a long time, users have wished to be able to use the count meta-argument within module blocks, allowing multiple instances of the same module to be created more easily.

Again, we have been laying the groundwork for this during Terraform 0.12 development and expect to complete this work in a later release. Along with count, module blocks will also accept the new for_each argument described for resources above, with similar results.

This feature is particularly complicated to implement within Terraform’s existing architecture, so some more work will certainly be required before we can support this. To avoid further breaking changes in later releases, 0.12 will reserve the module input variable names count and for_each in preparation for the completion of this feature.

と、あり、対応の姿勢を見せています。つまりv 0.12のどこかでmoduleがforやcountで呼び出せるようになるのです!(希望)
moduleがcountで呼んだり呼ばなかったり、複数回ループで呼び出せたりなんて、素敵です。幸せです。たまんないです。

ついでだからもういい加減countステートメントの代わりにifステートメント導入してください!w
いつまで三項演算子でやらないといけないのか…w

これは汎用型のTerraform基礎ブロックを作るのに驚くほど効果的なものです。

書式にいろいろ変更も入っているので、ひとまずパッケージを適当に持ってきて、terraform v0.12upgradeをソースコードにかけておく方がよいでしょう。
variableブロックのdefaultの記述がdefault {を許容しなくなり、=が必要になってたり、mapのkeyにperiodなどがある場合は””でくくってあげないと行けなかったり、いろいろと注意されることも増えています。

が、やはりforブロックの魅力には勝てません。配列の掛け算ができるsetproductなど、魅力的な関数も増えており、夢が膨らみます。そろそろTerraformのフレームワークができてきてもおかしくないんじゃないだろうか。どこかにプロジェクトでもあったりするのでしょうか。あるなら参加したいものです。

このほかには、variableを[“${var.list}”]などと書かなくてよくなり、いきなりvar.list(${}すら要らない)で渡せたり、コードは大幅に修正が必要になっています。まあ、0.12upgradeサブコマンドがある程度やってくれるようなので、そちらに大半はお任せできそうですが、修正も多々必要っぽいですね。

ただ、以前のあの$と”と{}と[]と()の嵐になっていたコードがずいぶんすっきりとし、かなり読みやすくなっています。これはとてもうれしいですね。

v0.11のコードは頑張ってリファクタしている真っ最中です。

皆さんもぜひ、Terraform v0.12の世界へ!