总而言之,我特别希望使用两个不同的源来维护我的 azure 函数的应用程序设置,
- 第一个来源是自定义设置的映射,将手动或通过可能几乎没有变化的代码进行维护
- 应用设置映射的第二个来源是关键 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)
}
<小时/>
最佳答案
对于自定义设置,我认为最好手动将其设置为变量。它有很多东西,只需要一点点改变。如果让它自动化,我认为会有点冗余。只需按照问题中的说明进行操作即可。
对于关键故障,我建议您使用
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 的数据将返回一个包含如下元素的列表:
所以你不能用 secret 名称引用它。按照我向您展示的方式进行即可。
关于使用 Terraform 和 map 的多个源的 Azure Function AppSettings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63326247/