📌

terraform のバージョンマネージャー選び

2024/08/22に公開6

tl;dr

  • tfenv を長いこと使っていたけど、最近更新されていないことに気がついた
  • 乗り換えるなら何にするか検討してみた

version manager

  • cli などのツールのバージョン管理は大事
  • チームや組織で共通のバージョンを使うのは運用上必須
  • 特定のバージョンへの変更、固定、最新化が容易であることが望ましい
  • 現在進行系で継続的な更新が行われていてほしい

terraform のバージョンマネージャー

  • terraform に限って言えば、tfenv で今後もそんなには困らない
  • OpenTofu の件があるので、両方に対応できるといいかもしれない
  • CVEなどもあるので、継続的な更新は期待したい(お前がコントリビュートするんだよ)

tfenv

  • tfutils/tfenv: Terraform version manager
  • かなり初期の頃からある
  • rbenv にインスパイアされている(と書いてある)
  • .terraform-version
  • Release v3.0.0 - Major Update · tfutils/tfenv 最新版から2年以上が経過
  • ほぼ完成しているツールとはいえ、メンテナンスに不安があるツールを使い続けるのもどうか
  • というわけで別のツールを探す旅に出たってワケ

tofuenv

  • tofuutils/tofuenv: OpenTofu version manager
  • terraform の OSS fork である OpenTofu のバージョンマネージャー
  • terraform と OpenTofu の両方が使える tenv ができたのでお役御免になったようだ?(アーカイブはされていない)
  • terraform には対応していないので却下

tenv

tfswitch

tfvm

他に

  • Repository search results
  • 規模の小さいのは結構ある
  • terragrunt 向けのやつとか
  • asdf のプラグインとか
  • 結局のところ継続した更新を期待しているので

結局のところ

  • 急いで変更する必要はない(はず)
  • 変更の機会があったら tenv または tfswitch が有力候補
  • どちらも .terraform-version が使えるので移行には困らないはず
  • 後発でこれらを超えるツールを出して継続メンテナンスするのはモチベーションが保てない気がするし難しいよね
  • 他にこれだってツールがあれば教えてください
terraform-jp

Discussion

Shunsuke SuzukiShunsuke Suzuki

よろしければ aqua もどうぞ (ただし .terraform-version には現状未対応)
https://aquaproj.github.io/

https://github.com/aquaproj/aqua-registry/blob/main/pkgs/hashicorp/terraform/registry.yaml

rakiraki

あざます。
aqua 自体は便利に使わせてもらってるんですけど、terraform の管理って点では実務に向いていない(と判断している)ので除外しています。

https://zenn.dev/sogaoh/scraps/2ef6d20f6b704e#comment-192ad9685664e0

ここで @sogaoh も書いていますが、複数の仕事をしていると terraform のバージョンが複数要るケースがあります。というか絶対要ります。

A社のBシステムでは v1.7 、Cシステムでは未だにv1.2、D社ではv1.9.6を使う必要があって、というように、ディレクトリ毎に使用するバージョンを変える必要がある場合がほとんどです。
HCP Terraform を remote で使っているとローカルのバージョンは関係なくなるんですけど、それ以外では多くの場合に .terraform-version がないと辛いことになります。

また、モジュール開発をしているとか、バグを踏んだかもしれないなどのケースでもバージョンを切り替えて使用する必要があります。
ひどい場合は同一の社内でリポジトリ毎に使用バージョンが異なりロクに管理されていない、みたいなこともざらにあります。

一箇所でしか使わない、モジュール開発等もしない、terraform をインストールしてみた、使ってみた、って言いたいだけとか、インストール方法の1つとしてだけなら aqua を紹介するでもいいんですけど、.terraform-version を使えるツールがあるのにあえて aqua を Terraform のバージョンマネージャーとして紹介するのは違うなと。

python等の言語環境のバージョンを管理するのに aqua は使わないけど、そのためのツールである rye,uv,voltaなどは aqua を使う、terraform は前者に近いもの、ということです。

Shunsuke SuzukiShunsuke Suzuki

ディレクトリ毎に使用するバージョンを変える必要がある場合がほとんどです。

aqua で普通にできますね。

また、モジュール開発をしているとか、バグを踏んだかもしれないなどのケースでもバージョンを切り替えて使用する必要があります。

aqua で普通に切り替えられますね。

一箇所でしか使わない、モジュール開発等もしない、terraform をインストールしてみた、使ってみた、って言いたいだけとか、インストール方法の1つとしてだけなら aqua を紹介するでもいいんですけど

良くわからない、というか aqua というツールを誤解しているように思えるんですけど、
Homebrew のようなツールでそれを言うなら理解できますが、 aqua は CLI Version Manager です。
ディレクトリごとに設定ファイルによって異なるバージョンを使えますし、設定ファイルにかかれているバージョンを変えればバージョンの変更も行えますし、設定ファイルのバージョンを変えるコマンドもあります。

最終的に aqua を使わずに他のツールを使うのは全然いいと思いますが、 aqua のことを誤解しているように思えるのでそこは訂正しておきたいです。

rakiraki

あざます。思い出しました。
ディレクトリに aqua.yaml 置いたら確かにできますね。
業務採用していないのでリポジトリに置かないからすっかり抜けてました。。。
ぶっちゃけ使いにくい brew の代替として aqua を使わせてもらっているので、各ディレクトリに配置するという使い方をしてなくて。。。

Shunsuke SuzukiShunsuke Suzuki

ありがとうございます。 aqua のことをより知ってもらえて何よりです。

ついでに以下補足:

OpenTofu の件があるので、両方に対応できるといいかもしれない

aqua は OpenTofu もサポートしています。

現在進行系で継続的な更新が行われていてほしい

行われていると言っていいと思います。

tfenv からの移行で .terraform-version をそのまま使いたいのであれば確かに aqua よりほかのツールのほうが向いているとは思います。
(.terraform-version 対応は頭の片隅にはあるんですが、考えないといけないこともあってどうしようとかなぁという感じです。)

.terraform-version から aqua.yaml を生成する簡単なスクリプトを書いてみました。
これを実行すると .terraform-version と同じディレクトリに同じ terraform のバージョンを指定した aqua.yaml が生成されるはずです。

#!/usr/bin/env bash

set -euo pipefail

while read -r line; do
	dir=$(dirname "$line")
	pushd "$dir" >/dev/null
	version=$(cat .terraform-version)
	aqua init
	aqua g -i "hashicorp/terraform@v${version#v}" # .terraform-version のバージョンに v がつくのかよく知らないのでどっちにも対応
	popd >/dev/null
done < <(find . -name .terraform-version)

あぁ、あと Terragrunt のような関連ツールにも対応しています。

rakiraki

単に使いこなし方がわかってなかっただけですね(お恥ずかしい
ちゃんと知ってはいたんですよ。ディレクトリ毎に入れられるのも。。。
業務用リポジトリに入れるにはチーム展開しないといけないし、git 管理から避けるのも管理的におかしな話だし、brew代替のつもりだったしグローバルで使えばいっかってなってそれっきりだっただけで。。。w