Distribuzioni della sottoscrizione con file Bicep

Per semplificare la gestione delle risorse, è possibile distribuire le risorse a livello della sottoscrizione di Azure. Ad esempio, è possibile distribuire nella sottoscrizione i criteri e il Controllo degli accessi in base al ruolo di Azure (Azure RBAC), che li applica nella sottoscrizione.

Questo articolo descrive come impostare l'ambito di distribuzione per una sottoscrizione in un file Bicep.

Nota

È possibile eseguire una distribuzione a livello di sottoscrizione in un massimo di 800 gruppi di risorse diversi.

Risorse di formazione

Se si preferisce ottenere informazioni sugli ambiti di distribuzione tramite un materiale sussidiario dettagliato, vedere Distribuire risorse in sottoscrizioni, gruppi di gestione e tenant usando Bicep.

Risorse supportate

Non tutti i tipi di risorse possono essere distribuiti a livello di sottoscrizione. Questa sezione elenca i tipi di risorse supportati.

Per Azure Blueprints, usare:

Per Criteri di Azure, usare:

Per il controllo di accesso, usare:

Per modelli annidati che distribuiscono a gruppi di risorse, usare:

Per la creazione di nuovi gruppi di risorse, usare:

Per la gestione della sottoscrizione, usare:

Per il monitoraggio, usare:

Per la protezione, usare:

Altri tipi supportati includono:

Ambito set

Per impostare l'ambito sulla sottoscrizione, usare:

targetScope = 'subscription'

Comandi di distribuzione

Per eseguire la distribuzione in una sottoscrizione, usare i comandi di distribuzione a livello di sottoscrizione.

Per l'interfaccia della riga di comando di Azure usare az deployment sub create. L'esempio seguente distribuisce un modello per creare un gruppo di risorse:

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

Per informazioni più dettagliate sui comandi e sulle opzioni di distribuzione per la distribuzione di modelli di ARM, vedere:

Percorso e nome della distribuzione

Per le distribuzioni a livello di sottoscrizione, è necessario specificare un percorso di distribuzione. Il percorso di distribuzione è separato dal percorso delle risorse distribuite e specifica dove archiviare i dati di distribuzione. Anche le distribuzioni di Gruppo di gestione e tenant richiedono una posizione. Per le distribuzioni del gruppo di risorse, il percorso del gruppo di risorse viene usato per archiviare i dati di distribuzione.

È possibile specificare un nome per la distribuzione oppure usare il nome predefinito. Il nome predefinito è il nome del file modello. Ad esempio, la distribuzione di un modello denominato main.json crea un nome di distribuzione predefinito principale.

Per ogni nome di distribuzione il percorso non è modificabile. Non è possibile creare una distribuzione in un percorso se esiste una distribuzione con lo stesso nome in un percorso diverso. Ad esempio, se si crea una distribuzione di sottoscrizione con il nome deployment1 in centralus , non è possibile creare in seguito un'altra distribuzione con il nome deployment1 ma con posizione westus. Se viene visualizzato il codice di errore InvalidDeploymentLocation, utilizzare un nome diverso o lo stesso percorso come la distribuzione precedente per tale nome.

Ambiti di distribuzione

Quando si esegue la distribuzione in una sottoscrizione, è possibile distribuire le risorse in:

  • sottoscrizione di destinazione dall'operazione
  • qualsiasi sottoscrizione nel tenant
  • gruppi di risorse all'interno della sottoscrizione o di altre sottoscrizioni
  • tenant per la sottoscrizione

È possibile definire l'ambito di una risorsa di estensione in una destinazione diversa dalla destinazione di distribuzione.

L'utente che distribuisce il modello deve avere accesso all’ambito specificato.

Ambito della sottoscrizione

Per distribuire le risorse nella sottoscrizione di destinazione, aggiungere tali risorse con la parola chiave resource.

targetScope = 'subscription'

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

Pergli esempi di distribuzione nella sottoscrizione, vedere Creare gruppi di risorse con Bicep e Assegnare una definizione dei criteri.

Per distribuire le risorse in una sottoscrizione diversa dalla sottoscrizione dall'operazione, aggiungere un modulo. Usare la funzione sottoscrizione per impostare la proprietà scope. Specificare la proprietà subscriptionId all'ID della sottoscrizione in cui si vuole eseguire la distribuzione.

targetScope = 'subscription'

param otherSubscriptionID string

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

Ambito per il gruppo di risorse

Per distribuire le risorse in un gruppo di risorse all'interno della sottoscrizione, aggiungere un modulo e impostarne la sua proprietà scope. Se il gruppo di risorse esiste già, usare la funzione resourceGroup per impostare il valore dell'ambito. Specificare il nome del gruppo di risorse.

targetScope = 'subscription'

param resourceGroupName string

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

Se il gruppo di risorse viene creato nello stesso file Bicep, usare il nome simbolico del gruppo di risorse per impostare il valore di ambito. Per un esempio di impostazione dell'ambito per il nome simbolico, vedere Creare un gruppo di risorse con Bicep.

Ambito del tenant

Per creare risorse nel tenant, aggiungere un modulo. Usare la funzione tenant per impostarne la proprietà scope.

L'utente che distribuisce il modello deve avere l'accesso obbligatorio per la distribuzione nel tenant.

L'esempio seguente include un modulo distribuito nel tenant.

targetScope = 'subscription'

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

Anziché usare un modulo, è possibile impostare l'ambito su tenant() per alcuni tipi di risorse. L'esempio seguente distribuisce un gruppo di gestione nel 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

Per altre informazioni, vedere Gruppo di gestione.

Gruppi di risorse

Per informazioni sulla creazione di gruppi di risorse, vedere Creare un gruppo di risorse con Bicep.

Criteri di Azure

Assegnare una definizione di criteri

L'esempio seguente assegna una definizione di criteri esistente alla sottoscrizione. Se la definizione di criteri accetta parametri, specificarli come oggetto. Se non accetta parametri, usare l'oggetto vuoto predefinito.

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

Creare e assegnare definizioni di criteri

È possibile definire e assegnare una definizione di criteri nello stesso file 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
  }
}

Controllo di accesso

Per informazioni sull'assegnazione dei ruoli, vedere Aggiungere assegnazioni di ruolo di Azure usando i modelli di Azure Resource Manager.

Nell'esempio seguente viene creato un gruppo di risorse, viene applicato un blocco e viene assegnato un ruolo a un'entità di sicurezza.

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

L'esempio seguente mostra il modulo per applicare il blocco:

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

L'esempio seguente mostra il modulo per assegnare il ruolo:

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

Passaggi successivi

Per altre informazioni sugli ulteriori ambiti, vedere: