Inicio rápido: Crear una topología de red de malla con Azure Virtual Network Manager mediante el uso de Bicep

Comience a utilizar Azure Virtual Network Manager con Bicep para administrar la conectividad de todas sus redes virtuales.

En este artículo de inicio rápido, implementará tres redes virtuales y usará Azure Virtual Network Manager para crear una topología de red de malla. Después, compruebe si se ha aplicado la configuración de conectividad.

Diagrama de recursos implementados para una topología de red virtual en malla con el administrador de red virtual de Azure.

Módulos de archivo de Bicep

La solución Bicep para este ejemplo se divide en módulos para permitir implementaciones tanto a nivel de grupo de recursos como de suscripción. Las secciones del archivo que se detallan en la lista siguiente son los componentes únicos de Administrador de redes virtuales. Además de las secciones detalladas en la lista siguiente, la solución implementa redes virtuales, una identidad asignada por el usuario y una asignación de roles.

Administrador de redes virtuales, grupos de redes y configuraciones de conectividad

Administrador de redes virtuales

@description('This is the Azure Virtual Network Manager which will be used to implement the connected group for inter-vnet connectivity.')
resource networkManager 'Microsoft.Network/networkManagers@2022-09-01' = {
  name: 'vnm-learn-prod-${location}-001'
  location: location
  properties: {
    networkManagerScopeAccesses: [
      'Connectivity'
    ]
    networkManagerScopes: {
      subscriptions: [
        '/subscriptions/${subscription().subscriptionId}'
      ]
      managementGroups: []
    }
  }
}

Grupos de red

Esta solución admite la creación de grupos de red de pertenencia estática o grupos de red de pertenencia dinámica. El grupo de red de pertenencia estática especifica sus miembros mediante el ID de red virtual.

Grupo de red de miembros estáticos

@description('This is the static network group for the all VNETs.')
resource networkGroupSpokesStatic 'Microsoft.Network/networkManagers/networkGroups@2022-09-01' = if (networkGroupMembershipType == 'static') {
  name: 'ng-learn-prod-${location}-static001'
  parent: networkManager
  properties: {
    description: 'Network Group - Static'
  }

  // add spoke vnets A, B, and C to the static network group
  resource staticMemberSpoke 'staticMembers@2022-09-01' = [for spokeMember in spokeNetworkGroupMembers: if (contains(groupedVNETs,last(split(spokeMember,'/')))) {
    name: 'sm-${(last(split(spokeMember, '/')))}'
    properties: {
      resourceId: spokeMember
    }
  }]

  resource staticMemberHub 'staticMembers@2022-09-01' = {
    name: 'sm-${(toLower(last(split(hubVnetId, '/'))))}'
    properties: {
      resourceId: hubVnetId
    }
  }
}

Grupo de red de pertenencia dinámica

@description('This is the dynamic group for all VNETs.')
resource networkGroupSpokesDynamic 'Microsoft.Network/networkManagers/networkGroups@2022-09-01' = if (networkGroupMembershipType == 'dynamic') {
  name: 'ng-learn-prod-${location}-dynamic001'
  parent: networkManager
  properties: {
    description: 'Network Group - Dynamic'
  }
}

Configuración de conectividad

La Configuración de conectividad asocia el grupo de redes con la topología de red especificada.

@description('This connectivity configuration defines the connectivity between VNETs using Direct Connection. The hub will be part of the mesh, but gateway routes from the hub will not propagate to spokes.')
resource connectivityConfigurationMesh 'Microsoft.Network/networkManagers/connectivityConfigurations@2022-09-01' = {
  name: 'cc-learn-prod-${location}-mesh001'
  parent: networkManager
  properties: {
    description: 'Mesh connectivity configuration'
    appliesToGroups: [
      {
        networkGroupId: (networkGroupMembershipType == 'static') ? networkGroupSpokesStatic.id : networkGroupSpokesDynamic.id
        isGlobal: 'False'
        useHubGateway: 'False'
        groupConnectivity: 'DirectlyConnected'
      }
    ]
    connectivityTopology: 'Mesh'
    deleteExistingPeering: 'True'
    hubs: []
    isGlobal: 'False'
  }
}

Script de implementación

Para implementar la configuración en el grupo de red de destino, use un script de implementación que llame al Deploy-AzNetworkManagerCommit comando de PowerShell. El script de implementación necesita una identidad con permisos suficientes para ejecutar el script de PowerShell en el Administrador de redes virtuales. El archivo Bicep crea una identidad administrada por el usuario y le concede el rol Colaborador en el grupo de recursos de destino. Para obtener más información sobre los scripts de implementación y las identidades asociadas, consulte Uso de scripts de implementación en plantillas de ARM.

@description('Create a Deployment Script resource to perform the commit/deployment of the Network Manager connectivity configuration.')
resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: deploymentScriptName
  location: location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentityId}': {}
    }
  }
  properties: {
    azPowerShellVersion: '8.3'
    retentionInterval: 'PT1H'
    timeout: 'PT1H'
    arguments: '-networkManagerName "${networkManagerName}" -targetLocations ${location} -configIds ${configurationId} -subscriptionId ${subscription().subscriptionId} -configType ${configType} -resourceGroupName ${resourceGroup().name}'
    scriptContent: '''
    param (
      # AVNM subscription id
      [parameter(mandatory=$true)][string]$subscriptionId,

      # AVNM resource name
      [parameter(mandatory=$true)][string]$networkManagerName,

      # string with comma-separated list of config ids to deploy. ids must be of the same config type
      [parameter(mandatory=$true)][string[]]$configIds,

      # string with comma-separated list of deployment target regions
      [parameter(mandatory=$true)][string[]]$targetLocations,

      # configuration type to deploy. must be either connectivity or securityadmin
      [parameter(mandatory=$true)][ValidateSet('Connectivity','SecurityAdmin')][string]$configType,

      # AVNM resource group name
      [parameter(mandatory=$true)][string]$resourceGroupName
    )
  
    $null = Login-AzAccount -Identity -Subscription $subscriptionId
  
    [System.Collections.Generic.List[string]]$configIdList = @()  
    $configIdList.addRange($configIds) 
    [System.Collections.Generic.List[string]]$targetLocationList = @() # target locations for deployment
    $targetLocationList.addRange($targetLocations)     
    
    $deployment = @{
        Name = $networkManagerName
        ResourceGroupName = $resourceGroupName
        ConfigurationId = $configIdList
        TargetLocation = $targetLocationList
        CommitType = $configType
    }
  
    try {
      Deploy-AzNetworkManagerCommit @deployment -ErrorAction Stop
    }
    catch {
      Write-Error "Deployment failed with error: $_"
      throw "Deployment failed with error: $_"
    }
    '''
    }
}

Directiva de pertenencia a grupos de red dinámicos

Al configurar la implementación para usar la pertenencia a grupos de red dynamic, la solución también implementa una definición y una asignación de Azure Policy. En el ejemplo siguiente se muestra la definición de directiva.

@description('This is a Policy definition for dynamic group membership')
resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2021-06-01' = {
  name: uniqueString(networkGroupId)
  properties: {
    description: 'AVNM quickstart dynamic group membership Policy'
    displayName: 'AVNM quickstart dynamic group membership Policy'
    mode: 'Microsoft.Network.Data'
    policyRule: {
      if: {
        allof: [
          {
            field: 'type'
            equals: 'Microsoft.Network/virtualNetworks'
          }
          {
            // virtual networks must have a tag where the key is '_avnm_quickstart_deployment'
            field: 'tags[_avnm_quickstart_deployment]'
            exists: true
          }
          {
            // virtual network ids must include this sample's resource group ID - limiting the chance that dynamic membership impacts other vnets in your subscriptions
            field: 'id'
            like: '${subscription().id}/resourcegroups/${resourceGroupName}/*'
          }
        ]
      }
      then: {
        // 'addToNetworkGroup' is a special effect used by AVNM network groups
        effect: 'addToNetworkGroup'
        details: {
          networkGroupId: networkGroupId
        }
      }
    }
  }
}

Implementación de la solución de Bicep

Requisitos previos de implementación

  • Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
  • Permisos para crear una definición de directiva y una asignación de directiva en el ámbito de la suscripción de destino. Necesita estos permisos al usar el parámetro networkGroupMembershipType=Dynamic de implementación para implementar los recursos de directiva necesarios para la pertenencia a grupos de red. El valor predeterminado es static, que no implementa una directiva.
  • Todos los recursos de esta solución están disponibles en el repositorio de GitHub Azure Samples. Puede descargar la solución Bicep desde el repositorio o clonar el repositorio en la máquina local.

