事象
tfstateをs3に置いて、outputした変数を別環境で使うため下記のように設定した。
terraform {
backend "s3" {
bucket = "hoge-system01-terraform-tfstate"
key = "terraform.tfstate/VPC"
region = "ap-northeast-1"
}
}
output "vpc_id" {
description = "The ID of the VPC"
value = "${module.vpc.vpc_id}"
}
data "terraform_remote_state" "vpc" {
backend = "s3"
config {
bucket = "hoge-system01-terraform-tfstate"
key = "env:/${terraform.workspace}/terraform.tfstate/VPC"
region = "ap-northeast-1"
}
}
output "remote_output" {
value = "${data.terraform_remote_state.vpc.vpc_id}"
}
で、 terraform plan とかすると、下記のエラーがでてremote_stateから値とれない。
$ terraform plan Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. data.terraform_remote_state.vpc: Refreshing state... ------------------------------------------------------------------------ Error: Error running plan: 1 error(s) occurred: * output.remote_output: Resource 'data.terraform_remote_state.vpc' does not have attribute 'vpc_id' for variable 'data.terraform_remote_state.vpc.vpc_id'
原因
色々試したところ、S3のパスに : があるのがよくないっぽい。
試しに terraform_remote_state のパスを下記(env:/ > env/)のようにして、実ファイルも同じとこにおくと、エラーはでなかった。
data "terraform_remote_state" "vpc" {
backend = "s3"
config {
bucket = "hoge-system01-terraform-tfstate"
key = "env/${terraform.workspace}/terraform.tfstate/VPC"
region = "ap-northeast-1"
}
}
output "remote_output" {
value = "${data.terraform_remote_state.vpc.vpc_id}"
}
backendの設定で特に指定しなければworkspace利用時はenv:/〜にtfstateファイルが置かれるっぽい。
解決策
backendの設定に workspace_key_prefix を追加する。
terraform {
backend "s3" {
bucket = "hoge-system01-terraform-tfstate"
key = "terraform.tfstate/VPC"
workspace_key_prefix = "env"
region = "ap-northeast-1"
}
}
これで、変な:が入らない。