Implementación de recursos en varios ámbitos

Completado

A veces es necesario implementar recursos en varios niveles de la jerarquía desde una implementación. Estas son algunas situaciones en las que puede resultarle útil:

  • Debe implementar recursos en dos grupos de recursos diferentes. Por ejemplo, puede crear un grupo de seguridad de red en un grupo de recursos compartido y también implementar una interfaz de red para una máquina virtual en un grupo de recursos para la aplicación.
  • Está usando una plantilla para crear un grupo de recursos, que es un recurso con ámbito de suscripción y, a continuación, quiere implementar una cuenta de almacenamiento y otros recursos de Azure en ese grupo de recursos mediante una implementación con ámbito de grupo de recursos.
  • Va a implementar una jerarquía de grupo de administración y también quiere implementar algunas suscripciones, que son recursos con ámbito de inquilino.

Con Bicep, puede crear una implementación que funcione en una variedad de ámbitos mediante la palabra clave scope.

Nota:

Los comandos de esta unidad se muestran para ilustrar conceptos. No los ejecute todavía. Pronto va a practicar lo que aprenderá aquí.

Especificación del ámbito de un módulo

Puede usar módulos de Bicep para implementar un conjunto de recursos en un ámbito diferente del targetScope especificado en el archivo. Este es un archivo de Bicep de ejemplo que se implementa con un targetScope de un subscription, pero utiliza un módulo para implementar algunos recursos en un grupo de recursos:

targetScope = 'subscription'

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

Observe que la propiedad scope usa una función de Bicep para ayudar a identificar el ámbito de destino. En el ejemplo anterior se usa la función resourceGroup() y se especifica el nombre del grupo de recursos de destino. También puede usar las funciones subscription(), managementGroup() y tenant(). Mediante el uso de la palabra clave targetScope en los archivos de Bicep y la palabra clave scope en los módulos, es posible crear una gran cantidad de combinaciones diferentes de ámbitos para las implementaciones.

Nota:

Una excepción es que los archivos de Bicep con un targetScope de resourceGroup o subscription no pueden incluir un módulo con un valor en scope de managementGroup.

Sugerencia

Si usa un archivo de Bicep con ámbito de suscripción para crear un grupo de recursos, puede usar el nombre simbólico del grupo de recursos como scope para un módulo. Verá cómo hacerlo en el ejercicio siguiente.

Implementación de varios grupos de recursos

Un uso común de los ámbitos es implementar recursos en varios grupos de recursos. Aunque no puede establecer la propiedad scope en la mayoría de los recursos de Azure, puede usar módulos para indicar a Bicep que un conjunto de recursos debe implementarse en un grupo de recursos diferente.

Por ejemplo, puede crear un único conjunto de archivos de Bicep que implemente una red virtual y sus recursos asociados en un grupo de recursos compartido denominado ToyNetworking y, a continuación, implementar una interfaz de red en otro grupo de recursos. Este es el aspecto que tiene el archivo de Bicep:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2020-11-01' = {
  name: 'production-nic'
  location: resourceGroup().location
  properties: {
    ipConfigurations: [
      {
        name: 'toy-subnet-ip-configuration'
        properties: {
          subnet: {
            id: networkModule.outputs.subnetResourceId
          }
        }
      }
    ]
  }
}

Observe que los recursos que se van a implementar en el grupo de recursos ToyNetworking se definen en un módulo y la salida subnetResourceId se usa en la definición de recursos de la interfaz de red.

Después de implementar este archivo, podría tener como destino otro grupo de recursos denominado ProjectTeddybear, de la siguiente manera:

az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...

Aunque la implementación tiene como destino el grupo de recursos ProjectTeddybear, los recursos de red virtual se implementarán en el grupo de recursos ToyNetworking. La interfaz de red se implementará en el grupo de recursos ProjectTeddybear.

Puede incluso implementar un grupo de recursos en otra suscripción incluyendo el identificador de suscripción en el ámbito resourceGroup:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
  name: 'networkModule'
}

Del mismo modo, puede usar la función con ámbito subscription() para implementar recursos en varias suscripciones en el ámbito de la suscripción, y puede usar la función con ámbito managementGroup() para implementar los recursos en varios grupos de administración. Sin embargo, no puede implementarlos en varios inquilinos.

Especificación del ámbito de un único recurso

La palabra clave scope se puede usar en otros tipos de recursos específicos, no solo en módulos. Los recursos de extensión usan la palabra clave scope para especificar a qué recurso se aplican. Además, los recursos con ámbito de inquilino pueden usar la palabra clave scope para que pueda implementarlos desde cualquier plantilla.

Por ejemplo, puede usar un archivo de Bicep para crear una jerarquía de grupos de administración, como se muestra en el ejemplo siguiente:

targetScope = 'managementGroup'

resource parentManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

Observe que este ejemplo usa targetScope = 'managementGroup' en el archivo de plantilla, pero luego implementa los grupos de administración dentro del ámbito tenant().

Nota:

En el ejemplo anterior se muestra cómo puede usar Bicep para crear una jerarquía de grupos de administración. El grupo de administración NonProduction será un elemento secundario del grupo de administración raíz, y el grupo de administración SecretRND será un elemento secundario del grupo de administración NonProduction.

Creación de un grupo de administración y una jerarquía de suscripciones

Ahora sabe cómo implementar muchos recursos diferentes en diversos ámbitos y sabe cómo usar los módulos de Bicep y la palabra clave scope para implementar combinaciones de recursos. Vamos a aplicar todos estos conocimientos nuevos a la extensión de la jerarquía de grupos de administración del ejemplo anterior. Ahora, la jerarquía también incluirá un alias de suscripción, que es un recurso con ámbito de inquilino que crea una nueva suscripción de Azure:

resource subscription 'Microsoft.Subscription/aliases@2020-09-01' = {
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

Nota:

Al crear un alias de suscripción, también especifica otras propiedades, como un ámbito de facturación. Los hemos omitido para mayor claridad.

A continuación, puede asociar la suscripción a un grupo de administración, lo que requiere que implemente un tipo de recurso denominado Microsoft.Management/managementGroups/subscriptions. Debido a la forma en que funciona este recurso, lo declararía en un módulo. Por ejemplo, a continuación se muestra un archivo denominado modules/mg-subscription-association.bicep:

targetScope = 'tenant'

@description('The name of the management group that should contain the subscription.')
param managementGroupName string

@description('The subscription ID to place into the management group.')
param subscriptionId string

resource managementGroup 'Microsoft.Management/managementGroups@2021-04-01' existing = {
  name: managementGroupName
}

resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2021-04-01' = {
  parent: managementGroup
  name: subscriptionId
}

Observe que se hace referencia al grupo de administración mediante la palabra clave existing.

A continuación, el archivo de Bicep principal puede crear la asociación mediante la inclusión del módulo. Este es el archivo de Bicep completo:

targetScope = 'managementGroup'

@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string

resource parentManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2020-05-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

resource subscription 'Microsoft.Subscription/aliases@2020-09-01' = {
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
  name: 'subscriptionAssociation'
  scope: tenant()
  params: {
    managementGroupName: childManagementGroup.name
    subscriptionId: subscription.properties.subscriptionId
  }
}

Como ha visto, puede usar todos los ámbitos y las características del lenguaje Bicep juntos para crear implementaciones sofisticadas de toda la infraestructura de Azure.