LoginSignup
8
1

More than 5 years have passed since last update.

Terraformでterraform_remote_stateが参照できない

Posted at

これは何?

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.

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

8
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1