Bicep ファイルを使用したサブスクリプションのデプロイ

リソースの管理を簡略化するには、Azure サブスクリプションのレベルでリソースをデプロイできます。 たとえば、ポリシーおよび Azure ロールベースのアクセス制御 (Azure RBAC) をサブスクリプションにデプロイすると、これらのリソースがサブスクリプション全体に適用されます。

この記事では、Bicep ファイルでデプロイ スコープをサブスクリプションに設定する方法について説明します。

Note

サブスクリプション レベルのデプロイでは、800 の異なるリソース グループにデプロイできます。

トレーニング リソース

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

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

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

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

Azure ポリシーでは、以下を使用します。

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

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

新しいリソース グループを作成する場合は、以下を使用します。

サブスクリプションを管理する場合は、以下を使用します。

監視には、以下を使用します。

セキュリティには、以下を使用します。

その他に、以下の種類がサポートされています。

セット スコープ

スコープをサブスクリプションに設定するには、以下を使用します。

targetScope = 'subscription'

デプロイ コマンド

サブスクリプションにデプロイするには、サブスクリプション レベルのデプロイ コマンドを使用します。

Azure CLI の場合は、az deployment sub create を使用します。 次の例では、リソース グループを作成するテンプレートがデプロイされます。

az deployment sub create \
  --name demoSubDeployment \
  --location centralus \
  --template-file main.bicep \
  --parameters rgName=demoResourceGroup rgLocation=centralus

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

デプロイの場所と名前

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

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

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

デプロイのスコープ

サブスクリプションにデプロイする際には、リソースを以下にデプロイできます。

  • 操作のターゲット サブスクリプション
  • テナント内の任意のサブスクリプション
  • そのサブスクリプション内または他のサブスクリプション内のリソース グループ
  • そのサブスクリプションのテナント

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

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

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

対象となるサブスクリプションにリソースをデプロイするには、resource キーワードでそれらのリソースを追加します。

targetScope = 'subscription'

// resource group created in target subscription
resource exampleResource 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  ...
}

サブスクリプションへのデプロイの例については、Bicep を使用したリソース グループの作成に関する記事と「ポリシー定義を割り当てる」を参照してください。

操作のサブスクリプションとは異なるサブスクリプションにリソースをデプロイするには、モジュールを追加します。 subscription 関数を使用して、scope プロパティを設定します。 デプロイ先のサブスクリプションの ID に subscriptionId プロパティを指定します。

targetScope = 'subscription'

param otherSubscriptionID string

// module deployed at subscription level but in a different subscription
module exampleModule 'module.bicep' = {
  name: 'deployToDifferentSub'
  scope: subscription(otherSubscriptionID)
}

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

リソースをサブスクリプション内のリソース グループにデプロイするには、モジュールを追加し、その scope プロパティを設定します。 リソース グループが既に存在する場合は、resourceGroup 関数を使用してスコープの値を設定します。 リソース グループ名を指定します。

targetScope = 'subscription'

param resourceGroupName string

module exampleModule 'module.bicep' = {
  name: 'exampleModule'
  scope: resourceGroup(resourceGroupName)
}

同じ Bicep ファイルでリソース グループを作成する場合は、リソース グループのシンボリック名を使用してスコープの値を設定します。 スコープをシンボリック名に設定する例については、Bicep を使用したリソース グループの作成に関する記事を参照してください。

テナントへのスコープ

テナントでリソースを作成するには、モジュールを追加します。 tenant 関数を使用して、その scope プロパティを設定します。

テンプレートをデプロイするユーザーには、テナントでデプロイするための必要なアクセス権が必要です

次の例には、テナントにデプロイするモジュールが含まれています。

targetScope = 'subscription'

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

モジュールを使用する代わりに、一部のリソースの種類に対してスコープを tenant() に設定できます。 次の例では、テナントに管理グループをデプロイします。

targetScope = 'subscription'

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

// management group created at tenant
resource managementGroup 'Microsoft.Management/managementGroups@2021-04-01' = {
  scope: tenant()
  name: mgName
  properties: {}
}

output output string = mgName

詳細については、「管理グループ」を参照してください。

リソース グループ

リソース グループの作成については、Bicep を使用したリソース グループの作成に関する記事を参照してください。

Azure Policy

ポリシー定義を割り当てる

次の例は、既存のポリシー定義をサブスクリプションに割り当てます。 ポリシー定義がパラメーターを受け取る場合は、オブジェクトとして指定します。 ポリシー定義がパラメーターを受け取らない場合は、既定の空のオブジェクトを使用します。

targetScope = 'subscription'

param policyDefinitionID string
param policyName string
param policyParameters object = {}

resource policyAssign 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: policyName
  properties: {
    policyDefinitionId: policyDefinitionID
    parameters: policyParameters
  }
}

ポリシー定義を作成して割り当てる

ポリシー定義を同じ Bicep ファイルで定義して割り当てることができます。

targetScope = 'subscription'

resource locationPolicy 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: 'locationpolicy'
  properties: {
    policyType: 'Custom'
    parameters: {}
    policyRule: {
      if: {
        field: 'location'
        equals: 'northeurope'
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource locationRestrict 'Microsoft.Authorization/policyAssignments@2022-06-01' = {
  name: 'allowedLocation'
  properties: {
    policyDefinitionId: locationPolicy.id
  }
}

アクセス制御

ロールの割り当ての詳細については、「Azure Resource Manager テンプレートを使用して Azure でのロールの割り当てを追加する」を参照してください。

次の例では、リソース グループを作成し、そのグループにロックを適用して、プリンシパルにロールを割り当てます。

targetScope = 'subscription'

@description('Name of the resourceGroup to create')
param resourceGroupName string

@description('Location for the resourceGroup')
param resourceGroupLocation string

@description('principalId of the user that will be given contributor access to the resourceGroup')
param principalId string

@description('roleDefinition to apply to the resourceGroup - default is contributor')
param roleDefinitionId string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'

@description('Unique name for the roleAssignment in the format of a guid')
param roleAssignmentName string = guid(principalId, roleDefinitionId, resourceGroupName)

var roleID = '/subscriptions/${subscription().subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/${roleDefinitionId}'

resource newResourceGroup 'Microsoft.Resources/resourceGroups@2022-09-01' = {
  name: resourceGroupName
  location: resourceGroupLocation
  properties: {}
}

module applyLock 'lock.bicep' = {
  name: 'applyLock'
  scope: newResourceGroup
}

module assignRole 'role.bicep' = {
  name: 'assignRBACRole'
  scope: newResourceGroup
  params: {
    principalId: principalId
    roleNameGuid: roleAssignmentName
    roleDefinitionId: roleID
  }
}

次の例では、ロックを適用するモジュールを示します。

resource createRgLock 'Microsoft.Authorization/locks@2020-05-01' = {
  name: 'rgLock'
  properties: {
    level: 'CanNotDelete'
    notes: 'Resource group should not be deleted.'
  }
}

次の例では、ロールを割り当てるモジュールを示します。

@description('The principal to assign the role to')
param principalId string

@description('A GUID used to identify the role assignment')
param roleNameGuid string = newGuid()

param roleDefinitionId string

resource roleNameGuid_resource 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: roleNameGuid
  properties: {
    roleDefinitionId: roleDefinitionId
    principalId: principalId
  }
}

次のステップ

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