使用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.
希望我长时间投入的结构对于其他人也能有帮助。