.terraform-versionを使ってterraformのバージョンをリポジトリごとに管理する話

私の会社ではいろんなサービスでterraformを使っていますが、サービスごとにバージョンがばらばらで0.11だったり0.13だったりします。 サービスごとにterraformのリポジトリが別れているので都度tfenv useで切り替える必要がありますが、だんだん面倒になってきました。 なので、.terraform-versionを使ってみることにしました。 (理想を言えば全部最新にすべきですがいったん置いといて 💦 )

https://github.com/tfutils/tfenv#terraform-version-file

terraformのコードを管理するリポジトリ直下に.terraform-versionを配置して、使用したいバージョンを書けばOKです。

.terraform-versionを使わない場合

tfenv useで指定済のバージョンが使われます。

$ tfenv list
* 0.13.3 (set by /usr/local/Cellar/tfenv/2.0.0/version)
  0.13.2
  0.12.29
  0.11.14

0.13.3にする場合

.terraform-versionに0.13.3と書けばOKです。 tfenv listを実行してみると、0.13.3になっておりset byと書かれている部分を見ると、.terraform-versionによって使うバージョンが選ばれていることがわかります。

$ cat .terraform-version
0.13.3

$ tfenv list
* 0.13.3 (set by /path/to/repository/.terraform-version)
  0.13.2
  0.12.29
  0.11.14

0.11.14にする場合

意図的に古いバージョンを使いたい場合も同様にすればOKです。

$ cat .terraform-version
0.11.14

$ tfenv list
  0.13.3
  0.13.2
  0.12.29
* 0.11.14 (set by /path/to/repository/.terraform-version)

マイナーバージョンを指定しない場合

マイナーバージョンの指定がない場合はこんな書き方もできます。 例えば以下のように書くと、インストール済かつ0.13系なものから最新のバージョンが選択されます。

$ cat .terraform-version
latest:^0.13

$ tfenv list
* 0.13.3 (set by /path/to/repository/.terraform-version)
  0.13.2
  0.12.29
  0.11.14

手元の環境で未インストールなバージョンを指定する場合

該当のバージョンがない場合、terraform initなどを実行するときに自動でインストールされます。 これはTFENV_AUTO_INSTALLという環境変数がデフォルトでtrueになっていることが関係しているようです。

https://github.com/tfutils/tfenv#tfenv_auto_install

手元の環境であえて0.13.3を削除して、0.13.2をセットしておきます。

$ tfenv list
* 0.13.2 (set by /path/to/repository/.terraform-version)
  0.12.29
  0.11.14

0.13.3を指定します。

$ cat .terraform-version
0.13.3

terraform initを実行すると、0.13.3のインストールも実行されます。

$ terraform init
version '0.13.3' is not installed (set by /path/to/repository/.terraform-version). Installing now as TFENV_AUTO_INSTALL==true
Installing Terraform v0.13.3
Downloading release tarball from https://releases.hashicorp.com/terraform/0.13.3/terraform_0.13.3_darwin_amd64.zip
################################################################################################################################ 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/0.13.3/terraform_0.13.3_SHA256SUMS
No keybase install found, skipping OpenPGP signature verification
Archive:  tfenv_download.3jTzo2/terraform_0.13.3_darwin_amd64.zip
  inflating: /usr/local/Cellar/tfenv/2.0.0/versions/0.13.3/terraform
Installation of terraform v0.13.3 successful. To make this your default version, run 'tfenv use 0.13.3'
Initializing modules...
Initializing the backend...
Initializing provider plugins...
- Using previously-installed terraform-providers/openstack v1.21.1
- terraform.io/builtin/terraform is built in to Terraform
- Using previously-installed hashicorp/template v2.1.2
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, we recommend adding version constraints in a required_providers block
in your configuration, with the constraint strings suggested below.
* hashicorp/template: version = "~> 2.1.2"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

0.13.3がインストール&セットされました。

$ tfenv list
* 0.13.3 (set by /path/to/repository/.terraform-version)
  0.13.2
  0.12.29
  0.11.14