Terraform Backends
対象インフラの状態を管理するtfstateファイルをチーム共有・管理するためにbackendを利用する.
例えば,AWS S3をバックエンドに利用する例は以下の通り. これによりS3でtfstateファイルを管理できる.
terraform {
backend "s3" {
bucket = "my-tfstate"
key = "sample-project/prod.tfstate"
region = "ap-northeast-1"
}
required_version = "= 0.12.2"
}
backendにおける設定のカスタマイズ
上記設定においてバケット名やkey(ファイル名)をパラメータ化して実行時に指定したい.
バケット名はGitで公開したくない,keyは開発/検証/本番 環境によって切り替えたい といった要望に対応するため,各種設定項目に変数を利用したい. 場合によってはアクセスキーやシークレットキーの指定も必要で, その場合は特にGit以外で管理する必要がある.
これを解決するために,パラメータ部分に変数を利用したい
tf_backend_bucket = "my-ftstate" tf_backend_key = "sample-project/prod.tfstate"
variable "tf_backend_bucket" {}
variable "tf_backend_key" {}
terraform {
backend "s3" {
bucket = var.tf_backend_bucket
key = var.tf_backend_key
region = "ap-northeast-1"
}
required_version = "= 0.12.2"
}
しかし,このような方法でterraformを実行してもエラーになる. backendの設定には変数は利用できない.
$ terraform init Error: Variables not allowed on main.tf line 3, in terraform: 3: bucket = var.tf_backend_bucket Variables may not be used here. Error: Variables not allowed on main.tf line 4, in terraform: 4: key = var.tf_backend_key Variables may not be used here.
解決策
バックエンドのパラメータ化には変数ではなく
Partial Configuration
を利用する.
Partial Configurationでは,terraform init実行時のオプションとして -backend-config を指定する.
-backend-config=path This can be either a path to an HCL file with key/value
assignments (same format as terraform.tfvars) or a
'key=value' format. This is merged with what is in the
configuration file. This can be specified multiple
times. The backend type must be in the configuration
itself.
key=value 形式で指定するなら以下の通り:
$ terraform init -backend-config="bucket=my-tfstate" \
-backend-config="key=sample-project/prod.tfstate"
設定ファイルに書くなら以下の通り:
$ terraform init -backend-config="backend.tfvars"
bucket="my-tfstate" key="sample-project/prod.tfstate"
このとき,backendの設定は空欄とする.
terraform {
backend "s3" {
region = "ap-northeast-1"
}
required_version = "= 0.12.2"
}
あらかじめデフォルト値を設定しておいてもよい.
-backend-configオプションで指定すると上書きできる.
また,tfファイルで未設定のまま-backend-configで指定しないと
インタラクティブに入力が求められる.
backendに Partial Configurationではなく 変数を利用したいというIssueは挙がっているけど, 対応される見込みはなさそう.