.tfvarsをDRYに保つには?

課題

同じ設定であれば、設定ファイル(*.tfvars)をコピーして各ディレクトリに置くのではなく、共通の設定ファイルとして読み込むようにしたい。

だがTerraformに外部ファイルの読み込みらしき機能が見当たらない。どうすればよいか。

解決

実行時に-var-fileオプションを使う。

terraform apply -var-file="../shared.tfvars"

公式によると、オーバライドも可能であるらしい。

If the same variable is assigned multiple values, Terraform uses the last value it finds, overriding any previous values.

Terraform loads variables in the following order, with later sources taking precedence over earlier ones:

  • Environment variables
  • The terraform.tfvars file, if present.
  • The terraform.tfvars.json file, if present.
  • Any .auto.tfvars or .auto.tfvars.json files, processed in lexical order of their filenames.
  • Any -var and -var-file options on the command line, in the order they are provided. (This includes variables set by a Terraform Cloud workspace.)

意訳: 同じ変数が割り当てられていたら後から読んだ設定でオーバーライドする。環境変数 -> terraform.tfvars -> The terraform.tfvars.json -> *.auto.tfvars or *.auto.tfvars.json -> -var-var-fileオプションでの指定 の順で読むそうなので、-var-fileで指定するとそれが最優先となる。

つまり、-var-fileで共通の設定を読んで各ディレクトリに個別に設置したterraform.tfvarsでオーバーライドする、といった使い方は無理である。

どうしてもオーバーライドする処理が必要なら、Environment variablesのほうに共通の設定を書いておくしかないかもしれない。となると、インストール手順の違いで処理結果が変わるという恐ろしいことが起こるので、Terraform専用のインスタンスを作ったり、あるいはTerraform実行用のコンテナを使えるようDockerfileを用意したり、といった工夫も必要になるので、少々運用でのカバーが必要そうだ。