如何通过编程方式创建Azure订阅与Azure AD租户?
首先得明确:你说的没错,常规的ARM模板确实没法直接搞定这俩资源的创建——因为Azure AD租户属于身份管理核心服务,订阅属于计费管理服务,都不在ARM资源管理器的管辖范围内,这也是为啥UI创建订阅会跳转到其他界面的原因,它调用的是计费系统的后台API,不是ARM。
下面分两部分给你具体的实现思路:
一、Azure AD租户的编程创建
Azure AD租户的创建得靠Microsoft Graph API,这是唯一官方支持的编程方式,Terraform也是基于它封装的。
核心API与权限
- 调用
POST /directoryTenantsAPI,请求体里指定租户的显示名称、域名前缀等参数。 - 权限要求:必须拥有
Directory.ReadWrite.All应用权限(或者全局管理员的委派权限),而且你的账号需要有创建租户的权限(普通用户默认可能没有,需要全局管理员授权)。
Terraform实现示例
如果你用Terraform,可以用azuread_tenant资源,示例代码大概是这样:
provider "azuread" { use_cli = true } resource "azuread_tenant" "example" { display_name = "Example Tenant" initial_domain = "exampletenant" }
注意:执行这个的账号必须是全局管理员,而且Terraform的azuread提供者版本要足够新(v2.0+)。
二、Azure订阅的编程创建
订阅属于计费资源,得用Azure Billing API或者对应计费类型的专属API(比如EA、CSP),Terraform的azurerm_subscription资源也是基于这些API封装的。
分场景选择API
Pay-As-You-Go(即用即付)订阅:
调用Billing API的PUT /providers/Microsoft.Billing/billingAccounts/{billingAccountName}/billingProfiles/{billingProfileName}/invoiceSections/{invoiceSectionName}/createSubscription接口,需要关联到已有的计费账户、账单配置文件和发票段。Enterprise Agreement(EA)订阅:
用EA Billing API的PUT /providers/Microsoft.Billing/billingAccounts/{billingAccountName}/enrollmentAccounts/{enrollmentAccountName}/subscriptions/{subscriptionName}接口,需要EA账户的所有者权限。Cloud Solution Provider(CSP)订阅:
用合作伙伴中心API(比如POST /v1/customers/{customer-id}/subscriptions),适合CSP合作伙伴为客户创建订阅。
Terraform实现示例
如果用Terraform创建EA下的订阅,示例代码如下:
provider "azurerm" { features {} } resource "azurerm_subscription" "example" { subscription_name = "Example Subscription" billing_account_id = "/providers/Microsoft.Billing/billingAccounts/1234567" enrollment_account_id = "/providers/Microsoft.Billing/billingAccounts/1234567/enrollmentAccounts/8901234" }
这里的billing_account_id和enrollment_account_id需要从EA门户获取,执行的账号必须有EA账户的创建订阅权限。
关键注意事项
- 权限是核心:不管用API还是Terraform,都需要对应的高权限(比如全局管理员、计费账户所有者),普通账号没法直接创建。
- 订阅不能凭空创建:必须关联到已有的计费实体(比如EA账户、即用即付账单),因为涉及到付费逻辑。
- UI跳转的原因:Azure Portal创建订阅时跳转到的是计费管理界面,本质是调用Billing API的前端实现,和ARM资源管理器是两个独立的系统。
内容的提问来源于stack exchange,提问作者Rodney

