PAYATHON 2026

如何用 Terraform 配置 Microsoft Foundry 的 Content Understanding?

技术老齐

结论

可以通过 Terraform 完成,分为模型部署和默认模型配置两步:

  1. 使用 azurerm_cognitive_deployment,或通过 AzAPI 使用 Microsoft.CognitiveServices/accounts/deployments ARM 资源部署模型。
  2. 调用 Content Understanding 的 PATCH /contentunderstanding/defaults 数据平面 API,将模型名称和分析器别名映射到实际部署名称。

Foundry 资源和模型部署已有 Terraform 支持。默认模型映射可以用 terraform_data 配合 local-exec 调用 REST API,放在同一次部署流程中完成。Foundry Terraform 文档、默认配置 API

为什么找不到对应的资源类型

Content Understanding 通过以下服务端点配置默认模型:

PATCH https://<foundry-endpoint>/contentunderstanding/defaults?api-version=2025-11-01

这个接口属于数据平面。AzAPI 的 azapi_resource、azapi_update_resource 和 azapi_resource_action 面向 ARM 控制平面,不能直接调用这个服务端点。

AzAPI 提供的 azapi_data_plane_resource 只支持已登记的数据平面资源类型。当前公开支持列表中没有 Content Understanding defaults,因此自行拼写一个 type 也无法使用。AzAPI 数据平面说明、支持的资源类型

一、准备 Foundry 资源和执行权限

以下示例假设已有 Microsoft Foundry 资源,模型也部署在同一个资源下。执行前需要准备:

  • Foundry 资源的 ARM ID。
  • Content Understanding 使用的资源级服务端点,例如 https://<resource-name>.services.ai.azure.com。
  • 能创建模型部署的 Terraform 执行身份。
  • 已登录的 Azure CLI,以及 Bash、cURL。

示例通过 Microsoft Entra ID 调用 defaults API。运行 Azure CLI 的身份需要具备目标 Foundry 资源的数据平面权限。官方 SDK 示例要求授予 Cognitive Services User 角色,即使该身份已经是资源 Owner,也需要检查这项授权。local-exec 使用本机或 CI 中的 Azure CLI 登录状态,不会自动继承 Terraform provider 的认证配置。官方 SDK 配置示例

二、用 Terraform 部署模型

示例使用 gpt-4.1、gpt-4.1-mini 和 text-embedding-3-large。这三个模型都在官方支持列表中,实际能否部署还取决于区域、模型生命周期、订阅配额和部署类型。部署前应核对目标分析器支持的模型,这组示例并非所有场景的固定要求。Content Understanding 支持的模型

terraform {
  required_version = ">= 1.4.0"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 4.0"
    }
  }
}

variable "subscription_id" {
  type = string
}

variable "foundry_account_id" {
  type = string
}

variable "content_understanding_endpoint" {
  type = string
}

provider "azurerm" {
  features {}
  subscription_id = var.subscription_id
}

locals {
  models = {
    "gpt-4.1" = {
      deployment_name = "cu-gpt41"
      version         = "2025-04-14"
    }

    "gpt-4.1-mini" = {
      deployment_name = "cu-gpt41-mini"
      version         = "2025-04-14"
    }

    "text-embedding-3-large" = {
      deployment_name = "cu-embedding"
      version         = null
    }
  }
}

resource "azurerm_cognitive_deployment" "models" {
  for_each = local.models

  name                 = each.value.deployment_name
  cognitive_account_id = var.foundry_account_id

  model {
    format  = "OpenAI"
    name    = each.key
    version = each.value.version
  }

  sku {
    name     = "GlobalStandard"
    capacity = 1
  }
}

GlobalStandard 和 capacity = 1 是示例值,需要根据模型可用性和配额调整。version = null 表示不指定版本,由服务选择当时的默认版本。如果需要固定版本,应填写目标资源实际支持的版本。azurerm_cognitive_deployment 参数说明

如果 Foundry 资源由当前 Terraform 配置创建,将 var.foundry_account_id 换成相应资源的 .id 引用即可。

三、设置 Content Understanding 默认模型映射

模型部署完成后,需要配置 Content Understanding 使用的部署。映射中的键是模型名称或分析器别名,值是实际部署名称,例如:

{
  "modelDeployments": {
    "gpt-4.1": "cu-gpt41",
    "gpt-4.1-mini": "cu-gpt41-mini",
    "text-embedding-3-large": "cu-embedding",
    "prebuilt-analyzer-completion": "cu-gpt41",
    "prebuilt-analyzer-completion-mini": "cu-gpt41-mini",
    "prebuilt-analyzer-embedding": "cu-embedding"
  }
}

