その1はこちら。

今回は、前回ローカルに生成された state ファイルを Terraform Cloud へ移行していきます。
引き続き以下リポジトリの内容をベースに進めます。

準備

まずは Terraform Cloud のアカウントを作成します。
アカウント作成と最低限の機能利用については無料で、あとはユーザ数とか利用したい機能によって料金が変わるといった感じです。

アカウント作成時、Organization も作成する必要があるので、合わせて作成します。
その後「New Workspace」から Workspace も作成します。

コード修正

まずは Terraform CLI で利用するトークンを発行します。
ページ右上のユーザアイコンから「User settings」->「Tokens」->「Create an API token」からトークンを発行します。

続いて ~/.terraformrc を編集します(無ければ作成してください)。

credentials "app.terraform.io" {
  token = "<発行したトークン>"
}

最後に main.tf を修正します。

terraform {
  required_version = "~> 1.0"

+  backend "remote" {
+    organization = "<作成した Organization>"
+
+    workspaces {
+      name = "<作成した Workspace>"
+    }
+  }

  required_providers {
    github = {
      source  = "integrations/github"
      version = "~> 4.0"
    }
  }
}

コマンド実行

$ terraform init 

Initializing the backend...

Successfully configured the backend "remote"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
- Reusing previous version of integrations/github from the dependency lock file
- Using previously-installed integrations/github v4.16.0

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

このとき、Terraform Cloud で作成した Workspace 側と Terraform CLI のバージョンが異なっているとエラーになります。
その場合は「対象の Workspace を選択」->「Settings」->「Terraform Version」でお使いの Terraform CLI のバージョンと合わせてください。

$ terraform init # ローカルでは 1.0.6 を使っているが、Terraform Cloud の Workspace では 1.0.8 を指定している

Initializing the backend...
╷
│ Error: Error loading state:
│     Remote workspace Terraform version "1.0.8" does not match local Terraform version "1.0.6"
│ 
│ Terraform failed to load the default state from the "remote" backend.
│ State migration cannot occur unless the state can be loaded. Backend
│ modification and state migration has been aborted. The state in both the
│ source and the destination remain unmodified. Please resolve the
│ above error and try again.
│ 
│ 

これで state ファイルが Terraform Cloud 上で管理されるようになりました。
「対象の Workspace を選択」->「States」で確認することができます。

Terraform Cloud 上に state が保存されることで、Terraform Cloud から terraform plan を実行することもできます。

その際、対象となる Workspace から

  • 「Variables」->「Terraform Variables」に variables.tf に定義した値を設定
  • 「Variables」->「Environment Variables」に環境変数(今回だと GITHUB_*)の値を設定

を設定のうえ、「Runs」->「Actions」->「Start new plan」で terraform plan が実行されるはずです。

まとめ

私も Terraform Cloud を使うようになったのは最近ですが、複数リポジトリの state ファイルや実行状況が一元管理できるのはかなり便利だと感じています。
Terraform 自体は今回の GitHub のように普段開発で使っているツールについての設定もコード化できるので、今後も色々なところで使っていきたいと思っています。
扱えるものについてはこちらでも確認できるので、是非一度ご覧ください。