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 -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設定を指定する方法をメモしました。
どなたかの参考になれば幸いです。
[関連記事]