Terraformのバージョン切り替えにtfenvを試してみる

概要

仕事で複数のプロジェクトでTerraformを使うことになった。
過去、0.10.* から 0.11.* にバージョンアップした後、不具合が発生して 0.10.* にバージョンダウンしようとしたらsyntaxが変わりバージョンを下げられなくなってしまったということがあった。
そこで、Terraformのバージョンを統一的にしていくかどうかは置いたとしても、バージョンの差異による問題が発生することは今後ありえるだろうと考え、tfenvを利用してみることにした。
tfenvを使うとterraformのバージョンを簡単に切り替えられるらしい。

tfenvのインストール

brew installするだけ。

$ brew install tfenv

Error: Cannot install tfenv because conflicting formulae are installed.
terraform: because tfenv symlinks terraform binaries

Please `brew unlink terraform` before continuing.

Unlinking removes a formula's symlinks from /usr/local. You can
link the formula again after the install finishes. You can --force this
install, but the build may fail or cause obscure side-effects in the
resulting software.

エラーになった。terraformがインストールされている状態だと、一度terraformをunlinkしないと駄目らしい。
パスを見ておく。

$ which terraform
/usr/local/bin/terraform

$ ll /usr/local/bin/terraform
lrwxr-xr-x 1 inamuu inamuu 40B 12 19 17:30 /usr/local/bin/terraform -> ../Cellar/terraform/0.11.1/bin/terraform

元々brewでインストールしたterraformの複数バージョンがインストールされているのが分かる。

$ ls -l /usr/local/Cellar/terraform/
total 0
drwxr-xr-x 15 inamuu inamuu 510B 12 1 17:06 .
drwxr-xr-x 127 inamuu inamuu 4.2K 2 5 22:51 ..
drwxr-xr-x 9 inamuu inamuu 306B 8 23 10:05 0.10.2
drwxr-xr-x 9 inamuu inamuu 306B 9 14 12:07 0.10.4
drwxr-xr-x 9 inamuu inamuu 306B 9 20 10:31 0.10.6
drwxr-xr-x 9 inamuu inamuu 306B 10 3 12:32 0.10.7
drwxr-xr-x 9 inamuu inamuu 306B 11 13 19:16 0.10.8
drwxr-xr-x 9 inamuu inamuu 306B 11 21 21:33 0.11.0
drwxr-xr-x 9 inamuu inamuu 306B 12 1 17:06 0.11.1
drwxr-xr-x 9 inamuu inamuu 306B 7 6 2017 0.9.11
drwxr-xr-x 9 inamuu inamuu 306B 5 9 2017 0.9.4
drwxr-xr-x 9 inamuu inamuu 306B 5 12 2017 0.9.5
drwxr-xr-x 9 inamuu inamuu 306B 5 26 2017 0.9.6
drwxr-xr-x 9 inamuu inamuu 306B 6 12 2017 0.9.8
drwxr-xr-x 9 inamuu inamuu 306B 6 29 2017 0.9.9

brewの挙動を理解していなかったので、brewでアップデートしたら新しいバージョンがダウンロードされてシンボリックリンク切り替えてるだけかもしれないということで、terraformをunlinkした。

$ brew unlink terraform
Unlinking /usr/local/Cellar/terraform/0.11.1... 2 symlinks removed
$ ll /usr/local/bin/terraform
ls: /usr/local/bin/terraform: No such file or directory
$ ll -d /usr/local/Cellar/terraform/0.11.1
drwxr-xr-x 9 inamuu inamuu 306B 12 1 17:06 /usr/local/Cellar/terraform/0.11.1

シンボリックリンクだけが無くなった。


再度tfenvのインストールをトライ。

$ brew install tfenv
Updating Homebrew...
==> Downloading https://github.com/kamatama41/tfenv/archive/v0.6.0.tar.gz
==> Downloading from https://codeload.github.com/kamatama41/tfenv/tar.gz/v0.6.0
######################################################################## 100.0%
🍺 /usr/local/Cellar/tfenv/0.6.0: 19 files, 23.6KB, built in 5 seconds

インストールできた様子。

$ tfenv
tfenv 0.6.0
Usage: tfenv <command> [
<options>]</options>

Commands:
install Install a specific version of Terraform
use Switch a version to use
uninstall Uninstall a specific version of Terraform
list List all installed versions
list-remote List all installable versions

現行はバージョン0.6.0.

$ which tfenv
/usr/local/bin/tfenv

$ ls -l /usr/local/bin/tfenv
lrwxr-xr-x 1 inamuu inamuu 31 2 13 11:27 /usr/local/bin/tfenv -&gt; ../Cellar/tfenv/0.6.0/bin/tfenv

こうゆうのが出来ている。

tfenvを使ってみる

最新のterraformをインストールする。

