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

Terraform中azuread_application与azuread_application_registration的区别及模块编写

Azure AD Terraform资源区别与Azure应用配置服务模块示例

azuread_application vs azuread_application_registration 区别与适用场景

这俩都是Terraform中创建Azure AD应用注册的资源,但设计逻辑和适用场景有明显差异:

  • azuread_application(旧版资源)
    属于"一站式"创建模式,生成应用注册的同时会自动在当前租户创建对应的服务主体(即Azure AD的"企业应用")。适合简单快速的场景,比如你只需要一个身份用于API调用,不想分开管理应用注册和服务主体,用它最省事。但它的设计不够贴合Azure AD的实际模型,后续如果要在多租户复用同一应用注册定义,灵活性会受限。

  • azuread_application_registration(新版资源)
    专门负责创建"应用注册"本身,服务主体需要单独通过azuread_service_principal资源创建。完全贴合Azure AD的核心模型:应用注册是全局的身份定义,服务主体是该定义在特定租户内的运行实例。适合复杂场景:比如多环境(dev/test/prod)复用同一应用注册,但每个环境使用独立服务主体;或者团队分工明确,不同角色分别管理应用注册、服务主体和权限。这种分离式管理更符合最佳实践,扩展性更强。

Terraform模块示例:Azure应用配置服务+AD身份认证

1. 模块目录结构

azure-app-config/
├── main.tf
├── variables.tf
├── outputs.tf

2. main.tf 核心代码

# 定义依赖的Provider版本
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">= 3.0.0"
    }
    azuread = {
      source  = "hashicorp/azuread"
      version = ">= 2.0.0"
    }
  }
}

# 初始化Azure Provider
provider "azurerm" {
  features {}
}

provider "azuread" {}

# 创建Azure应用配置服务
resource "azurerm_app_configuration" "app_config" {
  name                = var.app_config_name
  resource_group_name = var.resource_group_name
  location            = var.location
  sku                 = var.sku
}

# 创建Azure AD应用注册(新版资源)
resource "azuread_application_registration" "api_client" {
  display_name = var.ad_app_display_name
}

# 创建关联的服务主体
resource "azuread_service_principal" "api_client" {
  client_id = azuread_application_registration.api_client.client_id
}

# 创建服务主体密码(客户端密钥)
resource "azuread_service_principal_password" "api_client" {
  service_principal_id = azuread_service_principal.api_client.id
  end_date             = var.client_secret_end_date
}

# 给服务主体分配应用配置服务的读取权限
resource "azurerm_role_assignment" "app_config_reader" {
  scope                = azurerm_app_configuration.app_config.id
  role_definition_name = "App Configuration Data Reader"
  principal_id         = azuread_service_principal.api_client.id
}

3. variables.tf 配置参数

variable "app_config_name" {
  description = "Azure应用配置服务的名称"
  type        = string
}

variable "resource_group_name" {
  description = "已存在的资源组名称"
  type        = string
}

variable "location" {
  description = "资源部署的Azure区域"
  type        = string
}

variable "sku" {
  description = "应用配置服务的SKU(Free/Standard)"
  type        = string
  default     = "Free"
}

variable "ad_app_display_name" {
  description = "Azure AD应用注册的显示名称"
  type        = string
}

variable "client_secret_end_date" {
  description = "客户端密钥的过期时间(例如:'2028-12-31T23:59:59Z')"
  type        = string
}

4. outputs.tf 输出关键信息

output "app_config_endpoint" {
  description = "应用配置服务的API端点URL"
  value       = azurerm_app_configuration.app_config.endpoint
}

output "ad_client_id" {
  description = "Azure AD应用注册的客户端ID"
  value       = azuread_application_registration.api_client.client_id
}

output "ad_client_secret" {
  description = "服务主体的客户端密钥"
  value       = azuread_service_principal_password.api_client.value
  sensitive   = true
}

output "ad_tenant_id" {
  description = "当前Azure AD租户ID"
  value       = data.azuread_client_config.current.tenant_id
}

# 读取当前租户ID的数据源
data "azuread_client_config" "current" {}

模块使用说明

  1. 部署模块后,通过输出的ad_client_id、ad_client_secret、ad_tenant_id和app_config_endpoint,可以先获取Azure AD的身份令牌:
curl -X POST https://login.microsoftonline.com/${ad_tenant_id}/oauth2/v2.0/token \
  -d "client_id=${ad_client_id}" \
  -d "client_secret=${ad_client_secret}" \
  -d "grant_type=client_credentials" \
  -d "scope=https://azconfig.io/.default"
  1. 使用获取到的access_token调用应用配置服务的REST API查询键值对:
curl -H "Authorization: Bearer ${access_token}" \
  "${app_config_endpoint}/kv?api-version=2023-03-01"

内容的提问来源于stack exchange,提问作者harshavardhan pilli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:32:47