新しいTerraformのバージョンマネージャー tenv を試してみた
しばたです。
私は普段Windows環境でTerraformを使っており、Terraformのバージョン管理には自作ツールを使っていました。
つい先日新しいバージョンマネージャーであるtenvというツールがあることを知ったので試してみることにしました。
tfenvのつらみ
Terraformのバージョンマネージャーとしてはtfenv
が一番メジャーかと思います。
ただ、このtfenv
はシェルスクリプト(Bashスクリプト)の集合体でありWindows環境ではGit Bashでのみ動作する状況でした。
加えて2023年末ごろから開発停止状態になっていいます。
新しいバージョンマネージャー tenv
細かい経緯を正確に把握できていないのですが、今年に入りOpenTofuのコミュニティによりOpenTofu向けのtfenv派生であるtofuenv
が生まれ、
続けて両者を統合して扱うためにtenv
が生まれた模様です。
tenv
はその実装をBashスクリプトからGo言語に変更しており[1]、本日時点ではさらに追加でTerragruntとAtmosのバージョン管理もできる様になっています。
実装がBashスクリプトからGo言語に変わったことでプラットフォーム別にバイナリが提供される形となりWindows環境でもネイティブに動作する様になっています。
Windowsユーザーの私としては非常に嬉しい感じです。
加えて実装にCobraを使っているため各種シェルでの補完機能も標準搭載されています。
asdfとの違い
Windowsユーザーとしてはこれだけで十分tenv
を採用できるのですが、非Windowsユーザー向けにasdf
との違いについて以下の様に表明されています。
こちらによると、
- 複数ツールのバージョン管理という目的は両者同じだが、tenvはTerraform、OpenTofu、Terragrunt、AtmosといったHCLを扱う製品に特化している
- tenvはシェル環境や他のCLIツールに依存しないバイナリファイルで提供していく
- tenvパフォーマンスと各プラットフォームの互換性に優れている
- tenvはダウンロードしたバイナリのシグニチャチェック機能を持っている
- tenvはtfenvとtoufenvのコマンド構文に互換性がある
といった点でtenvの思想と優位性が語られています。
決して「asdfを捨てろ」という話では無いので用途や環境に応じて好きな方を選ぶと良いでしょう。
試してみた
それでは早速試していきます。
検証環境
今回は私の開発環境である、
- 64bit版 Windows 11
- PowerShell 5.1 (および PowerShell 7.4.3、Nushell 0.95.0)
で試していきます。
私は普段PowerShell 7とNushellを使っているのですが、今回はWindowsにデフォルトでインストール済みのPowerShell 5.1で作業を行い、tenvの言うプラットフォーム互換性を確かめたいと思います。
インストール
Windows向けのパッケージマネージャとしてはChocolateyとNixがサポートされており、これらを使っている場合は以下のコマンドでインストール可能です。
# Chocolatey を使っている場合
choco install tenv
# Nix を使っている場合
nix-env -i tenv
私はどちらも使っていないので、今回はGitHubのリリースバイナリを直接ダウンロードして使います。
本日時点はVer.2.4.0が最新なので、64bit版のバイナリ(tenv_v2.4.0_Windows_x86_64.zip
)をダウンロードし、任意のディレクトリに展開します。
今回はC:\tofuutils\tenv\
にツールを展開します。
# インストール先ディレクトリを作成
$basePath = 'C:\tofuutils\tenv\'
mkdir $basePath
# 最新バージョンをダウンロード
$uri = 'https://github.com/tofuutils/tenv/releases/download/v2.4.0/tenv_v2.4.0_Windows_x86_64.zip'
Invoke-WebRequest -Uri $uri -OutFile './tenv_windows_x86_64.zip'
# 解凍
Expand-Archive -LiteralPath './tenv_windows_x86_64.zip' -DestinationPath $basePath
# ダウンロードしたzipを削除
Remove-Item -LiteralPath './tenv_windows_x86_64.zip'
最終的に下図の様にC:\tofuutils\tenv\
にバイナリファイルが展開されていればOKです。
tenv本体であるtenv.exe
の他にShimとなるterraform.exe
, tofu.exe
, terragrunt.exe
, atmos.exe
もあるのが見て取れますね。
続けてこのディレクトリにPATHを通して各バイナリを名前だけで実行可能にすればインストールは完了です。
# 非永続で良い場合
$env:Path += ';C:\tofuutils\tenv\'
# User環境変数に永続保存したい場合
[Environment]::SetEnvironmentVariable('PATH', [Environment]::GetEnvironmentVariable('PATH', 'User') + ";C:\tofuutils\tenv\", 'User')
# Machine環境変数に永続保存したい場合 : 要管理者権限
[Environment]::SetEnvironmentVariable('PATH', [Environment]::GetEnvironmentVariable('PATH', 'Machine') + ";C:\tofuutils\tenv\", 'Machine')
Optional : cosignを使ったシグニチャチェック
cosignを使ってバイナリのシグニチャチェックをする場合は事前にインストールをしておく必要があります。
Windows環境ではgo install
コマンドを使いソースから直接バイナリを生成する手順となっています。
go install github.com/sigstore/cosign/v2/cmd/cosign@latest
ただ、GitHubのリリースバイナリを直接ダウンロードしても期待した動作はしたのでこちらのほうが楽だと思います。
PATHの通ったディレクトリにcosign.exe
の名前で実行ファイルを保存してください。
動作確認
この状態でtenv
コマンドを実行するとヘルプが表示されます。
基本的な使い方としては
tenv [対象ツール] [対象コマンド]
となり、ツールの一覧は下表のとおりです。
ツール | 指定コマンド |
---|---|
Terraform | tf |
OpenTofu | tofu |
Terragrunt | tg |
Atmos | at |
Terraformを扱う場合は
tenv tf [対象コマンド]
となります。
対象コマンドの部分はtfenv互換で、
- tenv tf list
- tenv tf list-remote
- tenv tf install
- tenv tf use
- tenv tf uninstall
を基本としつつ独自の
- tenv tf constraint
- tenv tf detect
- tenv tf reset
といったコマンドが用意されています。
より細かい点はヘルプを見て頂くと良いでしょう。
Terraformのインストールと利用
ここからはtfenvと同様に
tenv tf install
コマンドで指定バージョンのTerraformをインストールtenv tf use
コマンドで利用するTerraformを選択
する形となります。
なお、Terraformをインストールする前にterraform
コマンドを実行してしまうとこんな感じで事前準備を促されます。
# 最新バージョンTerraformのインストール
tenv tf install latest
# インストール済みバージョンを確認
tenv tf list
# Ver.1.9.2を使用
tenv tf use 1.9.2
# 使用状況を確認
tenv tf list
この状態でterraform
コマンドを実行すると期待通りVer.1.9.2が起動してくれました。
terraform version
実体となるバイナリはtfenv同様に~\.tenv\Terraform\バージョン番号\
に保存されています。
その他独自コマンド
tenv独自のコマンドについて簡単に解説しておきます。
- tenv tf constraint
- デフォルトのバージョン制限(tenv独自機能)を設定します
- tenv tf detect
- カレントディレクトリを基準として
.terraform-version
ファイルを探しバージョン制限の状態を確認します
- カレントディレクトリを基準として
- tenv tf reset
- 利用バージョンを未指定の状態にします
補足 : PowerShell 7やNushellでの利用
tenvはバイナリツールなのでWindows PowerShellだけでなくPowerShell 7やNushellでも普通に動作します。
これは便利ですね。
もちろんコマンドプロンプトでも動作します。
最後に
以上となります。
非常によいツールですね。
これはWindowsユーザーにとってはマストでしょう。私も自作ツールからtenvに鞍替えする予定です。
本記事ではTerraformだけ試しましたが他のツールも同じく便利に扱えますので気になる方は是非試してみてください。
GitHubのコミット履歴を見る限り、最初はシェルスクリプトでの統合を図ったものの、割と早期にGo言語へ切り替えていました ↩︎