これは何?
Terraformでモジュール化する際に、terraform_remote_stateに書き込まれている変数を読めずにハマったので残しておきます。
環境
Terraform v0.11.10
provider.aws v2.7.0
何が問題だったのか
terraformはmain.tfのoutputをterraform_remote_stateに書き出します。
moduleの中でoutputしておけば勝手にmoduleに書き出してくれて、それを他のmoduleから参照できると思っていたことが間違いでした。
moduleを参照した先(ここで言うところのmain.tf)と同じ場所にoutput.tfを作りapplyすると、terraform_remote_stateに書き出してくれます。
こういうディレクトリ構成で、
.
├── main.tf
├── modules
│ └── vpc
│ ├── README.md
│ ├── output.tf
│ ├── variable.tf
│ └── vpc.tf
└── provider.tf
こういう実装をしているとします。
## main.tf
module "vpc" {
source = "./modules/vpc"
}
output "sample" {
value = "${data.terraform_remote_state.state.vpc_id}"
}
## modules/vpc/vpc.tf
resource "aws_vpc" "vpc" {
cidr_block = "10.0.0.0/16"
tags {
Environment = "${terraform.workspace}"
}
}
output "vpc_id" {
value = "${aws_vpc.vpc.id}"
}
modules/vpc/vpc.tfでoutputに出力したvpc_idをterraform_remote_stateに書き込み、それを別の場所から参照したい。
これを実行すれば、terraform_remote_stateに書き込んでくれると思っていました。が、実際は書き込まれません。以下のようなエラーを受け取ります。
$ terraform apply
data.terraform_remote_state.state: Refreshing state...
data.terraform_remote_state.state: Refreshing state...
Error: Error running plan: 1 error(s) occurred:
* output.sample: Resource 'data.terraform_remote_state.state' does not have attribute 'vpc_id' for variable 'data.terraform_remote_state.state.vpc_id'
terraform_remote_stateに書き込むためには、moduleを参照した先(ここで言うところのmain.tf)と同じ場所にoutput.tfを作る必要があります。
.
├── main.tf
├── output.tf ## このファイルを追加
├── modules
│ └── vpc
│ ├── README.md
│ ├── output.tf
│ ├── variable.tf
│ └── vpc.tf
└── provider.tf
## output.tf
output "vpc_cidr_block" {
value = "${module.vpc.vpc_cidr_block}" ## ここではmoduleのoutputを指定する。
}
この状態でapplyするとterraform_remote_stateが書き込まれ、参照することが出来ます。
以上についてのドキュメントは以下に書かれています。
https://www.terraform.io/docs/providers/terraform/d/remote_state.html#root-outputs-only
Only the root-level outputs from the remote state are accessible.
Outputs from modules within the state cannot be accessed.
If you want a module output or a resource attribute to be accessible via a remote state, you must thread the output through to a root output.
結構長い時間ハマっていたので、同じような誰かの助けになれば幸いです。