使用 Terraform 和 map 的多个源的 Azure Function AppSettings

标签 azure function terraform settings azure-keyvault

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

  1. 第一个来源是自定义设置的映射,将手动或通过可能几乎没有变化的代码进行维护
  2. 应用设置映射的第二个来源是关键 secret URI,如之前的代码所示,这使得 azure 函数能够使用 secret 引用作为配置值。

我正在尝试自动化从 keyvault 动态检索 secret 子集并将其合并到我在代码中定义的自定义 map 应用程序设置中的过程。

问题: 我的理想世界是我更新动态创建的列表 secretKeys 和 map 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://learn.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://learn.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 block :

    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})"
        }
    }

key 保管库 secret 的数据将返回一个包含如下元素的列表:

enter image description here

所以你不能用 secret 名称引用它。按照我向您展示的方式进行即可。

关于使用 Terraform 和 map 的多个源的 Azure Function AppSettings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63326247/

相关文章:

c - C 中的一个程序,用于获取前两个小于给定数字的斐波那契数

function - main 函数不会在 haskell 中接受任何参数

python - 在 Python 项目中搜索递归函数

go - 使资源架构依赖于另一个变量

amazon-web-services - AWS 中的 Cloudformation/Serverless 与 Terraform

azure - 由于服务连接错误而无法完成 - Azure AD

azure - 功能较少的多功能应用程序或功能较多但功能较少的应用程序?

c# - 无法通过 Azure Function App 连接到 Azure Analysis Services - 无法加载类型 'System.Security.Principal.WindowsImpersonationContext'

sql-server - BDE 和 AZURE SQL 数据库

amazon-web-services - Terraform:在另一个资源中引用在 for_each 中创建的资源