MacにOpenTofu & Terraform の一元管理 (tenv)

AWS

macOS上で「GitHubの2つのアカウントを使い分けながら、OpenTofuとTerraformの両方を自在に扱える環境」を、最初から完全に整理した決定版の構築手順です。

今回は、OpenTofuとTerraformの両方を1つのツールでスマートに一元管理できる tenv というツールをベースに解説します。上から順番に進めれば、競合のない完璧な開発環境が完成します。

1. 開発環境の土台作り (Homebrew)

すべてのツールをインストールするためのパッケージ管理ツール「Homebrew」を導入します。

1-1. インストールコマンドの実行 ターミナルを開き、以下のコマンドを実行します。

Bash

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

※途中、Macのログインパスワードを求められます(画面には表示されませんが、入力してEnter)。

1-2. パス(Path)を通す インストール完了後、画面の指示に従って以下の2行を1行ずつ実行します(M1〜M4などのApple Silicon Macで必須)。

Bash

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

brew --version と叩いてバージョンが表示されれば土台は完了です。

2. OpenTofu & Terraform の一元管理 (tenv)

実務ではプロジェクトによって「OpenTofu」「Terraform」、さらにそれぞれの「バージョン」を使い分ける必要があります。これらを一括管理できる tenv を導入します。

2-1. tenvのインストール

Bash

brew install tenv

2-2. OpenTofu と Terraform のインストール 最新の安定版をそれぞれインストールし、デフォルトで使用できるように設定します。

Bash

# --- OpenTofu の設定 ---
tenv tofu install latest
tenv tofu use latest

# --- Terraform の設定 ---
tenv tf install latest
tenv tf use latest

2-3. プロジェクトごとのバージョン固定方法 特定のプロジェクトのディレクトリに移動し、バージョンを指定するだけで、そのフォルダ内だけ自動でバージョンが切り替わります。

Bash

cd /path/to/project

tenv tofu use 1.7.2  # このフォルダは OpenTofu 1.7.2 に固定
# または
tenv tf use 1.5.7    # このフォルダは Terraform 1.5.7 に固定

※コマンドを実行すると、フォルダ内に .tofu-version.terraform-version というファイルが生成され、自動切り替えが有効になります。

3. GitHub 複数アカウントの自動切り替え設定

個人用(アカウントA)と仕事用(アカウントB)を、「フォルダの場所」によって自動で切り替える仕組みを作ります。

3-1. SSHキーの作成

Bash

# アカウントA用(メイン)
ssh-keygen -t ed25519 -C "account_a@example.com" -f ~/.ssh/id_ed25519_github_a

# アカウントB用(仕事用・サブ)
ssh-keygen -t ed25519 -C "account_b@example.com" -f ~/.ssh/id_ed25519_github_b

3-2. GitHubへ公開鍵の登録

それぞれの公開鍵の中身を確認・コピーし、各GitHubアカウントの [Settings] > [SSH and GPG keys] に登録します。

Bash

cat ~/.ssh/id_ed25519_github_a.pub  # アカウントAに登録
cat ~/.ssh/id_ed25519_github_b.pub  # アカウントBに登録

3-3. ~/.ssh/config の設定

ファイル(~/.ssh/config)を作成または開き、以下を記述します。

Plaintext

# --- アカウントA (メイン) ---
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_a

# --- アカウントB (サブ) ---
Host github.com-b
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_b

3-4. ディレクトリに応じたGit設定の自動切り替え

仕事用のプロジェクトを集約する専用フォルダ(例:~/work/)を作成します。

① 全体のデフォルト設定(アカウントA):~/.gitconfig 既存の .gitconfig に以下を追記します。

Ini, TOML

[user]
    name = Your Name A
    email = account_a@example.com

# ~/work/ 配下のディレクトリでは、別のアカウントB用設定を読み込む
[includeIf "gitdir:~/work/"]
    path = ~/work/.gitconfig-b

② 仕事用フォルダ専用の設定:~/work/.gitconfig-b 新しくファイルを作成し、仕事用のアカウント情報を記述します。

Ini, TOML

[user]
    name = Your Name B
    email = account_b@example.com

4. VS Code の最適化設定

OpenTofu と Terraform のコード(.tf ファイル)を快適に記述・管理するための設定です。

4-1. 必須の拡張機能

VS Codeの拡張機能マーケットプレイスから以下をインストールします。

  1. OpenTofu (公式の構文ハイライト・補完ツール)
  2. HashiCorp Terraform (Terraform用の公式拡張機能)

4-2. 保存時の自動整形(Format on Save)

VS Codeの settings.json(設定ファイル)を開き、ファイル保存時に自動でインデントやコードが綺麗に整う(tofu fmt / terraform fmt)ように以下を追記します。

JSON

"[opentofu]": {
    "editor.defaultFormatter": "opentofu.opentofu",
    "editor.formatOnSave": true
},
"[terraform]": {
    "editor.defaultFormatter": "hashicorp.terraform",
    "editor.formatOnSave": true
}

4-3. GitHubアカウントのサインイン

VS Codeの左下にある人型アイコンから、アカウントAとアカウントBの両方でGitHubにサインインしておきます。仕事用フォルダ(~/work/)を開いているときは、設定の「ワークスペース」タブから、優先アカウント(Preferred Account)をアカウントBに指定しておくと、Copilot等のライセンス競合が防げます。

5. 日常の開発ワークフロー(逆引きチートシート)

環境構築完了後の、日々の操作手順です。

Q. 新しい仕事用(アカウントB)のリポジトリを始めるには?

  1. ターミナルで ~/work/ に移動します。
  2. GitHubからコピーしたURLの github.com の部分を github.com-b に手動で書き換えてクローンします。Bashcd ~/work/ git clone git@github.com-b:Organization/work-repo.git
  3. クローンしたフォルダを VS Code で開きます。以降のコミットやプッシュはVS CodeのGUI操作で自動的に仕事用アカウントが適用されます。

Q. このプロジェクト、OpenTofuだっけ? Terraformだっけ?

それぞれのコマンドを叩けば、tenv が自動判別して現在のバージョンを返してくれます。

Bash

tofu --version
tf --version

Q. 実行するコマンドは?

プロジェクトのツール指定に合わせて、通常通り実行します。

  • OpenTofuの場合: tofu inittofu plantofu apply
  • Terraformの場合: terraform initterraform planterraform apply

これですべてのインフラコードを、アカウントの切り替えミスなく安全に、かつバージョンを自在に操りながら開発できるようになりました!

コメント