Help us understand the problem. What is going on with this article?

Terraformでterraform_remote_stateが参照できない

これは何?

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.

結構長い時間ハマっていたので、同じような誰かの助けになれば幸いです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away