你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过最新的 API 以编程方式创建 Azure 企业协议订阅

本文帮助你使用最新的 API 版本以编程方式为 EA 计费帐户创建 Azure 企业协议 (EA) 订阅。 如果你仍在使用较旧的预览版本,请参阅通过旧 API 以编程方式创建 Azure 订阅

本文介绍如何使用 Azure 资源管理器以编程方式创建订阅。

以编程方式创建 Azure 订阅时,该订阅需遵循你从 Microsoft 或认证卖家处接收 Azure 服务时的协议条款。 有关详细信息,请参阅 Microsoft Azure 法律信息

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

无法以编程方式创建支持计划。 可以在 Azure 门户中购买新的支持计划或升级一个。 导航到“帮助 + 支持”,然后在页面顶部选择“选择正确的支持计划”

先决条件

用户必须在注册帐户上有企业管理员角色或所有者角色才能创建订阅。 以下为在注册帐户上获取所有者角色的两种方法:

若要使用服务主体来创建 EA 订阅,则注册帐户的所有者必须向该服务主体授予创建订阅的权限

使用服务主体来创建订阅时,请使用 Microsoft Graph PowerShellAzure CLI 将 Microsoft Entra 企业应用程序的 ObjectId 用作服务主体 ID。 还可以使用查找服务主体和租户 ID 中的步骤在 Azure 门户中查找现有服务主体的对象 ID。

有关 EA 角色分配 API 请求的详细信息,请参阅将角色分配给 Azure 企业协议服务主体名称。 本文包含可分配给服务主体的角色(和角色定义 ID)列表。

注意

  • 确保使用正确的 API 版本为注册帐户授予所有者权限。 对于本文以及其中所述的 API,请使用 2019-10-01-preview API。
  • 如果要进行迁移以使用较新的 API,以前使用 2015-07-01 版本进行的配置不会自动转换为使用较新的 API。
  • 只有当用户的角色为帐户所有者时,注册帐户信息才可见。 当用户具有多个角色时,API 将使用用户限制最少的角色。

查找有访问权限的帐户

将你添加到与帐户所有者关联的注册帐户后,Azure 通过帐户到注册关系确定订阅收费对象。 在该帐户下创建的所有订阅均向该帐户所在的 EA 注册收费。 若要创建订阅,必须传入拥有订阅所需的合约帐户和用户主体的相关值。

若要运行以下命令,必须登录到帐户所有者的主目录(默认在该目录中创建订阅)。

请求列出你有权访问的所有注册帐户:

GET https://management.azure.com/providers/Microsoft.Billing/billingaccounts/?api-version=2020-05-01

API 响应列出你有权访问的所有注册帐户:

{
  "value": [
    {
      "id": "/providers/Microsoft.Billing/billingAccounts/1234567",
      "name": "1234567",
      "properties": {
        "accountStatus": "Unknown",
        "accountType": "Enterprise",
        "agreementType": "EnterpriseAgreement",
        "soldTo": {
          "companyName": "Contoso",
          "country": "US "
        },
        "billingProfiles": {
          "hasMoreResults": false
        },
        "displayName": "Contoso",
        "enrollmentAccounts": [
          {
            "id": "/providers/Microsoft.Billing/billingAccounts/1234567/enrollmentAccounts/7654321",
            "name": "7654321",
            "type": "Microsoft.Billing/enrollmentAccounts",
            "properties": {
              "accountName": "Contoso",
              "accountOwnerEmail": "kenny@contoso.onmicrosoft.com",
              "costCenter": "Test",
              "isDevTest": false
            }
          }
        ],
        "hasReadAccess": false
      },
      "type": "Microsoft.Billing/billingAccounts"
    }
  ]
}

计费范围的值和 id 是相同的。 注册帐户的 id 是在发起订阅请求的计费范围。 了解该 ID 很重要,因为它是稍后要在本文中创建订阅时使用的必需参数。

在特定注册帐户下创建订阅

