Terraformのvariables.tfを生成するツールを作った
Terraformのvariablesあるある(?)
variablesブロックを変数ごとに書くのがめんどくさい。- 色々インフラの変更をした結果、未使用の
variablesが放置されがち
1つ目に関しては変数の数が増えてきたら特にめんどくさくなります。大体の変数がstringかnumber型なので、variablesブロックも大体同じ感じの定義がずっと続くことになります。
2つ目はtflintを毎回実行して未使用の変数を除去すれば良いのですが、不幸にもそれができていないまま変数が1000個くらいに膨れ上がってしまったプロジェクトもあったりします。
そんなわけでvariables.tfをいい感じに生成してくれるツールを書きました。
できたもの
これがやることはシンプルで、
- 不足している
variablesブロックを追加したvariables.tfを出力する - syncモードの時は、↑に加えてさらに未使用の
variablesブロックも削除する - オプションをつけると、tfvarsファイルも一緒に整理する
例
それぞれ次のように定義されていたとします。
my_resource.tf
resource "my_resource" "myvar" {
url = "http://semvar.co.jp/${var.appname}/${var.env}"
# title = var.moge
expiration = var.expiration_days
}
variables.tf
variable "env" {}
variable "unused" {
description = "my variable"
}
variable "appname" {
description = ""
}
dev.tfvars
env = "dev"
unused = {
"abc" = "def"
"bird" = "owl"
}
appname = "myapp"
実行結果はこうなります。
$ tfv -sync --tfvars-file dev.tfvars
variable "env" {}
variable "appname" {
description = ""
}
variable "expiration_days" {
description = ""
}
使われてないunusedを除去し、定義されていないexpiration_daysを追加したものが出力されます。
また、dev.tfvars.generatedにはこのようなファイルが生成されます。
env = "dev" appname = "myapp"
できないこと
真面目にパーサを書いてないので、%{}を含む構文には対応していません。つまり、%{}で囲まれているvar.fooのような変数の利用があっても正しく認識されない場合があります。
そもそも%{}をあまり見ないのでこれは何?って感じなんですが、これは文字列の中に制御構文を埋め込む記法です。
公式サイトの例にあがっているのが次のような書き方です。
"Hello, %{ if var.name != "" }${var.name}%{ else }unnamed%{ endif }!"
%{}は再帰的な構造を持つことができるので、行ごとにGoのregexpでパターンマッチする方針だと上手く扱えませんでした。ただ%{}を使うことがあまりないので、大体のケースでなんとかなると思います。