Terraform为安全组获取私有子网

Terraform为安全组获取私有子网,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我试图在我的VPC中获取私有子网,我使用Terraform文档中的一个示例,但这给了我错误 这是我的代码(我注释掉了过滤器,所以应该得到所有子网-我的vpc有3个公共子网和3个私有子网) 我在id=data.aws\u subnet\u ids…行中得到一个错误 我得到以下错误6次,每个索引1次 错误:索引无效 在modules/global/data.tf第20行的数据“aws_子网”示例中: 12:id=data.aws\u subnet\u ids.example.ids[count.in

我试图在我的VPC中获取私有子网,我使用Terraform文档中的一个示例,但这给了我错误

这是我的代码(我注释掉了过滤器,所以应该得到所有子网-我的vpc有3个公共子网和3个私有子网)

我在
id=data.aws\u subnet\u ids…
行中得到一个错误

我得到以下错误6次,每个索引1次

错误:索引无效
在modules/global/data.tf第20行的数据“aws_子网”示例中:
12:id=data.aws\u subnet\u ids.example.ids[count.index]
|----------------
|计数。索引是5
|data.aws_subnet_ids.example.ids是一组包含6个元素的字符串
此值没有任何索引。
我正在使用HCL2,但只是为了防止我对所有具有相同结果的语句恢复到以前的插值(
“${data.aws\u subnet\u ids.example.ids[count.index]}”

帮忙

多谢各位

$terraform--版本
地形v0.12.7
+provider.aws v2.25.0
+provider.template v2.1.2

aws子网ID的输出是一个集合,而不是列表。您需要将其转换为列表。您可以使用
tolist
功能实现这一点

您的代码可以更新如下:

data "aws_subnet" "example" {
  count = length(data.aws_subnet_ids.example.ids)
  id    = tolist(data.aws_subnet_ids.example.ids)[count.index]
}
然后可以在
aws\u子网
数据中安全地迭代子网列表。但请注意一点:

将设置值传递给tolist以将其转换为列表。由于集合元素没有顺序,因此结果列表将具有未定义的顺序,该顺序将在特定的Terraform运行中保持一致


这意味着,如果您正在访问特定的子网,它们将在
aws\u子网中重新排序。示例
在Terraform plan生成之间的列表。

还可以将该设置值直接用作每个
参数的
,其优点是
aws\u子网。示例
将是子网id到主题对象的映射,而不是按id按词法顺序列出子网对象。
data "aws_subnet" "example" {
  count = length(data.aws_subnet_ids.example.ids)
  id    = tolist(data.aws_subnet_ids.example.ids)[count.index]
}