BioErrorLog Tech Blog

試行錯誤の記録

Terraform backendの設定を動的に行う

Terraform stateファイルを格納するバックエンドの情報を動的に設定する方法の備忘録です。

はじめに

Terraformのstateファイルを管理するためのバックエンド(S3/DynamoDBなど)の設定を、Terraformコードとしてハードコードするのではなく、コマンド実行時に動的に設定したいケースがありました。

しかし、Terraformの仕様として、backend設定にはvariableをはじめとした各種変数を使うことができません。

A backend block cannot refer to named values (like input variables, locals, or data source attributes).

Terraformドキュメントより

回避策を見つけたので備忘録にメモします。


# 検証環境
$ terraform -version
Terraform v1.5.3
on darwin_amd64

Terraform backendの設定を動的に行う方法

terraform init時に、-backend-configオプションで指定することができます。

例えば下記のように、Terraformコードとしてはbackendブロックの中身を実装しないままにしたコードを用意します。

terraform {
  required_version = ">= 1.2.7"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 4.28"
    }
  }

  # backend設定そのものは記載しない
  backend "s3" {}
}

上記のコードの状態で、下記のようにコマンドの-backend-configオプションでbackend情報を指定することで、リモート(S3)にstateファイル作成を指定することができます。

terraform init \
  -backend-config="bucket=mybucket" \
  -backend-config="key=backend-demo/terraform.state" \
  -backend-config="region=ap-northeast-1" 

実行結果例:

$ terraform init \
  -backend-config="bucket=mybucket" \
  -backend-config="key=backend-demo/terraform.state" \
  -backend-config="region=ap-northeast-1"

Initializing the backend...

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

Initializing provider plugins...
- Finding hashicorp/aws versions matching ">= 4.28.0"...
- Installing hashicorp/aws v5.75.0...
- Installed hashicorp/aws v5.75.0 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

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.

S3を指定したリモートstateの初期化に成功、この後terraform applyまで成功しました。


ちなみに、-backend-configオプションに渡す値は直接コマンド内で文字列指定するだけでなく、ファイル経由での指定も可能です。

terraform init -backend-config=backend.hcl

# backend.hcl
bucket = "mybucket"
key    = "backend-demo/terraform.state"
region = "ap-northeast-1"

おわりに

以上、コマンドオプション経由でTerraform backend設定を指定する方法をメモしました。

どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

参考