首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >terraform: data.aws_subnet,无法计算“计数”的值

terraform: data.aws_subnet,无法计算“计数”的值
EN

Stack Overflow用户
提问于 2020-08-31 23:20:07
回答 1查看 2.1K关注 0票数 0

terraform版本0.11.13

错误:错误刷新状态:发生1次错误:

  • data.aws_subnet.private_subnet: data.aws_subnet.private_subnet:无法计算“计数”的值

VPC代码生成了上面的错误:

代码语言:javascript
复制
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的空列表:

代码语言:javascript
复制
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的值,没有上面的错误。

代码语言:javascript
复制
vpc_private_subnets_ids = [
    subnet-03199b39c60111111,
    subnet-068a3a3e76de66666,
    subnet-04b86aa9dbf333333,
    subnet-02e1d8baa8c222222
    ......
]

当我提供VPC时,我不能使用count = "${length(data.aws_subnet_ids.private_subnet_ids.ids)}“。但是,我可以在VPC准备好后使用它。有线索吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-02 00:01:40

这里的问题似乎是您的VPC还没有创建,所以data "aws_subnet_ids" "private_subnet_ids"数据源读取必须等到应用步骤,这就意味着子网的数量是未知的,因此data "aws_subnet" "private_subnet"实例的数量是不可预测的,Terraform返回此错误。

如果这个配置也是负责创建这些子网的配置,那么更好的设计就是直接引用子网对象。如果您的module.vpc也是创建子网的模块,那么我建议导出子网ids作为该模块的输出。例如:

代码语言:javascript
复制
output "subnet_ids" {
  value = "${aws_subnet.example.*.id}"
}

然后,您的调用模块可以直接从module.vpc.subnet_ids获取这些ids,而不需要额外的冗余API调用来查找它们:

代码语言:javascript
复制
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块的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63679395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档