[英]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.