Déploiements d’abonnements avec des fichiers Bicep

Pour simplifier la gestion des ressources, vous pouvez déployer des ressources au niveau de votre abonnement Azure. Par exemple, vous pouvez déployer des stratégies et un contrôle d’accès en fonction du rôle Azure (Azure RBAC) sur votre abonnement, ce qui les applique à l’ensemble de votre abonnement.

Cet article explique comment définir l’étendue de déploiement sur un abonnement dans un fichier Bicep.

Notes

Vous pouvez déployer sur 800 différents groupes de ressources dans un déploiement de niveau abonnement.

Ressources de formation

Si vous préférez découvrir les étendues de déploiement via des instructions d’aide pas à pas, consultez Déployer des ressources sur des abonnements, des groupes d’administration et des locataires en utilisant Bicep.

Ressources prises en charge

Tous les types de ressources ne peuvent pas être déployés au niveau de l’abonnement. Cette section répertorie les types de ressources pris en charge.

Pour Azure Blueprints, utilisez :

Pour les stratégies Azure, utilisez :

Pour le contrôle d’accès, utilisez :

Pour les modèles imbriqués déployés sur des groupes de ressources, utilisez :

Pour la création de groupes de ressources, utilisez :

Pour la gestion de votre abonnement, utilisez :

Pour la supervision, utilisez :

Pour la sécurité, utilisez :

Les autres types pris en charge sont les suivants :

Étendue de jeu

Définissez l’étendue vers l’abonnement, utilisez :

targetScope = 'subscription'

Commandes de déploiement

Pour déployer sur un abonnement, utilisez les commandes de déploiement au niveau de l’abonnement.

Pour l’interface de ligne de commande Azure, utilisez az deployment sub create. L’exemple suivant déploie un modèle pour créer un groupe de ressources :

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

Pour plus d’informations sur les commandes et options de déploiement de modèles Resource Manager, consultez :

Emplacement et nom du déploiement

Pour les déploiements au niveau de l’abonnement, vous devez fournir un emplacement de déploiement. L’emplacement du déploiement est distinct de l’emplacement des ressources que vous déployez. L’emplacement de déploiement indique où stocker les données de déploiement. Les déploiements de groupes d’administration et de locataires nécessitent également un emplacement. Pour les déploiements de groupes de ressources, l’emplacement du groupe de ressources est utilisé pour stocker les données de déploiement.

Vous pouvez fournir un nom de déploiement ou utiliser le nom de déploiement par défaut. Le nom par défaut est le nom du fichier de modèle. Par exemple, le déploiement d’un modèle nommé main.json crée un nom de déploiement par défaut principal.

Pour chaque nom de déploiement, l’emplacement est immuable. Il n’est pas possible de créer un déploiement dans un emplacement s’il existe un déploiement du même nom dans un autre emplacement. Par exemple, si vous créez un déploiement d’abonnement avec le nom deployment1 dans centralus, vous ne pouvez pas créer par la suite un autre déploiement avec le nom deployment1, mais à l’emplacement westus. Si vous obtenez le code d’erreur InvalidDeploymentLocation, utilisez un autre nom ou le même emplacement que le déploiement précédent pour ce nom.

Étendues de déploiement

Lors du déploiement dans un abonnement, vous pouvez déployer des ressources vers :

  • l’abonnement cible de l’opération
  • tout abonnement dans le locataire
  • des groupes de ressources dans le même abonnement ou dans d’autres abonnements
  • le locataire de l’abonnement

Une ressource d’extension peut être étendue à une cible différente de la cible de déploiement.

L’utilisateur qui déploie le modèle doit avoir accès à l’étendue spécifiée.

Étendue à l’abonnement

Pour déployer des ressources vers l’abonnement cible, ajoutez ces ressources avec le mot clé resource.

targetScope = 'subscription'

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

Pour obtenir des exemples de déploiement sur l’abonnement, consultez Créer des groupes de ressources avec Bicep et Affecter une définition de stratégie.

Pour déployer des ressources dans un abonnement différent de l’abonnement de l’opération, ajoutez un module. Utilisez la fonction d’abonnement pour définir la propriété scope. Définissez la propriété subscriptionId sur l’ID de l’abonnement sur lequel vous souhaitez effectuer le déploiement.

targetScope = 'subscription'

param otherSubscriptionID string

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

Étendue au groupe de ressources

Pour déployer des ressources dans un groupe de ressources au sein de l’abonnement, ajoutez un module et définissez sa propriété scope. Si le groupe de ressources existent déjà, utilisez la fonction resourceGroup pour définir la valeur de l’étendue. Fournissez le nom du groupe de ressources.

targetScope = 'subscription'

param resourceGroupName string

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

Si le groupe de ressources est créé dans le même fichier Bicep, utilisez le nom symbolique du groupe de ressources pour définir la valeur de l’étendue. Pour obtenir un exemple de définition de l’étendue sur le nom symbolique, consultez Créer un groupe de ressources avec Bicep.

Étendue au locataire

Pour créer des ressources au niveau du locataire, ajoutez un module. Utilisez la fonction locataire pour définir sa propriété scope.

L’utilisateur qui déploie le modèle doit disposer de l’accès requis pour déployer au niveau du locataire.

L’exemple suivant inclut un module qui est déployé sur le locataire.

targetScope = 'subscription'

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

Au lieu d’utiliser un module, vous pouvez définir l’étendue sur tenant() pour certains types de ressources. L’exemple suivant déploie un groupe d’administration au niveau du locataire.

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

Pour plus d’informations, consultez Groupe d’administration.

Groupes de ressources

Pour des informations sur la création de groupes de ressources, consultez Créer un groupe de ressources avec Bicep.

Azure Policy

Affecter une définition de stratégie

L’exemple suivant assigne une définition de stratégie existante à l’abonnement. Si la définition de stratégie utilise des paramètres, fournissez-les en tant qu’objet. Si la définition de stratégie n’accepte pas de paramètres, utilisez l’objet vide par défaut.

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

Créer et attribuer des définitions de stratégie

Vous pouvez définir et attribuer une définition de stratégie dans le même fichier 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
  }
}

Contrôle d’accès

Pour en savoir plus sur l’attribution de rôles, consultez Ajouter des attributions de rôle Azure à l’aide de modèles Resource Manager.

L’exemple suivant crée un groupe de ressources, lui applique un verrou et attribue un rôle à un principal.

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’exemple ci-dessous montre le module pour appliquer le verrou :

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

L’exemple suivant montre le module pour attribuer le rôle :

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

Étapes suivantes

Pour en apprendre plus sur d’autres étendues, consultez :