使用 Terraform 和多个地图源的 Azure Function AppSettings

Azure Function AppSettings using Terraform and mutliple sources for map

所以总而言之,我特别希望使用两个不同的来源来维护我的 azure 函数的应用程序设置,

  1. 第一个来源是自定义设置的地图,将手动或通过可能几乎没有变化的代码维护
  2. 应用程序设置映射的第二个来源是根据之前的代码的密钥 uri,这使 azure 函数能够使用秘密引用作为配置值。

我正在尝试自动执行从 keyvault 动态检索机密子集并将其合并到我在代码中定义的自定义地图应用程序设置的过程。

问题: 我的理想世界是更新列表 secretKeys 和地图 appSettingsSecretsMap 动态创建,然后在其应用程序设置中通过资源创建 resource "azurerm_function_app" "functionApp_workerFunctions" 使用。有谁知道我如何更动态地实现这一点?

我的完整代码如下:


variable "secretKeys" {
  type = list(string)
  default = [
    "TestDbPassword",
    "TestDbUserId"]
}

data "azurerm_key_vault" "keyvault" {
  name                = "source-keyvault"
  resource_group_name = "source-keyvault-rg"
}

data "azurerm_key_vault_secret" "kvSecrets" {
  for_each = toset(var.secretKeys)
  name         = each.key
  key_vault_id = data.azurerm_key_vault.keyvault.id
}

# Testing Access to secret
output "TestDbPassword" {
    value = data.azurerm_key_vault_secret.kvSecrets["TestDbPassword"].id
} 

#https://docs.microsoft.com/en-us/azure/app-service/app-service-key-vault-references
variabe "appSettingsSecretsMap" {    
    type = map
    default = {
        DBPassword = "@Microsoft.KeyVault(SecretUri=${data.azurerm_key_vault_secret.kvSecrets["TestDbPassword"].id})"
        DBUserId = "@Microsoft.KeyVault(SecretUri=${data.azurerm_key_vault_secret.kvSecrets["TestDbUserId"].id})"
    }
}

# Reference for appSettings https://docs.microsoft.com/en-us/azure/azure-functions/functions-app-settings
variable "appSettingsCustomMap" {
  type = map
  default = {
    WEBSITE_RUN_FROM_PACKAGE       = ""
    FUNCTIONS_WORKER_RUNTIME       = ""
    APPINSIGHTS_INSTRUMENTATIONKEY = ""
    #FUNCTIONS_EXTENSION_VERSION = "~1"
  }
}


resource "azurerm_function_app" "functionApp_workerFunctions" {
  name                       = "worker-function-${var.ENVIRONMENT}"
  location                   = "XYZ-Example"
  resource_group_name        = "XYZ-Example"
  app_service_plan_id        = "XYZ-Example"
  storage_account_name       = "XYZ-Example"
  storage_account_access_key = "XYZ-Example"
  app_settings               = merge(var.appSettingsMap, var.appSettingsSecretsMap)
}

  1. 对于自定义设置,我觉得最好手动设置在变量中。它有很多东西,只有一点点变化。如果你让它自动化,我认为它会有点冗余。就像你在问题中展示的那样去做。

  2. 按键故障,推荐使用locals块:

    locals {
        appSettingsSecretsMap = {
            DBPassword = "@Microsoft.KeyVault(SecretUri=${data.azurerm_key_vault_secret.kvSecrets[0].id})"
        DBUserId = "@Microsoft.KeyVault(SecretUri=${data.azurerm_key_vault_secret.kvSecrets[1].id})"
        }
    }

密钥保管库机密的数据将 return 包含如下元素的列表:

所以你不能用秘密名称引用它。照我给你做的做。