最新の API を使用してプログラムで Azure Enterprise Agreement サブスクリプションを作成する

この記事は、最新の API バージョンを使用してプログラムで Enterprise Agreement (EA) 課金アカウントの Azure EA サブスクリプションを作成する場合に役に立ちます。 古いプレビュー バージョンをまだ使用している場合は、「レガシ API を使用してプログラムで Azure サブスクリプションを作成する」を参照してください。

この記事では、Azure Resource Manager を使用してプログラムからサブスクリプションを作成する方法について説明します。

Azure サブスクリプションをプログラムで作成すると、Microsoft または認定販売者から Azure サービスを受けるサブスクリプション条件が適用されます。 詳細については、「Microsoft Azure の法的情報」を参照してください。

注意

Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を開始するには、Azure PowerShell のインストールに関する記事を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

プログラムでサポート プランを作成することはできません。 新しいサポート プランを購入するか、Azure portal でアップグレードすることができます。 [ヘルプとサポート] に移動し、ページの上部にある [適切なサポート プランを選択] を選択します。

前提条件

サブスクリプションを作成するには、ユーザーはエンタープライズ管理者ロールか登録アカウントの所有者ロールのどちらかを持っている必要があります。 登録アカウントで所有者ロールを取得するには、以下の 2 つの方法があります。

  • 登録のエンタープライズ管理者は、ユーザーをアカウント所有者に設定できます (サインインが必要)。これにより、ユーザーは登録アカウントの所有者になります。
  • 登録アカウントの既存の所有者が、アクセス許可を付与できます。

サービス プリンシパルを使用して EA サブスクリプションを作成するには、登録アカウントの所有者がそのサービス プリンシパルにサブスクリプションを作成する機能を許可する必要があります。

サービス プリンシパルを使用してサブスクリプションを作成している場合は、Microsoft Graph PowerShell または Azure CLI を使用して、Microsoft Entra エンタープライズ アプリケーションの ObjectId をサービス プリンシパル ID として使用します。 「サービス プリンシパルとテナント ID を検索する」の手順を使用して、Azure portal で既存のサービス プリンシパルについてオブジェクト ID を検索することもできます。

EA ロールの割り当て API 要求の詳細については、「Azure Enterprise Agreement サービス プリンシパル名にロールを割り当てる」を参照してください。 この記事には、サービス プリンシパルに割り当てることができるロール (およびロール定義 ID) の一覧が記載されています。

Note

  • 登録アカウントに対する所有者アクセス許可の付与には、必ず正しい API バージョンを使用してください。 この記事およびその中で記載されている API では、2019-10-01-preview API を使用します。
  • 新しい API を使用するために移行している場合、2015-07-01 バージョンを使用して行った以前の構成が新しい API で使用できるよう自動的に変換されることはありません。
  • 登録アカウント情報は、ユーザーのロールがアカウント所有者であるときにのみ表示されます。 ユーザーが複数のロールを持っているときは、ユーザーの最も制限の厳しいロールが API によって使用されます。

アクセスできるアカウントを検索する

アカウント所有者に関連付けられた登録アカウントに追加されると、アカウントと登録の関係を使用してサブスクリプション料金の請求先が決定されます。 このアカウント内で作成されたすべてのサブスクリプションは、アカウントが含まれる 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 portal からアカウント 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 です。

Response

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

同じ URL で GET を実行して、要求の状態を取得できます。

Request

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

Response

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

進行中の状態は、provisioningStateAccepted 状態として返されます。

サブスクリプションを作成し、subscriptionOwnerId を所有者にする

サービス プリンシパルが Subscription Alias API を使用して新しいサブスクリプションを作成するときに、要求に additionalProperties を含めない場合、サービス プリンシパルが自動的に新しいサブスクリプションの所有者になります。 サービス プリンシパルを所有者にしない場合は、additionalPropertiessubscriptionTenantIdsubscriptionOwnerId を指定できます。 このプロセスにより、サービス プリンシパルではなく、指定した 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": {}
        }
    }
}

別のテナントにサブスクリプションを作成する

サブスクリプション Alias REST API を使うと、要求本文の subscriptionTenantId パラメーターを使って、別のテナントにサブスクリプションを作成できます。 Azure サービス プリンシパル (SPN) は、サブスクリプションを作成するためにホーム テナントからトークンを取得する必要があります。 サブスクリプションを作成した後、Accept Ownership API を使って転送を受け入れるために、ターゲット テナントからトークンを取得する必要があります。

別のテナントで EA サブスクリプションを作成する方法について、詳しくは「他のテナントでサブスクリプションを作成し、転送要求を表示する」をご覧ください。

ARM テンプレートまたは Bicep を使用する

前のセクションでは、PowerShell、CLI、または REST API を使用してサブスクリプションを作成する方法を説明しました。 サブスクリプションの作成を自動化する必要がある場合は、Azure Resource Manager テンプレート (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 の制限事項

  • API を使用して作成されるのは、Azure Enterprise サブスクリプションのみです。
  • 登録アカウントあたりのサブスクリプションの上限数は 5,000 です。 その後、アカウントの追加のサブスクリプションは、Azure portal でのみ作成することができます。 API を使用してさらにサブスクリプションを作成するには、別の登録アカウントを作成します。 キャンセル、削除、および譲渡されたサブスクリプションもカウントされ、5000 件の制限の対象となります。
  • アカウント所有者ではないが、Azure ロールベースのアクセス制御経由で登録アカウントに追加されたユーザーは、Azure portal でサブスクリプションを作成することはできません。

次のステップ