Penyebaran langganan dengan file Bicep

Untuk menyederhanakan pengelolaan sumber daya, Anda dapat menyebarkan sumber daya di tingkat langganan Azure Anda. Misalnya, Anda dapat menyebarkan kebijakan dan kontrol akses berbasis peran Azure (Azure RBAC) ke langganan Anda, yang menerapkannya di seluruh langganan.

Artikel ini menjelaskan cara mengatur cakupan penyebaran ke langganan dalam file Bicep.

Catatan

Anda dapat menyebarkan ke 800 grup sumber daya yang berbeda dalam penyebaran tingkat langganan.

Sumber daya pelatihan

Jika Anda lebih suka mempelajari tentang cakupan penyebaran melalui panduan langkah demi langkah, lihat Menyebarkan sumber daya ke langganan, grup manajemen, dan penyewa dengan menggunakan Bicep.

Sumber daya yang didukung

Tidak semua jenis sumber daya dapat disebarkan ke tingkat langganan. Bagian ini mencantumkan jenis sumber daya mana yang didukung.

Untuk Azure Blueprints, gunakan:

Untuk Kebijakan Azure, gunakan:

Untuk kontrol akses, gunakan:

Untuk templat berlapis yang disebarkan ke grup sumber daya, gunakan:

Untuk membuat grup sumber daya baru, gunakan:

Untuk mengelola langganan Anda, gunakan:

Untuk pemantauan, gunakan:

Untuk keamanan, gunakan:

Jenis lain yang didukung meliputi:

Mengatur cakupan

Untuk mengatur cakupan ke langganan, gunakan:

targetScope = 'subscription'

Perintah penyebaran

Untuk menyebarkan langganan, gunakan perintah penyebaran tingkat langganan.

Untuk Azure CLI, gunakan pembuatan sub penyebaran az. Contoh berikut menyebarkan templat untuk membuat grup sumber daya:

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

Untuk informasi selengkapnya tentang perintah penyebaran dan opsi untuk menyebarkan templat ARM, lihat:

Lokasi dan nama penyebaran

Untuk penyebaran tingkat langganan, Anda harus menyediakan lokasi untuk penyebaran. Lokasi penyebaran terpisah dari lokasi sumber daya yang Anda sebarkan. Lokasi penyebaran menentukan tempat menyimpan data penyebaran. Penyebaran grup manajemen dan penyewa juga memerlukan lokasi. Untuk penyebaran grup sumber daya, lokasi grup sumber daya digunakan untuk menyimpan data penyebaran.

Anda dapat memberikan nama untuk penyebaran atau menggunakan nama penyebaran default. Nama default adalah nama file templat. Misalnya, menyebarkan templat bernama main.json akan membuat nama penyebaran main secara default.

Untuk setiap nama penyebaran, lokasi tidak dapat diubah. Anda tidak dapat membuat penyebaran di satu lokasi saat ada penyebaran yang ada dengan nama yang sama di lokasi lain. Misalnya, jika Anda membuat penyebaran langganan dengan nama deployment1 di centralus, Anda nantinya tidak dapat membuat penyebaran lain dengan nama deployment1 tetapi lokasinya di westus. Jika Anda mendapatkan kode kesalahan InvalidDeploymentLocation, gunakan nama yang berbeda atau lokasi yang sama dengan penyebaran sebelumnya untuk nama tersebut.

Cakupan penyebaran

Saat menyebarkan ke langganan, Anda bisa menyebarkan sumber daya untuk:

  • langganan target dari operasi
  • langganan apa pun di penyewa
  • grup sumber daya dalam langganan atau langganan lainnya
  • penyewa untuk langganan

Sumber daya ekstensi dapat dicakup ke target yang berbeda dari target penyebaran.

Pengguna yang menyebarkan templat harus memiliki akses ke cakupan yang ditentukan.

Cakupan ke langganan

Untuk menyebarkan sumber daya ke langganan target, tambahkan sumber daya tersebut dengan kata kunci resource.

targetScope = 'subscription'

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

Untuk contoh penyebaran ke langganan, lihat Membuat grup sumber daya dengan Bicep dan Menetapkan definisi kebijakan.

Untuk menyebarkan sumber daya ke langganan yang berbeda dari langganan dari operasi, tambahkan modul. Gunakan fungsi langganan untuk menetapkan properti scope. Berikan properti subscriptionId ke ID langganan yang ingin Anda sebarkan.

targetScope = 'subscription'

param otherSubscriptionID string

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

Cakupan ke grup sumber daya

Untuk menyebarkan sumber daya ke grup sumber daya dalam langganan, tambahkan modul dan atur properti scope. Jika grup sumber daya sudah ada, gunakan fungsi resourceGroup untuk mengatur nilai cakupan. Berikan nama grup sumber daya.

targetScope = 'subscription'

param resourceGroupName string

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

Jika grup sumber daya dibuat dalam file Bicep yang sama, gunakan nama simbolik grup sumber daya untuk mengatur nilai cakupan. Untuk contoh pengaturan cakupan ke nama simbolis, lihat Membuat grup sumber daya dengan Bicep.

Cakupan ke penyewa

Untuk membuat sumber daya di penyewa, tambahkan modul. Gunakan fungsi penyewa untuk mengatur properti scope.

Pengguna yang menyebarkan templat harus memiliki akses yang diperlukan untuk disebarkan di penyewa.

Contoh berikut mencakup modul yang disebarkan ke penyewa.

targetScope = 'subscription'

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

Alih-alih menggunakan modul, Anda dapat mengatur cakupan ke tenant() untuk beberapa jenis sumber daya. Contoh berikut menyebarkan grup manajemen di penyewa.

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

Untuk informasi selengkapnya, lihat Grup manajemen.

Kelompok Sumber Daya

Untuk informasi tentang membuat grup sumber daya, lihat Membuat grup sumber daya dengan Bicep.

Kebijakan Azure

Menetapkan definisi kebijakan

Contoh berikut menetapkan definisi kebijakan yang sudah ada ke langganan. Jika definisi kebijakan mengambil parameter, maka berikan sebagai objek. Jika definisi kebijakan tidak mengambil parameter, gunakan objek kosong default.

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
  }
}

Membuat dan menetapkan definisi kebijakan

Anda dapat menentukan dan menetapkan definisi kebijakan dalam file Bicep yang sama.

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
  }
}

Kontrol akses

Untuk mempelajari tentang menetapkan peran, lihat Menambahkan penetapan peran Azure menggunakan templat Azure Resource Manager.

Contoh berikut membuat grup sumber daya, menerapkan kunci ke grup sumber daya, dan menetapkan peran ke utama.

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
  }
}

Contoh berikut menunjukkan modul untuk menerapkan penguncian:

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

Contoh berikutnya menunjukkan modul untuk menetapkan peran:

@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
  }
}

Langkah berikutnya

Untuk mempelajari tentang cakupan lain, lihat: