新しいTerraformのバージョンマネージャー tenv を試してみた

新しいTerraformのバージョンマネージャー tenv を試してみた

Clock Icon2024.07.14

しばたです。

私は普段Windows環境でTerraformを使っており、Terraformのバージョン管理には自作ツールを使っていました。

https://dev.classmethod.jp/articles/i-published-powrshell-module-tfalias-like-tfenv/

つい先日新しいバージョンマネージャーであるtenvというツールがあることを知ったので試してみることにしました。

https://tofuutils.github.io/tenv/

tfenvのつらみ

Terraformのバージョンマネージャーとしてはtfenvが一番メジャーかと思います。

ただ、このtfenvはシェルスクリプト(Bashスクリプト)の集合体でありWindows環境ではGit Bashでのみ動作する状況でした。
加えて2023年末ごろから開発停止状態になっていいます。

https://github.com/tfutils/tfenv/issues/410

https://github.com/tfutils/tfenv/issues/399

新しいバージョンマネージャー tenv

細かい経緯を正確に把握できていないのですが、今年に入りOpenTofuのコミュニティによりOpenTofu向けのtfenv派生であるtofuenvが生まれ、

続けて両者を統合して扱うためにtenvが生まれた模様です。

tenvはその実装をBashスクリプトからGo言語に変更しており[1]、本日時点ではさらに追加でTerragruntAtmosのバージョン管理もできる様になっています。

実装が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\にツールを展開します。

PowerShell 5.1
# インストール先ディレクトリを作成
$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です。

try-tenv-terraform-version-manager-01

tenv本体であるtenv.exeの他にShimとなるterraform.exe, tofu.exe, terragrunt.exe, atmos.exeもあるのが見て取れますね。

続けてこのディレクトリにPATHを通して各バイナリを名前だけで実行可能にすればインストールは完了です。

PowerShell 5.1
# 非永続で良い場合
$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コマンドを実行するとヘルプが表示されます。

try-tenv-terraform-version-manager-02

基本的な使い方としては

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

といったコマンドが用意されています。
より細かい点はヘルプを見て頂くと良いでしょう。

try-tenv-terraform-version-manager-03

Terraformのインストールと利用

ここからはtfenvと同様に

  • tenv tf installコマンドで指定バージョンのTerraformをインストール
  • tenv tf useコマンドで利用するTerraformを選択

する形となります。
なお、Terraformをインストールする前にterraformコマンドを実行してしまうとこんな感じで事前準備を促されます。

try-tenv-terraform-version-manager-04

PowerShell 5.1
# 最新バージョンTerraformのインストール
tenv tf install latest

try-tenv-terraform-version-manager-05

PowerShell 5.1
# インストール済みバージョンを確認
tenv tf list

# Ver.1.9.2を使用
tenv tf use 1.9.2

# 使用状況を確認
tenv tf list

try-tenv-terraform-version-manager-06

この状態でterraformコマンドを実行すると期待通りVer.1.9.2が起動してくれました。

PowerShell 5.1
terraform version

try-tenv-terraform-version-manager-07

実体となるバイナリはtfenv同様に~\.tenv\Terraform\バージョン番号\に保存されています。

try-tenv-terraform-version-manager-08

その他独自コマンド

tenv独自のコマンドについて簡単に解説しておきます。

  • tenv tf constraint
    • デフォルトのバージョン制限(tenv独自機能)を設定します
  • tenv tf detect
    • カレントディレクトリを基準として.terraform-versionファイルを探しバージョン制限の状態を確認します
  • tenv tf reset
    • 利用バージョンを未指定の状態にします

補足 : PowerShell 7やNushellでの利用

tenvはバイナリツールなのでWindows PowerShellだけでなくPowerShell 7やNushellでも普通に動作します。
これは便利ですね。

try-tenv-terraform-version-manager-09

try-tenv-terraform-version-manager-10

もちろんコマンドプロンプトでも動作します。

try-tenv-terraform-version-manager-11

最後に

以上となります。

非常によいツールですね。
これはWindowsユーザーにとってはマストでしょう。私も自作ツールからtenvに鞍替えする予定です。

本記事ではTerraformだけ試しましたが他のツールも同じく便利に扱えますので気になる方は是非試してみてください。

脚注
  1. GitHubのコミット履歴を見る限り、最初はシェルスクリプトでの統合を図ったものの、割と早期にGo言語へ切り替えていました ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.