【Terraform】Terraform ~ tfenv / バージョン管理 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/04/05/000224

でも書いたが、
Terraformはバージョンごとに動かすみたいなことが必要になってくるので
バージョンごとに管理できる tfenv について、まとめてみた。

補足:バージョン管理の別方法について

* tfenv とは、別に asdf ってゆーのもあるらしい、、、

asdf ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/01/17/180212

目次

【1】tfenv
【2】利用目的
【3】サポートOS
 1)補足:Windowsに関して
【4】主な機能
【5】環境設定
【6】主なコマンド
 1)tfenv list-remote
 2)tfenv install
 3)tfenv use
 4)tfenv list
【7】「.terraform-version」ファイルについて
 1)ディレクトリごとにバージョン切替

【1】tfenv

* 環境上に 色々な Terraform の バージョンをインストールできるコマンドツール

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

Terraform version manager inspired by rbenv
【訳】Terraform バージョン管理。rbenvに感化された。

 => Python でいう pyenv みたいなもん。

仮想環境 ~ pyenv ~
https://dk521123.hatenablog.com/entry/2022/02/13/000000

【2】利用目的

* Terraform において、一度適応したバージョンより新しいバージョンでしか
 適用することができない
 => 複数で開発していた場合、古いバージョンを使っているメンバーは
  terraform apply できない事態が発生する
 => tfenv を使うと、同じPCで複数のTerraform バージョンを切り替えて
  使用することができる

【3】サポートOS

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

* Linux
* Mac

1)補足:Windowsに関して

* 昔は、Windows + Git bash で使えていたっぽいが
 現状(2024/01/26)は、「tfenv install <VERSION>」でエラーになり
 つかなかった(回避方法はあるかもしれないが)

エラー内容

$ tfenv install latest
Installing Terraform v1.6.6
Downloading release tarball from https://releases.hashicorp.com/terraform/1.6.6/terraform_1.6.6_windows_amd64.zip
######################################################################## 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/1.6.6/terraform_1.6.6_SHA256SUMS
Not instructed to use Local PGP (/c/Users/user/.tfenv/use-{gpgv,gnupg}) & No keybase install found, skipping OpenPGP signature verification
shasum: /dev/fd/63: No such file or directory
SHA256 hash does not match!

【4】主な機能

[1] 複数バージョンのTerraform バイナリの管理
[2] コマンドベースでのTerraform バージョンの切替
[3] 「.terraform-version」ファイルによるディレクトリ内での優先利用設定
 => 詳細は、後述「【5】「.terraform-version」ファイルについて」を参照

【5】環境設定

https://github.com/tfutils/tfenv#manual
Step1: tfenv の ソースをクローンする

git clone --depth=1 https://github.com/tfutils/tfenv.git ~/.tfenv

Step2: .bash_profile に Path 情報を追加

# Bash
# echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile

# For WSL
echo 'export PATH=$PATH:$HOME/.tfenv/bin' >> ~/.bashrc

Step3: 反映および確認

source ~/.bash_profile

# To confirm
tfenv --version
# e.g. tfenv 3.0.0

【6】主なコマンド

1)tfenv list-remote

* 使用可能なバージョンをリモートから取得して一覧表示

https://github.com/tfutils/tfenv#tfenv-list-remote

tfenv list-remote

1.5.0-alpha20230504
1.5.0-alpha20230405
1.4.6
1.4.5
...

2)tfenv install

* 指定したTerraform バージョンをインストール

https://github.com/tfutils/tfenv#tfenv-install-version

tfenv install
tfenv install 0.7.0
tfenv install latest
tfenv install latest:^0.8
tfenv install latest-allowed
tfenv install min-required

3)tfenv use

* 利用するバージョンを切り替え

https://github.com/tfutils/tfenv#tfenv-use-version
コマンド例

tfenv use
tfenv use min-required
tfenv use 0.7.0
tfenv use latest
tfenv use latest:^0.8

4)tfenv list

* インストールしたバージョンを一覧表示 

コマンド例

tfenv list

【7】「.terraform-version」ファイルについて

* プロジェクトルートにファイル「.terraform-version」とを置いておくと
 そのファイルに書かれたバージョンを優先して利用する

1)ディレクトリごとにバージョン切替

mkdir project1
mkdir project2

# 「tfenv list-remote」で使用可能なバージョンを調べてもいい
echo 1.4.6 > .terraform-version
echo 1.1.1 > ./project1/.terraform-version
echo latest:^1.3.2 > ./project2/.terraform-version

# To check version for each directory
terraform --version
# 「Terraform v1.4.6」

cd project1
terraform --version
# Installされていなかったら、インストールする
# version '1.1.1' is not installed ...
# ...
# Terraform v1.1.1

cd ../project2
terraform --version
# version '1.3.2' is not installed ...
# ...
# Terraform v1.3.2

参考文献

https://qiita.com/kamatama_41/items/ba59a070d8389aab7694
https://zenn.dev/mihohoi/articles/4e15a098a08c25

関連記事

Terraform ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/05/000224
Terraform ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/09/222057
Terraform ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/05/03/000000
Terraform ~ direnv / プロジェクト隔離 ~
https://dk521123.hatenablog.com/entry/2023/01/15/000000
asdf ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/01/17/180212