预置分析器会引用 prebuilt-analyzer-* 别名,配置时应包含这些映射。模型名和部署名可以不同,例如 gpt-4.1 可以对应名为 cu-gpt41 的部署。模型映射规则

在前面的 Terraform 代码后追加以下配置:

locals {
  cu_api_version = "2025-11-01"

  cu_defaults = {
    modelDeployments = merge(
      {
        for model_name, deployment in azurerm_cognitive_deployment.models :
        model_name => deployment.name
      },
      {
        "prebuilt-analyzer-completion" = (
          azurerm_cognitive_deployment.models["gpt-4.1"].name
        )
        "prebuilt-analyzer-completion-mini" = (
          azurerm_cognitive_deployment.models["gpt-4.1-mini"].name
        )
        "prebuilt-analyzer-embedding" = (
          azurerm_cognitive_deployment.models["text-embedding-3-large"].name
        )
      }
    )
  }

  cu_defaults_json = jsonencode(local.cu_defaults)
}

resource "terraform_data" "content_understanding_defaults" {
  triggers_replace = [
    var.foundry_account_id,
    var.content_understanding_endpoint,
    local.cu_api_version,
    local.cu_defaults_json
  ]

  depends_on = [azurerm_cognitive_deployment.models]

  provisioner "local-exec" {
    interpreter = ["/bin/bash", "-c"]

    environment = {
      CU_ENDPOINT    = trimsuffix(var.content_understanding_endpoint, "/")
      CU_API_VERSION = local.cu_api_version
      CU_DEFAULTS    = local.cu_defaults_json
    }

    command = <<-EOT
      set -euo pipefail

      cu_access_token="$(az account get-access-token \
        --resource https://cognitiveservices.azure.com \
        --query accessToken \
        --output tsv)"

      curl --fail-with-body --silent --show-error \
        --request PATCH \
        "$CU_ENDPOINT/contentunderstanding/defaults?api-version=$CU_API_VERSION" \
        --header "Authorization: Bearer $cu_access_token" \
        --header "Content-Type: application/merge-patch+json" \
        --data-binary "$CU_DEFAULTS"
    EOT
  }
}

示例使用 GA API 版本 2025-11-01。Content-Type 和令牌作用域均按 defaults API 定义设置,令牌面向 Cognitive Services,而非 ARM。Update Defaults API

端点、API 版本或映射变化时,triggers_replace 会触发重新配置;depends_on 确保调用在模型部署完成后执行。没有专用资源可用时,可以用 terraform_data 承载这类 provisioner 操作。terraform_data 文档

四、执行并验证

在 terraform.tfvars 中填写实际值:

subscription_id = "<subscription-id>"

foundry_account_id = "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<foundry-name>"

content_understanding_endpoint = "https://<foundry-name>.services.ai.azure.com"

确认 Azure CLI 已登录目标租户,然后执行:

terraform init
terraform plan
terraform apply

完成后读取默认配置,检查返回的部署名称:

CU_ENDPOINT="https://<foundry-name>.services.ai.azure.com"

az rest \
  --method GET \
  --resource https://cognitiveservices.azure.com \
  --url "$CU_ENDPOINT/contentunderstanding/defaults?api-version=2025-11-01"

读取接口为 GET /contentunderstanding/defaults。确认返回结果正确后,再用实际需要的分析器提交一次分析请求,验证模型兼容性和调用权限。Get Defaults API

注意事项

  • 默认模型取决于分析器。可以通过 GET /contentunderstanding/analyzers/{analyzerId}?api-version=2025-11-01 查看其 models 和 supportedModels。调整模型时,应同时修改部署和映射。分析器模型选择说明
  • local-exec 不具备专用 Terraform 资源的完整状态管理能力。它不会在每次 plan 时读取远端 defaults,因此控制台中的修改不会自动显示为漂移。删除这个 terraform_data 资源也不会清除远端映射。
  • defaults API 使用合并补丁。上述代码会更新提交的映射,但从 Terraform 配置中删掉一个键,不会删除服务端已有的键。迁移模型时,需要检查是否残留旧映射。Update Defaults API
  • 新授予的角色可能需要等待生效。如果模型部署成功,但 defaults 调用失败,应先检查执行身份、令牌作用域和资源端点。端点应来自目标 Foundry 资源,避免误用带有项目路径的 URL。
  • 如果 CI 不适合运行 provisioner,可以在 terraform apply 成功后增加一个独立步骤,执行同样的 REST 请求。如果需要 Terraform 持续读取、比较并管理 defaults,应使用明确支持该 API 的 provider 实现。

备注:内容仅供参考。