複数のスコープにリソースをデプロイする

完了

場合によっては、1 つのデプロイ内から複数レベルの階層にリソースをデプロイする必要があります。 このような場合として、次のような状況が考えられます。

  • 2 つの異なるリソース グループにリソースをデプロイする必要があります。 たとえば、共有リソース グループ内にネットワーク セキュリティ グループを作成し、アプリケーションのリソース グループに仮想マシンのネットワーク インターフェイスをデプロイする場合などです。
  • テンプレートを使用して、サブスクリプションスコープのリソースであるリソース グループを作成しており、次はリソース グループスコープのデプロイを使用して、ストレージ アカウントやその他の Azure リソースをそのリソース グループにデプロイしたいと考えています。
  • 管理グループ階層をデプロイしており、テナントスコープのリソースであるいくつかのサブスクリプションもデプロイしたいと考えています。

Bicep を使用すると、スコープの範囲に対して機能するデプロイを scope キーワードを使用して作成できます。

注意

このユニットのコマンドは、概念を説明するために示されています。 コマンドはまだ実行しないでください。 ここで学習した内容をすぐに練習します。

モジュールのスコープを指定する

Bicep モジュールを使用すると、ファイルに指定されている targetScope とは異なるスコープにリソースのセットをデプロイすることができます。 targetScopesubscription にしてデプロイされ、リソース グループにいくつかのリソースをデプロイするためにモジュールが使用されている Bicep ファイルの例を次に示します。

targetScope = 'subscription'

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

ターゲットとなるスコープを特定するために、scope プロパティに Bicep 関数が使用されていることに注目してください。 前の例では、resourceGroup() 関数を使用して、ターゲットとなるリソース グループの名前を指定しています。 また、subscription()managementGroup()tenant() の各関数を使用することもできます。 Bicep ファイルには targetScope キーワードを、モジュールには scope キーワードを使用することで、デプロイのスコープのさまざまな組み合わせを作成できます。

Note

ただし、targetScoperesourceGroup または subscription である Bicep ファイルには、scopemanagementGroup のモジュールを含めることはできません。

ヒント

サブスクリプションスコープの Bicep ファイルを使用してリソース グループを作成した場合、リソース グループのシンボル名をモジュールの scope として使用することができます。 この方法については、次の演習で説明します。

複数のリソース グループにデプロイする

スコープの一般的な用途は、複数のリソース グループにリソースをデプロイすることです。 ほとんどの Azure リソースに scope プロパティを設定することはできませんが、モジュールを使用して、リソースのセットを別のリソース グループにデプロイするように Bicep に伝えることはできます。

たとえば、仮想ネットワークとその関連リソースを ToyNetworking という名前の共有リソース グループにデプロイし、ネットワーク インターフェイスを別のリソース グループにデプロイする 1 セットの Bicep ファイルを作成することができます。 Bicep ファイルは次のようになります。

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2024-01-01' = {
  name: 'production-nic'
  location: resourceGroup().location
  properties: {
    ipConfigurations: [
      {
        name: 'toy-subnet-ip-configuration'
        properties: {
          subnet: {
            id: networkModule.outputs.subnetResourceId
          }
        }
      }
    ]
  }
}

ToyNetworking リソース グループにデプロイされるリソースはモジュールで定義されており、subnetResourceId の出力はネットワーク インターフェイスのリソース定義で使用されていることに注目してください。

このファイルをデプロイした後、次のように ProjectTeddybear という名前の別のリソース グループをターゲットにすることができます。

az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...

デプロイは ProjectTeddybear リソース グループがターゲットされていますが、仮想ネットワーク リソースは ToyNetworking リソース グループにデプロイされます。 ネットワーク インターフェイスは ProjectTeddybear リソース グループにデプロイされます。

resourceGroup スコープにサブスクリプション ID を含めることで、別のサブスクリプションのリソース グループをデプロイすることもできます。

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
  name: 'networkModule'
}

同様に、subscription() スコープ関数を使用すると、サブスクリプション スコープの複数のサブスクリプションにリソースをデプロイすることができます。また、managementGroup() スコープ関数を使用すると、複数の管理グループにリソースをデプロイすることができます。 ただし、複数のテナントにデプロイすることはできません。

1 つのリソースに対してスコープを指定する

scope キーワードは、モジュールだけでなく、他のいくつかの特定のリソースの種類にも使用できます。 拡張リソースの場合、scope キーワードを使用して適用するリソースを指定します。 さらに、テナントスコープのリソースには scope キーワードを使用できるので、どのテンプレートからでもデプロイすることができます。

たとえば、次の例のように、Bicep ファイルを使用して管理グループ階層を作成することができます。

targetScope = 'managementGroup'

resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

この例では、テンプレート ファイルに targetScope = 'managementGroup' を使用していますが、tenant() スコープ内に管理グループをデプロイしていることに注目してください。

Note

前の例は、Bicep を使用して管理グループ階層を作成する方法を示しています。 NonProduction 管理グループはルート管理グループの子となり、SecretRND 管理グループは NonProduction 管理グループの子となります。

管理グループとサブスクリプション階層を作成する

これで、さまざまなスコープにさまざまなリソースをデプロイする方法を理解し、Bicep モジュールと scope キーワードを使用してリソースの組み合わせをデプロイする方法を理解しました。 この新しい知識をすべて応用して、前の例の管理グループ階層を拡張してみましょう。 ここでは、階層に "サブスクリプションの別名" も含めます。これは、新しい Azure サブスクリプションを作成するテナントスコープのリソースです。

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

Note

サブスクリプションの別名を作成する際には、課金スコープなどの他のプロパティも指定します。 ここでは、わかりやすくするために省略しています。

次に、サブスクリプションを管理グループに関連付けることができますが、そのためには Microsoft.Management/managementGroups/subscriptions というリソースの種類をデプロイする必要があります。 このリソースが機能するしくみがあるため、モジュールでこれを宣言します。 たとえば、modules/mg-subscription-association.bicep という名前のファイルを次に示します。

targetScope = 'tenant'

@description('The name of the management group that should contain the subscription.')
param managementGroupName string

@description('The subscription ID to place into the management group.')
param subscriptionId string

resource managementGroup 'Microsoft.Management/managementGroups@2023-04-01' existing = {
  name: managementGroupName
}

resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2023-04-01' = {
  parent: managementGroup
  name: subscriptionId
}

管理グループが existing キーワードで参照されていることに注意してください。

そうすれば、メインの Bicep ファイルにこのモジュールを含めることで、関連付けを作成できるようになります。 Bicep ファイルの全体は次のとおりです。

targetScope = 'managementGroup'

@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string

resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
  name: 'subscriptionAssociation'
  scope: tenant()
  params: {
    managementGroupName: childManagementGroup.name
    subscriptionId: subscription.properties.subscriptionId
  }
}

これまで見てきたように、スコープと Bicep の言語機能のすべてを併用することで、Azure インフラストラクチャ全体の高度なデプロイを作成できます。