👋

terraformバージョン管理ツールのterraform-switcherを使ってみた

2023/01/02に公開

terraformを利用し始めた頃から、terraformのversion管理には今まで思考停止で tfenv を使用していたのですが、ふと terraform-switcher というツールを目にし、気になったため、実際に使って使用感などを確かめてみました。

余談ですが、terraform-switcherはtfenvよりも比較的新しいツールであり、開発当初はtfenvで不可能なことを解決するために後追いで開発されたものであったそうです。元々社内ツールとして利用していたものをOSS化したという経緯もあるみたいです。このあたりの背景などは、同ツールリポジトリの issue に記載されていました。

tfswitch was initially created to resolve issues that were not possible with tfenv. It was an internal tool at my company which later I open-sourced it. I picked golang as the language of choice since it's easy to understand/code/contribute compared to bash. It was also easier to cross-compile for different OS and ARCH. When I first started using tfenv, a couple of years ago, it didn't provide many options that you see today. It was much more difficult to contribute a feature to the standalone brew project compared to a brew tap project. Taps let you iterate and deploy faster.

The initial goal for tfswitch was to provide a simple drop-down interface for developers to pick whatever terraform version they needed. Over time, more features were contributed. Like all software, both projects has it's pros and cons. I leave it up to users to decide which one best fits their needs.

インストール&セットアップ

mac使用の場合を前提に解説します。

brew コマンドでインストールできます。

brew install warrensbox/tap/tfswitch

tfswitch コマンド経由のterraformインストール時、/usr/local/bin/ への書き込み権限がない場合は $HOME/bin へインストールしようとするため、パスを通しておきます。

export PATH=$PATH:$HOME/bin

また、インストール時に既に事前にterraformがインストールされている状態だと、シンボリックリンクの関係でエラーとなることがあるようです。この場合は、brew unlink コマンドでterraformのシンボリックリンクを削除するとよいかと思います。

...
Error: Cannot install warrensbox/tap/tfswitch because conflicting formulae are installed.
  terraform

Please `brew unlink terraform` before continuing.
...

使い方

tfswitch コマンド単体で実行すると、ドロップダウンメニューが現れ、カーソル選択でバージョンが選べました。

% tfswitch                            
Creating directory for terraform binary at: 
...
Use the arrow keys to navigate: ↓ ↑ → ← 
? Select Terraform version: 
  ▸ 1.3.6
    1.3.5
    1.3.4
    1.3.3
↓   1.3.2

1.3.6のバージョンを選択したところ、使用するterraformのバージョンが切り替わってました。tfswitch コマンドではローカルのcurrentのバージョン確認コマンドなどは特に見当たらなかったので、terraform --version コマンドなどで確認するとよさそうです。

% terraform --version
Terraform v1.3.6
on darwin_arm64

tfswitch {version} コマンドでバージョン決め打ちの切り替えも行えます。

% tfswitch 1.3.6     
...
Switched terraform to version "1.3.6" 

tfswitch -l コマンドではアルファ版・ベータ版・RC版全てのバージョンのリスト表示と切り替えが行えます。

% tfswitch -l
Use the arrow keys to navigate: ↓ ↑ → ← 
? Select Terraform version: 
    1.3.5 *recent
    1.3.6 *recent
    1.3.0 *recent
  ▸ 1.4.0-alpha20221207
↓   1.4.0-alpha20221109

現行の最新のバージョンは tfswitch -U で確認できます。

% tfswitch -U
1.3.6

また、terraformブロックでのバージョン制約のあるtfファイルが存在する階層で

例として下記のようなtfファイルを用意し、バージョンを1.2.0に固定します。

main.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }

  required_version = "1.2.0"
}

provider "aws" {
  region = "ap-northeast-1"
}

現在のバージョンは1.3.6です。

% terraform --version
Terraform v1.3.6
on darwin_arm64

tfswitch コマンドを実行します。自動的にtfファイルで固定している1.2.0に切り替えられました。

% tfswitch      
Reading required version from terraform file
Reading required version from constraint: 1.2.0
Matched version: 1.2.0
...
Switched terraform to version "1.2.0"

おわりに

terraform-switcherは tfswitch コマンドの単体実行でドロップダウンメニューの表示とインタラクティブな操作でバージョン切り替えが行えるので、体験は良かったです。これを機に積極的に使っていこうと思います。

Discussion