Descargar la solución de Bicep

  1. Descargue un archivo ZIP del repositorio de ejemplo en este vínculo.
  2. Extraiga el archivo ZIP descargado. En el terminal, vaya al directorio extraído avnm-mesh-connected-group . Los archivos Bicep para esta solución se encuentran en el bicep subdirectorio.

Como alternativa, puede usar git para clonar el repositorio:

git clone https://github.com/Azure-Samples/avnm-mesh-connected-group
cd avnm-mesh-connected-group

Conexión con Azure

Iniciar sesión en la cuenta de Azure y seleccione la suscripción

Para empezar la configuración, inicie sesión en la cuenta de Azure:

Connect-AzAccount

Luego, conéctela a la suscripción:

Set-AzContext -Subscription <subscription name or id>
Instalación del módulo de Azure PowerShell

Instale el módulo Az.Network de Azure PowerShell más reciente mediante este comando:

 Install-Module -Name Az.Network -RequiredVersion 5.3.0

Parámetros de implementación

  • resourceGroupName: [obligatorio] Nombre del grupo de recursos donde desea implementar el administrador de red virtual y las redes virtuales de ejemplo.
  • location: [required] La ubicación de los recursos que se van a implementar.
  • networkGroupMembershipType: [opcional] Tipo de pertenencia a grupos de red que se va a implementar. El valor predeterminado es static, pero puede usar dynamic para la pertenencia dinámica a grupos.

Nota:

La elección de la pertenencia dinámica a grupos implementa una Azure Policy para administrar la pertenencia, lo que requiere más permisos.

Implementación predeterminada con pertenencia a grupos de red estáticos

New-AzSubscriptionDeployment -Name avnm-mesh-connected-group -Location <deploymentLocation> -TemplateFile ./bicep/main.bicep -resourceGroupName <newOrExistingResourceGroup>

Implementación con pertenencia dinámica a grupos de red

Para usar Azure Policy para administrar dinámicamente la pertenencia del grupo de red, incluya el parámetro networkGroupMembershipType de implementación con un valor de dynamic.

New-AzSubscriptionDeployment -Name avnm-mesh-connected-group -Location <deploymentLocation> -TemplateFile ./bicep/main.bicep -resourceGroupName <newOrExistingResourceGroup> -networkGroupMembershipType dynamic

Comprobación de la implementación de la configuración

Use la sección Network Manager para cada red virtual para comprobar que ha implementado la configuración:

  1. Vaya a la red virtual vnet-learn-prod-{location}-spoke001.

  2. En Configuración, seleccione Network Manager.

  3. En la pestaña Configuraciones de Conectividad, compruebe que cc-learn-prod-{location}-mesh001 aparece en la lista.

    Captura de pantalla de una configuración de conectividad asociada a una red virtual.

  4. Repita los pasos anteriores en vnet-learn-prod-{location}-spoke004; debería ver que vnet-learn-prod-{location}-spoke004 está excluida de la configuración de conectividad.

Limpieza de recursos

Si ya no necesita Azure Virtual Network Manager y las redes virtuales asociadas, quítelos eliminando el grupo de recursos y sus recursos.

  1. En el Azure Portal, vaya a su grupo de recursos - grupo de recursos.
  2. Seleccione el grupo de recursos y elija Eliminar grupo de recursos.
  3. En Eliminar un grupo de recursos, confirme que desea eliminar escribiendo el grupo de recursos en el cuadro de texto y, a continuación, seleccione Eliminar.
  4. Si usó Pertenencia dinámica a grupos de red, elimine la definición y la asignación de Azure Policy implementadas; para ello, vaya a la suscripción en el portal y seleccione Directivas. En Directivas, busque la asignación denominada AVNM quickstart dynamic group membership Policy y elimínela y, a continuación, haga lo mismo para la definición denominada AVNM quickstart dynamic group membership Policy.

Pasos siguientes

Ahora que ha creado una instancia de Azure Virtual Network Manager, aprenda a bloquear el tráfico de red mediante una configuración de administrador de seguridad: