Terraform

tfenvで複数バージョンのTerraformを管理(Linux/Mac)

tfenvを用いて複数バージョンの Terraform を管理してみます。

複数プロジェクトでバージョンの異なるTerraformを利用するときにとても便利です。

後方互換性のないアップデートが来たときにすぐ切り戻せるように備えておいたほうが安心ですね。

スポンサーリンク

tfenvの使用方法

tfenv自体の管理

Linux

インストール

githubより取得します。

この例ではEC2で最初からパスが通っている、ユーザーのホームディレクトリ直下のbinに設置しています。

$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
Cloning into '/home/ec2-user/.tfenv'...
remote: Enumerating objects: 21, done.
...
$ 
$ mkdir ~/bin ; ln -snf ~/.tfenv/bin/* ~/bin
$ 
$ ls -l ~/bin/
合計 0
lrwxrwxrwx 1 ec2-user ec2-user 35 10月 31 13:11 terraform -> /home/ec2-user/.tfenv/bin/terraform
lrwxrwxrwx 1 ec2-user ec2-user 31 10月 31 13:11 tfenv -> /home/ec2-user/.tfenv/bin/tfenv
$
アップデート

アップデートはgitコマンドを使います。

Git 1.8.5以降は-C オプションで可能です。

$ git --version
git version 2.23.3
$ 
$ git -C ~/.tfenv pull
Already up to date.
$


公式手順の~(チルダ)と–git-dir ではなぜか失敗しました。(~が展開されてない??)

$HOMEをつければ大丈夫でした。

## ~(ホームディレクトリを表す) はエラー
$ git --git-dir=~/.tfenv/.git --work-tree=.~/.tfenv pull
fatal: not a git repository: '~/.tfenv/.git'
$
$
## $HOME はOK
$ git --git-dir=$HOME/.tfenv/.git --work-tree=$HOME/.tfenv pull
Already up to date.
$
アンインストール

ディレクトリを削除してください。

$ rm -rf ~/.tfenv
$

Mac

インストール

(上記githubに加えて)Homebrew でインストールできます。

注意点として、terraformが既にインストールされていると以下のようにエラーとなります。unlink してから再度インストールしましょう。

% 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.
% 
% brew unlink terraform
Unlinking /usr/local/Cellar/terraform/0.13.3... 1 symlinks removed
% 
% brew install tfenv                     
...
%
アップデート
% brew upgrade tfenv
Warning: tfenv 2.0.0 already installed
%
アンインストール
% brew uninstall tfenv
Uninstalling /usr/local/Cellar/tfenv/2.0.0... (27 files, 269.6MB)
%

tfenvでTerraformを管理

インストール可能バージョン一覧表示

インストール可能なバージョン一覧を表示します。

$ tfenv list-remote
0.14.0-beta2
0.14.0-beta1
0.14.0-alpha20201007
0.14.0-alpha20200923
0.14.0-alpha20200910
0.13.5
0.13.4
...
$

terraformインストール

バージョンを完全指定してインストールします。

$ tfenv install 0.13.5
Installing Terraform v0.13.5
...
$


引数なしだと、そのときの最新版がインストールされます。(ただし 後述する .terraform-versionに記載があればそのバージョン)

$ tfenv install
Terraform v0.13.5 is already installed
$


terraform の設定ファイルでバージョンを範囲指定している場合、min-required で最小バージョンがインストールされます。

$ cat main.tf 
...
terraform {
  required_version  = ">= 0.10.0, <0.12.3"
}
...

$ tfenv install min-required
Installing Terraform v0.10.0
...


注意点として、数値の最初のversionをインストールする挙動になります。必ず左側を小さいバージョンとしましょう。

$ cat main.tf 
terraform {
  required_version  = "<0.12.3,<0.10.0"
}

$ tfenv install min-required
Installing Terraform v0.12.3
Downloading release tarball from https://releases.hashicorp.com/terraform/0.12.3/terraform_0.12.3_linux_amd64.zip

$


前方一致でもバージョン指定できます。

$ tfenv install latest:^0.11
Installing Terraform v0.11.15-oci
...
$

インストール済みバージョン一覧表示

現在、ローカルにインストールされているバージョンを確認します。

$ tfenv list
  0.13.5
  0.12.3
  0.11.15-oci
* 0.10.1 (set by /home/ec2-user/hoge/.terraform-version)
  0.10.0
$ 
$ 
### 最初にuseで指定しないと以下のエラーとなる
$ tfenv list
cat: /home/ec2-user/.tfenv/version: No such file or directory
Version could not be resolved (set by /home/ec2-user/.tfenv/version or tfenv use <version>)
tfenv-version-name failed
$

バージョン切り替え

使用するバージョンを切り替えます。

$ tfenv use
Switching default version to v0.13.5
Switching completed
$ 
$ tfenv list
* 0.13.5 (set by /home/ec2-user/.tfenv/version)
  0.12.3
  0.11.15-oci
  0.10.0
$ 
$ tfenv use 0.12.3
Switching default version to v0.12.3
Switching completed
$
$ tfenv list
  0.13.5
* 0.12.3 (set by /home/ec2-user/.tfenv/version)
  0.11.15-oci
  0.10.1
$


ディレクトリごとにバージョン固定

.terraform-version を特定のディレクトリに置くことによって、そのディレクトリ配下のみ適用するバージョンを指定できます。

プロジェクトごとに切り替えられるため、 .terraform-version も terraformのコード群と一緒にgithubなどにコミットして管理していくのが良いと思います。

$ mkdir hoge
$ 
$ cd hoge/
$ 
$ echo 0.10.0 > .terraform-version
$ 
$ cat .terraform-version 
0.10.0
$
$ terraform --version
Terraform v0.10.0

Your version of Terraform is out of date! The latest version
is 0.13.5. You can update by downloading from www.terraform.io
$

自動インストール

まだローカルにインストールされていないバージョンをterraform-version に記載するとterraform実行時に自動的に当該バージョンがインスト―ルされます。

$ echo 0.10.1 > .terraform-version
$ 
$ terraform --version
version '0.10.1' is not installed (set by /home/ec2-user/hoge/.terraform-version). Installing now as ...

$ 
$ tfenv list
  0.13.5
  0.12.3
  0.11.15-oci
* 0.10.1 (set by /home/ec2-user/hoge/.terraform-version)
  0.10.0
$

terraformアンインストール

$ tfenv uninstall   0.10.1
Uninstall Terraform v0.10.1
Terraform v0.10.1 is successfully uninstalled
$

Tips

EC2で /usr/bin/terraform: No such file or directory のようなエラーが出る場合、一度bash設定を読み込んだりbashに入り直すと解決するかもしれません。

$ tfenv use
Switching default version to v0.14.2
Switching completed
$ 
$ terraform init
-bash: /usr/bin/terraform: No such file or directory
$
$ . ~/.bash_profile
$
$ terraform init

Initializing the backend...

...
$

今回は以上です〜ノシ

参考

(*ゝω・)ノ ァリガトネー

tfenv
tfenvでTerraformのバージョン管理をする
Gitディレクトリ外からgitコマンドを実行する