以下示例在上一步选择的注册帐户中创建名为 Dev Team Subscription 的订阅。

使用下列方法之一创建订阅别名。 在创建别名时,我们建议你:

  • 使用字母数字字符和下划线
  • 以字母开头且以字母数字字符结尾
  • 请勿使用句点

别名用于简单替换用户定义的字符串,而不是订阅 GUID。 换句话说,你可以将其用作快捷方式。 可以在别名 - 创建中详细了解别名。 下面的示例中创建的是 sampleAlias,但你可以使用你喜欢的任何字符串。

如果除了帐户所有者角色之外,你还有多个用户角色,则必须从 Azure 门户检索帐户 ID。 然后,可以使用 ID 以编程方式创建订阅。

调用 PUT API 来创建订阅创建请求/别名。

PUT  https://management.azure.com/providers/Microsoft.Subscription/aliases/sampleAlias?api-version=2021-10-01

在请求正文中,作为 billingScope 提供其中一个 enrollmentAccountsid

{
  "properties": {
        "billingScope": "/providers/Microsoft.Billing/BillingAccounts/1234567/enrollmentAccounts/7654321",
        "DisplayName": "Dev Team Subscription", //Subscription Display Name
        "Workload": "Production"
  }
}

Workload 的允许值为 ProductionDevTest

响应

{
  "id": "/providers/Microsoft.Subscription/aliases/sampleAlias",
  "name": "sampleAlias",
  "type": "Microsoft.Subscription/aliases",
  "properties": {
    "subscriptionId": "b5bab918-e8a9-4c34-a2e2-ebc1b75b9d74",
    "provisioningState": "Accepted"
  }
}

可以对同一 URL 执行 GET 操作,以获取请求的状态。

请求

GET https://management.azure.com/providers/Microsoft.Subscription/aliases/sampleAlias?api-version=2021-10-01

响应

{
  "id": "/providers/Microsoft.Subscription/aliases/sampleAlias",
  "name": "sampleAlias",
  "type": "Microsoft.Subscription/aliases",
  "properties": {
    "subscriptionId": "b5bab918-e8a9-4c34-a2e2-ebc1b75b9d74",
    "provisioningState": "Succeeded"
  }
}

正在进行的状态在 provisioningState 下作为 Accepted 状态返回。

创建订阅并将 subscriptionOwnerId 设为所有者

当服务主体使用订阅别名 API 创建新订阅且在请求中不包含 additionalProperties 时,服务主体会自动成为新订阅的所有者。 如果不希望服务主体成为所有者,则可以在 additionalProperties 中指定 subscriptionTenantIdsubscriptionOwnerId。 此过程会将指定的 subscriptionOwnerId 而不是服务主体设为新订阅的所有者。

示例请求正文:


{
    "properties": {
        "billingScope": "/providers/Microsoft.Billing/billingAccounts/{EABillingAccountId}/enrollmentAccounts/{EnrollmentAccountId}",
        "displayName": "{SubscriptionName}",
        "workLoad": "Production",
        "resellerId": null,
        "additionalProperties": {
            "managementGroupId": "",
            "subscriptionTenantId": "{SubscriptionTenantId}", // Here you input the tenant GUID where the subscription resides after creation
            "subscriptionOwnerId": "{ObjectId that becomes the owner of the subscription}", // Here you input the objectId which is set as the subscription owner when it gets created.
            "tags": {}
        }
    }
}

在其他租户中创建订阅

使用订阅别名 REST API,可以使用请求正文中的 subscriptionTenantId 参数在其他租户中创建订阅。 Azure 服务主体 (SPN) 必须从其主租户获取令牌才能创建订阅。 创建订阅后,必须从目标租户获取令牌才能使用接受所有权 API 接受转移。

有关在其他租户中创建 EA 订阅的详细信息,请参阅在其他租户中创建订阅和查看传输请求

使用 ARM 模板或 Bicep

上一部分介绍了如何使用 PowerShell、CLI 或 REST API 创建订阅。 如果需要自动创建订阅,请考虑使用 Azure 资源管理器模板(ARM 模板)或 Bicep 文件

