簡體   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