使用Terraform时,无法引用terraform_remote_state

这是什么?

在将Terraform模块化时,由于无法读取terrafrom_remote_state中写入的变量而遇到了问题,我将其保存下来。

环境

Terraform 版本为 v0.11.10
提供者为 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中通过输出写入的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を指定する。
}

在这种状态下进行申请,可以写入并引用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.

希望我长时间投入的结构对于其他人也能有帮助。

bannerAds