我正在尝试使用 terraform 中的 azure 函数应用程序的导出来获取可能的出站 IP 地址,我可以将其添加到防火墙的白名单中
返回的参数是ips逗号分隔的字符串。
我尝试过在 terraform 中使用 split 函数,但它没有给出列表,它给出了一个不能用作列表的界面。我尝试过使用本地范围在其周围添加方括号,但仍然相同。
让我补充一下,这是 terraform 11 而不是 12。
resource "azurerm_key_vault" "keyvault" {
name = "${var.project_name}-${var.environment}-kv"
location = "${azurerm_resource_group.environment.location}"
resource_group_name = "${azurerm_resource_group.environment.name}"
enabled_for_disk_encryption = true
tenant_id = "${var.tenant_id}"
sku_name = "standard"
network_acls {
bypass = "AzureServices"
default_action = "Deny"
ip_rules = "${split(",", azurerm_function_app.function.possible_outbound_ip_addresses)}"
}
tags = {
asset-code = "${var.storage_tags["asset_code"]}"
module-code = "${var.storage_tags["module_code"]}"
environment = "${var.environment}"
instance-code = "${var.storage_tags["instance_code"]}"
source = "terraform"
}
}
返回错误“ip_rules 必须是列表”。
谢谢
最佳答案
我认为您在这里看到的是一个经典的 Terraform 0.11 设计缺陷:当一个值在计划时未知时(因为它仅在应用期间决定),Terraform 0.11 无法正确跟踪它的类型信息。
由于 possible_outbound_ip_addresses
在规划时是未知值,因此使用该字符串进行split
的结果也是未知的。由于 Terraform 不会跟踪该结果的类型信息,因此提供程序 SDK 代码会拒绝该未知值,因为它不是列表。
要在 Terraform 0.11 中解决此问题,需要使用 -target
参数进行初始运行,以便 Terraform 可以首先专注于创建函数(从而分配其出站 IP 地址),然后处理一旦知道该字符串,就分别对其进行处理:
terraform apply -target=azurerm_function_app.function
terraform apply # to complete the rest of the work that -target excluded
Terraform 0.12 通过跟踪已知和未知值的类型信息解决了此限制,因此在 Terraform 0.12 中,split
函数会看到您为其提供了一个未知字符串,并接受该字符串为正确类型,然后它会返回一个未知的字符串列表,作为结果的占位符,该结果将在应用阶段最终确定。
关于azure - 获取 terraform 中可能的出站 IP 地址列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61379551/