こちらの記事のように 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を作る