繁体   English   中英

如何将 aws_su.net.prod_su.net.*.id 与 aws_su.net.prod2_su.net.*.id 组合成一个列表

[英]How to combine aws_subnet.prod_subnet.*.id with aws_subnet.prod2_subnet.*.id into a single list

我正在尝试合并所有 su.net 以便能够将 ACL 附加到它们。

我有两个存在不同资源名称的 su.net,所以它迫使我有两个我不想要的 ACL 块。

现在,两个 ACL 块的 ACL su.net_id 块读取为:

resource "aws_network_acl" "prod_public" {
  vpc_id = aws_vpc.prod.id
  subnet_ids = aws_subnet.prod_public.*.id
}

resource "aws_network_acl" "prod2_public" {
  vpc_id = aws_vpc.prod.id
  subnet_ids = aws_subnet.prod2_public.*.id
}

这行得通,但我想要一些东西来创建一组 su.net_ids 的列表,这样我就可以成为一个块。

我试过这样的事情,但没有奏效。

resource "aws_network_acl" "prods_public" {
  vpc_id = aws_vpc_prod_id
  subnet_ids = [aws_subnet.prod_public.*.id, aws_subnet.prod2_public.*.id]
}

我也试过使用 tostring 和 toset 也没有用。

你应该使用concat

subnet_ids = concat(aws_subnet.prod_public.*.id, aws_subnet.prod2_public.*.id)

因为这些资源都没有使用count参数,splat 运算符*在这里是多余的,只需为每个资源引用单个 object 就足够了:

resource "aws_network_acl" "prods_public" {
  vpc_id = aws_vpc_prod_id
  subnet_ids = [
    aws_subnet.prod_public.id,
    aws_subnet.prod2_public.id,
  ]
}

使用旧的 splat 运算符.* (或其现代等效项[*] )使 Terraform 将每个 object 转换为包含该 object 的单元素列表,因此在您的示例中,您创建了一个字符串列表列表,而不仅仅是一个列表字符串。

如果您对这些资源使用count ,那么它们的值实际上是列表,因此在这种情况下,将 splat 运算符用于 select 只是每个资源的id属性是合适的,但您需要使用 function将多个列表组合在一起。 因为su.net_ids需要一su.net ID 字符串(su.net 没有有意义的顺序),最清晰的表示方式是使用setunion function,它将生成一组包含所有不同元素的字符串在所有给定的列表中:

resource "aws_network_acl" "prods_public" {
  vpc_id = aws_vpc_prod_id
  subnet_ids = setunion(
    aws_subnet.prod_public[*].id,
    aws_subnet.prod2_public[*].id,
  )
}

使用concat function 也可以,但最终 Terraform 会将其结果转换为一组字符串以传递给su.net_ids ,因此使用concat可能会误导未来的读者,他们可能会认为这意味着 su. net IDs 在某种程度上很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM