我正在为 AWS 和 Azure 使用一个 Terraform 文件。这取决于变量的值,我部署到AWS或Azure。对于解决方案,我使用“计数”。
但是在一个地方我遇到了问题。
对于AWS,在for_each构造中必须使用[],但对于azure我必须使用{}。
data "aws_subnet_ids" "selected_es" {
count = local.current_provider == "aws" ? 1 : 0
vpc_id = data.aws_vpc.selected_es[0].id
}
data "aws_subnet" "selected_es" {
for_each = local.current_provider == "aws" ? data.aws_subnet_ids.selected_es[0].ids : []
id = each.value
}
我知道,在 AWS 的变体中,我有一个带有 IP 的数组。对于 Azure,我有另一种类型。但我不明白,我该如何解决我的问题。
一些描述。目前,仅当我对 Azure 和 AWS 使用单独的代码部分时才有效:
1 个变体。 local.current_provider = aws。
我们的“data.aws_subnet_ids.selected_es[0].ids”是数组。
在我的 foreach 中我必须使用
for_each = local.current_provider == "aws" ? data.aws_subnet_ids.selected_es[0].ids : []
2 变体。 local.current_provider = 天蓝色。
我们的“data.aws_subnet_ids.selected_es[0].ids”不是数组(因为数据源中的计数将为 0)。
在我的 foreach 中我必须使用
for_each = local.current_provider == "aws" ? data.aws_subnet_ids.selected_es[0].ids : {}
但我想对 2 个变体使用一个代码。 我无法使用
data "aws_subnet" "selected_es" {
count local.current_provider == "aws" ?1:0
for_each = data.aws_subnet_ids.selected_es[0].ids
id = each.value
}
解决这个问题的方法是将值转换为字符串,这样 Terraform 就可以像这样运行:
jsondecode(local.current_provider == "aws" ? jsonencode([]) : jsonencode({}))