以下 ARM 模板可用于创建订阅。 对于 billingScope,请提供注册帐户 ID。 订阅已在根管理组中创建。 创建订阅后,可以将其移到另一个管理组。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscriptionAliasName": {
            "type": "string",
            "metadata": {
                "description": "Provide a name for the alias. This name will also be the display name of the subscription."
            }
        },
        "billingScope": {
            "type": "string",
            "metadata": {
                "description": "Provide the full resource ID of billing scope to use for subscription creation."
            }
        }
    },
    "resources": [
        {
            "scope": "/",
            "name": "[parameters('subscriptionAliasName')]",
            "type": "Microsoft.Subscription/aliases",
            "apiVersion": "2021-10-01",
            "properties": {
                "workLoad": "Production",
                "displayName": "[parameters('subscriptionAliasName')]",
                "billingScope": "[parameters('billingScope')]"
            }
        }
    ],
    "outputs": {}
}

或者,使用 Bicep 文件创建订阅。

targetScope = 'managementGroup'

@description('Provide a name for the alias. This name will also be the display name of the subscription.')
param subscriptionAliasName string

@description('Provide the full resource ID of billing scope to use for subscription creation.')
param billingScope string

resource subscriptionAlias 'Microsoft.Subscription/aliases@2021-10-01' = {
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    workload: 'Production'
    displayName: subscriptionAliasName
    billingScope: billingScope
  }
}

管理组级别部署模板。 以下示例显示了如何部署 JSON ARM 模板,但你可以改为部署 Bicep 文件。

PUT https://management.azure.com/providers/Microsoft.Management/managementGroups/mg1/providers/Microsoft.Resources/deployments/exampledeployment?api-version=2020-06-01

包含请求正文:

{
  "location": "eastus",
  "properties": {
    "templateLink": {
      "uri": "http://mystorageaccount.blob.core.windows.net/templates/template.json"
    },
    "parameters": {
      "subscriptionAliasName": {
        "value": "sampleAlias"
      },
      "billingScope": {
        "value": "/providers/Microsoft.Billing/BillingAccounts/1234567/enrollmentAccounts/7654321"
      }
    },
    "mode": "Incremental"
  }
}

若要将订阅移动到新的管理组,请使用以下 ARM 模板。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/managementGroupDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "targetMgId": {
            "type": "string",
            "metadata": {
                "description": "Provide the ID of the management group that you want to move the subscription to."
            }
        },
        "subscriptionId": {
            "type": "string",
            "metadata": {
                "description": "Provide the ID of the existing subscription to move."
            }
        }
    },
    "resources": [
        {
            "scope": "/",
            "type": "Microsoft.Management/managementGroups/subscriptions",
            "apiVersion": "2020-05-01",
            "name": "[concat(parameters('targetMgId'), '/', parameters('subscriptionId'))]",
            "properties": {
            }
        }
    ],
    "outputs": {}
}

或者,以下 Bicep 文件。

targetScope = 'managementGroup'

@description('Provide the ID of the management group that you want to move the subscription to.')
param targetMgId string

@description('Provide the ID of the existing subscription to move.')
param subscriptionId string

resource subToMG 'Microsoft.Management/managementGroups/subscriptions@2020-05-01' = {
  scope: tenant()
  name: '${targetMgId}/${subscriptionId}'
}

对创建 Azure Enterprise 订阅的 API 限制

  • 仅 Azure Enterprise 订阅使用此 API 进行创建。
  • 每个注册帐户的订阅限制为 5000 个。 超过此限制后,只能在 Azure 门户中为该帐户创建更多订阅。 若要通过 API 创建更多订阅,请创建另一个注册帐户。 已取消、已删除和已传输的订阅数的上限为 5000。
  • 不是帐户所有者但通过 Azure 基于角色的访问控制添加到注册帐户的用户不能在 Azure 门户中创建订阅。

后续步骤