Implementaciones de suscripción con archivos de Bicep

Para simplificar la administración de recursos, puede implementar recursos en el nivel de la suscripción de Azure. Por ejemplo, puede implementar directivas y el control de acceso basado en rol (RBAC de Azure) en su suscripción, y se aplicarán a ella en su totalidad.

En este artículo se describe cómo establecer el ámbito de implementación en una suscripción en un archivo de Bicep.

Nota:

Puede implementar en 800 grupos de recursos distintos en una implementación de nivel de suscripción.

Recursos de aprendizaje

Para más información sobre los ámbitos de implementación con una guía paso a paso, consulte Implementación de recursos en suscripciones, grupos de administración e inquilinos mediante Bicep.

Recursos compatibles

No todos los tipos de recursos se pueden implementar en el nivel de suscripción. En esta sección se enumeran los tipos de recursos que se admiten.

Para Azure Blueprints, use:

Para las directivas de Azure, use:

Para el control de acceso, use:

Para plantillas anidadas que se implementan en grupos de recursos, use:

Para crear grupos de recursos, use:

Para administrar su suscripción, use:

Por motivos de supervisión, use:

Por motivos de seguridad, use:

Otros tipos admitidos incluyen:

Ámbito de conjunto

Para establecer el ámbito en la suscripción, use:

targetScope = 'subscription'

Comandos de implementación

Para implementar en una suscripción, use los comandos de implementación de nivel de suscripción.

Para la CLI de Azure, use az deployment sub create. El ejemplo siguiente implementa una plantilla para crear un grupo de recursos:

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

Para obtener información más detallada sobre los comandos y las opciones de implementación para la implementación de plantillas de Resource Manager, vea:

Ubicación y nombre de la implementación

En el caso de las implementaciones de nivel de suscripción, debe proporcionar una ubicación para la implementación. La ubicación de la implementación es independiente de la ubicación de los recursos que se implementan. La ubicación de implementación especifica dónde se almacenarán los datos de la implementación. Las implementaciones de grupo de administración e inquilino también requieren una ubicación. En las implementaciones de grupo de recursos, la ubicación del grupo de recursos se usa para almacenar los datos de implementación.

Puede proporcionar un nombre para la implementación o usar el nombre de implementación predeterminado. El nombre predeterminado es el nombre del archivo de plantilla. Por ejemplo, la implementación de una plantilla denominada main.json crea un nombre de implementación predeterminado de main.

Para cada nombre de implementación, la ubicación es inmutable. No se puede crear una implementación en una ubicación si ya existe una implementación con el mismo nombre en otra ubicación. Por ejemplo, si crea una implementación de suscripción con el nombre deployment1 en centralus, no podrá crear otra implementación con el nombre deployment1, sino una ubicación de westus. Si recibe el código de error InvalidDeploymentLocation, use un nombre diferente o utilice la ubicación de la implementación anterior que tenía ese mismo nombre.

Ámbitos de implementación

Al implementar en una suscripción, puede implementar los recursos en:

  • la suscripción de destino de la operación
  • cualquier suscripción en el inquilino
  • grupos de recursos en la suscripción o en otras
  • inquilino para la suscripción

Un recurso de extensión se puede aplicar al ámbito de un destino distinto del destino de implementación.

El usuario que implementa la plantilla debe tener acceso al ámbito especificado.

Ámbito de la suscripción

Para implementar recursos en la suscripción de destino, agregue esos recursos con la palabra clave resource.

targetScope = 'subscription'

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

Para obtener ejemplos de cómo implementar en la suscripción, vea Creación de grupos de recursos con Bicep y Asignación de la definición de directiva.

Para implementar recursos en una suscripción diferente de la suscripción de la operación, agregue un módulo. Use la función de suscripción para establecer la propiedad scope. Proporcione la propiedad subscriptionId en el id. de la suscripción en la que quiere realizar la implementación.

targetScope = 'subscription'

param otherSubscriptionID string

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

Ámbito del grupo de recursos

Para implementar recursos en un grupo de recursos dentro de la suscripción, agregue un módulo y establezca su propiedad scope. Si el grupo de recursos ya existe, use la función resourceGroup para establecer el valor de ámbito. Proporcione el nombre del grupo de recursos.

targetScope = 'subscription'

param resourceGroupName string

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

Si el grupo de recursos se crea en el mismo archivo de Bicep, use el nombre simbólico del grupo de recursos para establecer el valor de ámbito. Para un ejemplo de cómo establecer el ámbito en el nombre simbólico, consulte Creación del grupo de recursos con Bicep.

Ámbito del inquilino

Para crear recursos en el inquilino, agregue un módulo. Use la función tenant para establecer su propiedad scope.

El usuario que implementa la plantilla debe tener el acceso necesario para realizar implementaciones en el inquilino.

En el ejemplo siguiente se incluye un módulo que se implementa en el inquilino.

targetScope = 'subscription'

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

En lugar de usar un módulo, puede establecer el ámbito en tenant() para algunos tipos de recursos. En el ejemplo siguiente se implementa un grupo de administración en el inquilino.

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

Para más información, consulte Grupo de administración.

Grupos de recursos

Para obtener información sobre cómo crear grupos de recursos, consulte Creación de un grupo de recursos con Bicep.

Azure Policy

Asignación de una definición de directiva

En el ejemplo siguiente se asigna una definición de directiva existente a la suscripción. Si la definición de directiva toma parámetros, proporciónelos como un objeto. Si la definición de directiva no toma parámetros, use el objeto vacío predeterminado.

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

Creación y asignación de definiciones de directiva

Puede definir y asignar una definición de directiva en el mismo archivo de 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
  }
}

Control de acceso

Para más información sobre la asignación de roles, consulte Incorporación de asignaciones de roles mediante plantillas de Azure Resource Manager.

En el ejemplo siguiente, se crea un grupo de recursos, se le aplica un bloqueo y se asigna un rol a una entidad de seguridad.

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

En el ejemplo siguiente se muestra el módulo para aplicar el bloqueo:

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

En el ejemplo siguiente se muestra el módulo para asignar el rol:

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

Pasos siguientes

Para obtener más información sobre otros ámbitos, consulte: