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" {}
模块使用说明
- 部署模块后,通过输出的
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"
- 使用获取到的
access_token调用应用配置服务的REST API查询键值对:
curl -H "Authorization: Bearer ${access_token}" \ "${app_config_endpoint}/kv?api-version=2023-03-01"
内容的提问来源于stack exchange,提问作者harshavardhan pilli
相关产品推荐
相关产品推荐

