Terraformってすごいツールですよね。ブラウザコンソールとかで一個ずつちまちま作らずともコマンド一発で一連のインフラができてしまいます。
ソースを落としてきてterraform.tfvarsの variable
を編集して terraform init
, terrafrom apply
で構築完了するように設計しようとしていたのですが、ところどころvariableが使えない箇所でハマったので備忘録としてメモ。
TL;DR
- プロバイダーバージョンの指定にはvariableは使えない。
- バックエンドの定義にはvariableは使えない。
-
terraform init
で必要な定義はvariableで指定できない。
プロバイダーのバージョン指定
issueでのコメントによると
provider "aws" {
version = "${var.aws_provider_version}"
region = "${var.aws_region}"
}
このようにproviderのversionのvariableによる定義はダメらしく、
provider "aws" {
version = "~> 2.0"
region = "${var.aws_region}"
}
としないといけない仕様らしい。ここは大人しくハードコーディングにて対応しました...。
バックエンドの定義
terraform.apply
をすると構築したインフラの状態がJSON形式で記された terraform.tfstate
が作成されるが、バックエンドを定義すると、このtfstateファイルをS3バケットなどに保存して管理できる。
terraform {
backend "s3" {
bucket = "${var.bucket_name}"
key = "${var.key}"
region = "${var.region}"
}
}
といきたいところだがこれもやはりダメらしい...
解決策1: 大人しくハードコーディング
一番簡単な解決策。
terraform {
backend "s3" {
bucket = "mybucket"
key = "path/to/terraform.tfstate"
region = "us-east-1"
}
}
この人が「なんでこれハードコーディングせなあかんねん」と代わりに文句を言ってくれている。
解決策2: terraform init
実行時に -backend-config
にて指定
Command-line key/value pairs: Key/value pairs can be specified via the init command line. Note that many shells retain command-line flags in a history file, so this isn't recommended for secrets. To specify a single key/value pair, use the -backend-config="KEY=VALUE" option when running terraform init.
ドキュメントに書いてあるように terrarfom init
実行時に -backend-config
で指定することが可能。
terraform {
backend "s3" {
}
}
としておいて
$ terraform init -backend-config="bucket=backend.bucket" \
-backend-config="key=path/to/terraform.tfstate" \
-backend-config="region=us-east-1"
のように terraform init
を実行。
解決策3: 別ファイルに設定を書く
issueのコメントで言われているように変数を別のファイルに書いておいて terraform init
時に読み込ませる方法がある。
terraform {
backend "s3" {
}
}
bucket = "mybucket"
key = "path/to/terraform.tfstate"
region = "us-east-1"
としておいて
$ terraform init -reconfigure -backend-config=production.tfbackend
のように実行する。
まとめ
variableの値の反映は terraform plan
や terraform apply
などのタイミングで行われるようで terraform init
で必要な定義はvariableで指定できず、ハードコーディングするかそれなりの対応をしないといけない。