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は挙がっているけど, 対応される見込みはなさそう.