如何通过Terraform自动化Azure Function应用注册并获取密钥
问题解答
首先明确:你不能在azurerm_windows_function_app的identity块中传入active_directory子块——你查看的是数据源(data source)的文档,而资源(resource)类型的identity块仅支持type和可选的identity_ids参数,没有active_directory配置项。
另外,你当前配置的是系统分配托管标识,这种身份是Azure自动创建的服务主体,但它没有client_secret(托管标识通过Azure AD获取令牌,无需密钥)。如果需要独立的应用注册(带client_id和client_secret),需要单独使用Azure AD Provider的资源来创建,再将凭证存入Key Vault。
下面是完整的实现方案:
步骤1:配置Azure AD Provider
首先在Terraform配置中添加Azure AD Provider:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 3.0.0" } azuread = { source = "hashicorp/azuread" version = ">= 2.0.0" } } } provider "azurerm" { features {} } provider "azuread" { # 若使用Azure CLI认证,无需额外配置;否则需配置client_id等参数 }
步骤2:创建独立应用注册及密码
添加应用注册和对应的密码资源:
# 创建应用注册 resource "azuread_application" "func_app_reg" { display_name = "${local.function_name}-app-reg" } # 创建应用注册的客户端密码(client_secret) resource "azuread_application_password" "func_app_reg_secret" { application_object_id = azuread_application.func_app_reg.object_id end_date_relative = "8760h" # 1年有效期,可按需调整 }
步骤3:创建Key Vault并存储凭证
创建Key Vault,配置访问策略允许Function App读取密钥,然后将client_id和client_secret存入:
# 创建Key Vault resource "azurerm_key_vault" "func_kv" { name = "${local.function_name}-kv" location = azurerm_resource_group.rg.location resource_group_name = azurerm_resource_group.rg.name tenant_id = data.azurerm_client_config.current.tenant_id soft_delete_retention_days = 7 purge_protection_enabled = true sku_name = "standard" # 允许系统分配托管标识的Function App读取密钥 access_policy { tenant_id = data.azurerm_client_config.current.tenant_id object_id = azurerm_windows_function_app.func.identity[0].principal_id secret_permissions = [ "Get", "List" ] } } # 存储client_id到Key Vault resource "azurerm_key_vault_secret" "func_client_id" { name = "func-client-id" value = azuread_application.func_app_reg.client_id key_vault_id = azurerm_key_vault.func_kv.id } # 存储client_secret到Key Vault resource "azurerm_key_vault_secret" "func_client_secret" { name = "func-client-secret" value = azuread_application_password.func_app_reg_secret.value key_vault_id = azurerm_key_vault.func_kv.id } # 获取当前租户ID(用于Key Vault配置) data "azurerm_client_config" "current" {}
步骤4:修改Function App配置(可选)
如果你的Function App需要使用这些凭证,可以通过应用设置引用Key Vault的密钥(需开启系统分配标识的访问权限):
resource "azurerm_windows_function_app" "func" { name = local.function_name resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location storage_account_name = azurerm_storage_account.storageaccount.name storage_account_access_key = azurerm_storage_account.storageaccount.primary_access_key service_plan_id = module.appserviceplan.appserviceplan_id functions_extension_version = "~4" tags = var.tags site_config { } identity { type = "SystemAssigned" } app_settings = { FUNCTIONS_EXTENSION_VERSION = "~4" FUNCTIONS_WORKER_RUNTIME = "dotnet" WEBSITE_RUN_FROM_PACKAGE = "1" # 引用Key Vault中的凭证(格式:@Microsoft.KeyVault(SecretName=xxx)) MY_APP_CLIENT_ID = "@Microsoft.KeyVault(SecretName=func-client-id)" MY_APP_CLIENT_SECRET = "@Microsoft.KeyVault(SecretName=func-client-secret)" } }
关键说明
- 系统分配托管标识 vs 独立应用注册:系统分配标识绑定到Function App,删除App时自动删除;独立应用注册是独立的AAD资源,可跨资源使用,适合需要长期凭证或多资源共享的场景。
- Key Vault访问策略:确保只有需要的主体能访问密钥,遵循最小权限原则。
- 密码有效期:
azuread_application_password的end_date_relative可按需调整,到期前需轮换凭证。
内容的提问来源于stack exchange,提问作者Dr Schizo
相关产品推荐
相关产品推荐

