azure - 获取 terraform 中可能的出站 IP 地址列表

标签 azure terraform azure-function-app

我正在尝试使用 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/

相关文章:

javascript - 如何在azure服务总线中完成消息

Azure Function Host 在 URI 路径无效的情况下给出消息 :

Azure MobileServiceSync – 如何删除多部手机之间的本地存储记录?

java - 如何从 Azure Blob 获取所有文件并压缩它们?

azure - 在 Terraform 中通过 WinRM 连接到远程主机失败

Azure函数应用程序: Error when loading V3 in portal for fresh function app?

Azure DevOps 动态发布管道创建

azure - 在 ARM 模板中隐藏新的 vNet 选项

Terraform:如何阅读 map 列表?

unit-testing - Terratest - 使用模拟 AWS 服务