You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:45:26