Terraform

TerragruntでTerraform Cloudのworkspaceを自動作成する

こちらの記事のように Terraform のバックエンドを Terraform Cloud の(ローカル実行モードの)ワークスペースとした場合、Terraform 実行前にあらかじめワークスペース自体を作成しておく必要があります。

さらにこちらの記事のように Terraform の状態情報をモジュール毎に分割管理する場合、そのモジュール数分ワークスペースが必要になるためワークスペースを自動で作成する仕組みがないとツラくなってきます。

今回はその対応策として Terragrunt実行時に Terraform Cloud API を使用して Terraform Cloud の ワークスペースを自動的に作成してみます。

スポンサーリンク

前提

いくつか事前準備が必要となります。

Terraform Cloudの設定

以下の記事を参考にしながら、組織を作成してAPI用トークンを発行してください。

~/.terraform.d/credentials.tfrc.json にAPI用トークンが保存されている状態にしてください。

tfenv, tgenvのインストール

以下の記事を参考にしながら tfenv, tfenv をインストールしてください。Terraform と Terragrunt 本体は後でインストールします。

Terragruntでワークスペースの自動作成

サンプルコード説明

今回使用するTerragruntのソースコードをこちらのGitHubにコミットしました。

ファイル構成やTerragruntの構文などの基本的な説明については、以下の記事をご参照ください。

terragrunt.hcl

今回は terragrunt.hcl から terraform の vpcモジュールを呼び出すというシンプルな構成になっています。

locals ブロックでは、ソース内で使い回す各種変数を設定しています。

generate ブロックでは Terraform Cloud の workspace へ Terraform の状態情報を保存する設定をしています。

肝となるのは以下の部分になります。

  after_hook "init" {
    commands = ["init"]
    execute  = ["curl", "-s", "-o", "/dev/null", "-H", "Authorization: Bearer ${local.token}",  "-H", "Content-Type: application/vnd.api+json",  "-X", "PATCH",  "-d", "{\"data\": { \"attributes\": { \"execution-mode\": \"local\"  },\"type\": \"workspaces\" }}" ,"${local.terraform-cloud-api-endpoint}"]
  }

Terragrunt の after_hook の機能を使い init実行後に自動的に curlコマンドで Terraform Cloud API のエンドポイントへリクエストを送り workspace を作成するようにしています。

modules/vpc/main.tf

demo-vpc という名前で vpc を作成します。

Terragrunt実行

サンプルコードのダウンロードとTerraform, Terragruntのインストール

$ git clone git@github.com:zoo200/blog.git
...
$ cd blog/terragrunt-create-terraform-cloud-workspace/
$
$ tfenv install
...
$
$ tgenv install
...
$

terragrunt.hcl の組織名の修正

$ vi terragrunt.hcl
...
  ## Terraform Cloudの組織名を設定
  organization="zoo200-demo"      -> この組織名をご自身の組織名に修正します
...
$

Terragruntの実行

まず init コマンドでワークスペースを作成してから apply コマンドで vpc を作成します。

$ terragrunt init
...
INFO[0005] Executing hook: init                          prefix=[/Users/zoo200/blog/202204xx_terraform_cloud/blog/terragrunt-create-terraform-cloud-workspace]
$
$ terragrunt apply
...
$

Terraform Cloud workspace の確認

以下のようにvpc ワークスペースが作成されており、ワークスペース名をクリック → [ Settings ]タブ → [ General ] の [ Execution Mode ] が Local になっていることが確認できます。

Tips

Terraform Cloud/Enterprise Provider というTerraform のプロバイダがあり、こちらを利用してもワークスペースは作成できます。

ただニワトリとタマゴではないですが、さすがに(ローカル実行モードの)ワークスペースをAWSリソースと同時に作成することはできませんでした。

そのためAWS構築用のTerraformとは別に、ワークスペース作成用のTerraformであらかじめワークスペース自体を作成しておくことが必要になると思います。

今回は以上です〜ノシ

参考

(´・ω・`)ゞアリガトゴザイマス.。.・゚

Workspaces API
Create workspace with local execution mode from CLI
Terraform CloudのWorkspaceを作る