Bicep ファイルを使用した管理グループへのデプロイ

この記事では、管理グループにデプロイするときに Bicep を使用してスコープを設定する方法について説明します。

成熟している組織では、Bicep ファイルをデプロイして、管理グループ レベルでリソースを作成することができます。 たとえば、場合によっては、管理グループのポリシーAzure ロールベースのアクセス制御 (Azure RBAC) を定義して、割り当てる必要があります。 管理グループ レベルのテンプレートがあれば、宣言という方法を用いて管理グループ レベルでポリシーを適用し、ロールを割り当てることができます。

トレーニング リソース

段階的なガイダンスを通じてデプロイ スコープの詳細を学習するには、「Bicep を使用してサブスクリプション、管理グループ、テナントにリソースをデプロイする」を参照してください。

サポートされているリソース

すべてのリソースの種類を管理グループ レベルにデプロイできるわけではありません。 このセクションでは、サポートされているリソースの種類を示します。

Azure Blueprints では、以下を使用します。

Azure Policy では、以下を使用します。

アクセス制御には、以下を使用します。

サブスクリプションまたはリソース グループにデプロイする入れ子になったテンプレートでは、以下を使用します。

リソースを管理する場合は、以下を使用します。

管理グループは、テナント レベルのリソースです。 ただし、新しい管理グループのスコープをテナントに設定することにより、管理グループのデプロイで管理グループを作成できます。 「管理グループ」を参照してください。

セット スコープ

スコープを管理グループに設定するには、次を使用します。

targetScope = 'managementGroup'

デプロイ コマンド

管理グループにデプロイするには、管理グループのデプロイ コマンドを使用します。

Azure CLI の場合は、az deployment mg create を使用します。

az deployment mg create \
  --name demoMGDeployment \
  --location WestUS \
  --management-group-id myMG \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/management-level-deployment/azuredeploy.json"

ARM テンプレートをデプロイするためのデプロイ コマンドとオプションの詳細については、以下を参照してください。

デプロイの場所と名前

管理グループ レベルのデプロイの場合、デプロイの場所を指定する必要があります。 デプロイの場所は、デプロイするリソースの場所とは異なります。 デプロイの場所では、デプロイ データを格納する場所を指定します。 サブスクリプションおよびテナントのデプロイにも場所が必要です。 リソース グループのデプロイの場合、リソース グループの場所を使用してデプロイ データを格納します。

デプロイ名を指定することも、既定のデプロイ名を使用することもできます。 既定の名前は、テンプレート ファイルの名前です。 たとえば、main.bicep という名前のテンプレートをデプロイすると、main という既定のデプロイ名が作成されます。

デプロイ名ごとに、場所を変更することはできません。 ある場所にデプロイを作成しようとしても、別の場所に同じ名前の既存のデプロイがあると、作成することはできません。 たとえば、centralusdeployment1 という名前の管理グループのデプロイを作成した場合、後で deployment1 という名前の別のデプロイを westus の場所に作成することはできません。 エラー コード InvalidDeploymentLocation が表示された場合は、別の名前を使用するか、その名前の以前のデプロイと同じ場所を使用してください。

デプロイのスコープ

管理グループにデプロイする際には、リソースを以下にデプロイできます。

  • 操作のターゲット管理グループ
  • テナント内の別の管理グループ
  • 管理グループ内のサブスクリプション
  • 管理グループ内のリソース グループ
  • リソース グループのテナント

拡張リソースは、デプロイ ターゲットとは異なるターゲットにスコープ設定できます。

テンプレートをデプロイするユーザーは、特定のスコープにアクセスできる必要があります。

管理グループへのスコープ

対象となる管理グループにリソースをデプロイするには、resource キーワードを使用してこれらのリソースを追加します。

targetScope = 'managementGroup'

// policy definition created in the management group
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  ...
}

別の管理グループを対象とするには、モジュールを追加します。 managementGroup 関数を使用して、scope プロパティを設定します。 管理グループ名を指定します。

targetScope = 'managementGroup'

param otherManagementGroupName string

// module deployed at management group level but in a different management group
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentMG'
  scope: managementGroup(otherManagementGroupName)
}

サブスクリプションへのスコープ

また、管理グループ内のサブスクリプションを対象にすることもできます。 テンプレートをデプロイするユーザーは、特定のスコープにアクセスできる必要があります。

管理グループ内のサブスクリプションを対象とするには、モジュールを追加します。 subscription 関数を使用して、scope プロパティを設定します。 サブスクリプション ID を指定します。

targetScope = 'managementGroup'

param subscriptionID string

// module deployed to subscription in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToSub'
  scope: subscription(subscriptionID)
}

リソース グループへのスコープ

また、管理グループ内のリソース グループを対象にすることもできます。 テンプレートをデプロイするユーザーは、特定のスコープにアクセスできる必要があります。

管理グループ内のリソース グループを対象とするには、モジュールを追加します。 resourceGroup 関数を使用して、scope プロパティを設定します。 サブスクリプション ID とリソース グループ名を指定します。

targetScope = 'managementGroup'

param subscriptionID string
param resourceGroupName string

// module deployed to resource group in the management group
module exampleModule 'module.bicep' = {
  name: 'deployToRG'
  scope: resourceGroup(subscriptionID, resourceGroupName)
}

テナントへのスコープ

テナントでリソースを作成するには、モジュールを追加します。 tenant 関数を使用して、その scope プロパティを設定します。 テンプレートをデプロイするユーザーには、テナントでデプロイするための必要なアクセス権が必要です

targetScope = 'managementGroup'

// module deployed at tenant level
module exampleModule 'module.bicep' = {
  name: 'deployToTenant'
  scope: tenant()
}

または、管理グループなどの一部のリソースの種類に対して、スコープを / に設定することもできます。 新しい管理グループの作成については、次のセクションで説明します。

管理グループ

管理グループのデプロイで管理グループを作成するには、スコープをテナントに設定する必要があります。

次の例では、ルート管理グループに新しい管理グループを作成します。

targetScope = 'managementGroup'

param mgName string = 'mg-${uniqueString(newGuid())}'

resource newMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output newManagementGroup string = mgName

次の例では、デプロイの対象となる管理グループに新しい管理グループを作成します。 管理グループの機能を使用します。

targetScope = 'managementGroup'

param mgName string = 'mg-${uniqueString(newGuid())}'

resource newMG 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {
    details: {
      parent: {
        id: managementGroup().id
      }
    }
  }
}

output newManagementGroup string = mgName

サブスクリプション

ARM テンプレートを使用して、管理グループに新しい Azure サブスクリプションを作成するには、以下を参照してください。

既存の Azure サブスクリプションを新しい管理グループに移動するテンプレートをデプロイする場合は、「ARM テンプレートでのサブスクリプションの移動」を参照してください

Azure Policy

管理グループにデプロイされているカスタム ポリシー定義は、管理グループの拡張機能です。 カスタム ポリシー定義の ID を取得するには、extensionResourceId() 関数を使用します。 組み込みのポリシー定義は、テナント レベルのリソースです。 組み込みポリシー定義の ID を取得するには、tenantResourceId() 関数を使用します。

次の例は、管理グループ レベルでポリシーを定義して割り当てる方法を示しています。

targetScope = 'managementGroup'

@description('An array of the allowed locations, all other locations will be denied by the created policy.')
param allowedLocations array = [
  'australiaeast'
  'australiasoutheast'
  'australiacentral'
]

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: 'locationRestriction'
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        not: {
          field: 'location'
          in: allowedLocations
        }
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'locationAssignment'
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

次の手順

他のスコープについて確認するには、以下を参照してください。