terraform版本0.11.13
错误:错误刷新状态:发生1次错误:
VPC代码生成了上面的错误:
resources.tf
data "aws_subnet_ids" "private_subnet_ids" {
vpc_id = "${module.vpc.vpc_id}"
}
data "aws_subnet" "private_subnet" {
count = "${length(data.aws_subnet_ids.private_subnet_ids.ids)}"
#count = "${length(var.private-subnet-mapping)}"
id = "${data.aws_subnet_ids.private_subnet_ids.ids[count.index]}"
}将上面的代码更改为count =“${length(var.私有子网映射)}”,我成功地提供了VPC。但是,vpc_private_subnets_ids的输出是空的。vpc_private_subnets_ids = []
代码配置了VPC,但得到了vpc_private_subnets_ids的空列表:
resources.tf
data "aws_subnet_ids" "private_subnet_ids" {
vpc_id = "${module.vpc.vpc_id}"
}
data "aws_subnet" "private_subnet" {
#count = "${length(data.aws_subnet_ids.private_subnet_ids.ids)}"
count = "${length(var.private-subnet-mapping)}"
id = "${data.aws_subnet_ids.private_subnet_ids.ids[count.index]}"
}
outputs.tf
output "vpc_private_subnets_ids" {
value = ["${data.aws_subnet.private_subnet.*.id}"]
}
The output of vpc_private_subnets_ids:
vpc_private_subnets_ids = []我需要vpc_private_subnets_ids的值。在成功配置VPC使用行,count =“${length(var.Private-subnet)}”之后,我将代码改为count = "${length(data.aws_subnet_ids.private_subnet_ids.ids)}".terraform,我得到了列表vpc_private_subnets_ids的值,没有上面的错误。
vpc_private_subnets_ids = [
subnet-03199b39c60111111,
subnet-068a3a3e76de66666,
subnet-04b86aa9dbf333333,
subnet-02e1d8baa8c222222
......
]当我提供VPC时,我不能使用count = "${length(data.aws_subnet_ids.private_subnet_ids.ids)}“。但是,我可以在VPC准备好后使用它。有线索吗?
发布于 2020-09-02 00:01:40
这里的问题似乎是您的VPC还没有创建,所以data "aws_subnet_ids" "private_subnet_ids"数据源读取必须等到应用步骤,这就意味着子网的数量是未知的,因此data "aws_subnet" "private_subnet"实例的数量是不可预测的,Terraform返回此错误。
如果这个配置也是负责创建这些子网的配置,那么更好的设计就是直接引用子网对象。如果您的module.vpc也是创建子网的模块,那么我建议导出子网ids作为该模块的输出。例如:
output "subnet_ids" {
value = "${aws_subnet.example.*.id}"
}然后,您的调用模块可以直接从module.vpc.subnet_ids获取这些ids,而不需要额外的冗余API调用来查找它们:
output "vpc_private_subnets_ids" {
value = ["${module.vpc.subnet_ids}"]
}除了有关count的错误之外,您展示的配置还有一个争用条件,因为data "aws_subnet_ids" "private_subnet_ids"块只依赖于VPC本身,而不依赖于各个VPC,因此Terraform可以在子网创建之前读取该数据源。通过模块输出导出子网ids意味着,对module.vpc.subnet_ids的任何引用都间接地依赖于所有子网,因此这些下游操作将等到所有子网创建完毕。
通常情况下,特定的Terraform配置要么是管理对象,要么是通过数据源读取该对象,而不是两者同时进行。如果同时使用这两种方法,那么有时可能会起作用,但很容易无意中引入这样的争用条件,其中Terraform无法判断data资源正在尝试使用参与同一计划的另一个resource块的结果。
https://stackoverflow.com/questions/63679395
复制相似问题