【问题标题】:Azure Function AppSettings using Terraform and mutliple sources for mapAzure Function AppSettings 使用 Terraform 和地图的多个来源
【发布时间】:2020-11-29 05:37:48
【问题描述】:

总之,我特别希望使用两个不同的来源来维护我的天蓝色功能的应用设置,

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

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

问题: 我的理想世界是我更新列表secretKeys 和地图appSettingsSecretsMap 得到动态创建,然后在其appsettings 中由资源创建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)
}

【问题讨论】:

    标签: azure function terraform settings azure-keyvault


    【解决方案1】:
    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})"
            }
        }
    
    

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

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

    【讨论】:

    • 嘿,谢谢你的回复 Charles,实际上是否可以使用引用初始 secretKeys 值的循环来构建 appSettingsSecretsMap?
    • @Sl-NZ “初始secretKeys 值”是什么意思?
    • 使用这个名为secretKeys 的列表变量,它只是一个关键参考。 ``` 变量 "secretKeys" { type = list(string) default = [ "TestDbPassword", "TestDbUserId"] } ```
    • @Sl-NZ 该列表用于通过数据源获取秘密。而当你得到秘密后,你可以使用Terraform函数zipmap()作为zipmap(var.secretKeys, data.azurerm_key_vault_secret.kvSecrets[*].id),也可以实现。
    • @Sl-NZ 没关系。
    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 2021-05-30
    • 2019-07-09
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2018-05-25
    • 2021-12-06
    相关资源
    最近更新 更多