$ tfenv install latest
[INFO] Installing Terraform v0.11.3
[INFO] Downloading release tarball from https://releases.hashicorp.com/terraform/0.11.3/terraform_0.11.3_darwin_amd64.zip
######################################################################## 100.0%
[INFO] Downloading SHA hash file from https://releases.hashicorp.com/terraform/0.11.3/terraform_0.11.3_SHA256SUMS
tfenv: tfenv-install: [WARN] No keybase install found, skipping GPG signature verification
Archive: tfenv_download.RHXvkl/terraform_0.11.3_darwin_amd64.zip
inflating: /usr/local/Cellar/tfenv/0.6.0/versions/0.11.3/terraform
[INFO] Installation of terraform v0.11.3 successful
[INFO] Switching to v0.11.3
[INFO] Switching completed

listしてみる。

$ tfenv list
* 0.11.3 (set by /usr/local/Cellar/tfenv/0.6.0/version)

terraformのバージョンを確認

$ terraform version
Terraform v0.11.3

別のバージョンをインストールする

$ tfenv install 0.11.1
[INFO] Installing Terraform v0.11.1
[INFO] Downloading release tarball from https://releases.hashicorp.com/terraform/0.11.1/terraform_0.11.1_darwin_amd64.zip
######################################################################## 100.0%
[INFO] Downloading SHA hash file from https://releases.hashicorp.com/terraform/0.11.1/terraform_0.11.1_SHA256SUMS
tfenv: tfenv-install: [WARN] No keybase install found, skipping GPG signature verification
Archive: tfenv_download.ItBVlP/terraform_0.11.1_darwin_amd64.zip
inflating: /usr/local/Cellar/tfenv/0.6.0/versions/0.11.1/terraform
[INFO] Installation of terraform v0.11.1 successful
[INFO] Switching to v0.11.1
[INFO] Switching completed

切り替えてみる。

$ tfenv list
0.11.3
* 0.11.1 (set by /usr/local/Cellar/tfenv/0.6.0/version)

$ tfenv use 0.11.3
[INFO] Switching to v0.11.3
[INFO] Switching completed

$ tfenv list
* 0.11.3 (set by /usr/local/Cellar/tfenv/0.6.0/version)
0.11.1

良さそう!


brewでインストールしたterraformとtfenvでインストールしたterraformではパスが違うのでは?ということで、パスとか調べた。

$ ls -l /usr/local/Cellar/tfenv/0.6.0/versions
total 0
drwxr-xr-x 4 inamuu inamuu 136B 2 13 11:36 .
drwxr-xr-x 11 inamuu inamuu 374B 2 13 11:30 ..
drwxr-xr-x 3 inamuu inamuu 102B 2 13 11:36 0.11.1
drwxr-xr-x 3 inamuu inamuu 102B 2 13 11:30 0.11.3

$ ls -l /usr/local/Cellar/tfenv/0.6.0/versions/0.11.3
total 162440
drwxr-xr-x 3 inamuu inamuu 102 2 13 11:30 .
drwxr-xr-x 3 inamuu inamuu 102 2 13 11:30 ..
-rwxrwxr-x 1 inamuu inamuu 83165968 2 1 05:50 terraform

$ which terraform
/usr/local/bin/terraform

$ ls -l /usr/local/bin/terraform
lrwxr-xr-x 1 inamuu inamuu 35B 2 13 11:27 /usr/local/bin/terraform -&gt; ../Cellar/tfenv/0.6.0/bin/terraform

バージョン情報はversionというファイルに書いてある

$ terraform version
Terraform v0.11.3

$ cat /usr/local/Cellar/tfenv/0.6.0/version
0.11.3

$ tfenv use 0.11.1
[INFO] Switching to v0.11.1
[INFO] Switching completed

$ cat /usr/local/Cellar/tfenv/0.6.0/version
0.11.1

$ terraform version
Terraform v0.11.1

Your version of Terraform is out of date! The latest version
is 0.11.3. You can update by downloading from www.terraform.io/downloads.html

tfenvのversionsの下にterraformの各バージョンが保存される。
terraformそのものへのシンボリックリンクがtfenvの中にある bin/terraform になっているので、非破壊で利用できることがわかり、カジュアルに利用出来そうであることがわかった。
もちろんterraform initを実行して、terraform.tfstateファイルを更新してしまったら差分が発生してしまうので、.terraform-versionファイルをリポジトリに設置すると良いことが分かった。

$ echo 0.11.1 &gt; .terraform-version
$ terraform version
Terraform v0.11.1
$ echo 0.11.3 > .terraform-version
$ terraform version
Terraform v0.11.3

これは便利。確かに作者が書かれているようにrbenvと同じような感覚で利用できることがわかった。
もしも何か理由があって、tfenvやめることになってもbrew link/unlinkを駆使すれば、tfenvを使わない環境に戻すことは簡単そうだった。
とても便利そうなので使っていこうと思う。

※タイトルがTfenvとなって頭文字が大文字になっているけど、正しくは小文字っぽい。テーマのせいでタイトルは英単語の頭文字が大文字になってしまう。。