Краткое руководство: создание топологии ячеистой сети с помощью Диспетчер виртуальных сетей Azure с использованием Bicep

Начните работу с Диспетчер виртуальных сетей Azure, используя Bicep для управления сетевой связностью всех ваших виртуальных сетей.

В этом кратком руководстве вы развернете три виртуальные сети и используете Диспетчер виртуальных сетей Azure для создания топологии ячеистой сети. Затем убедитесь, что была применена конфигурация подключения.

Схема ресурсов, развернутых для топологии виртуальной сети сетки с помощью диспетчера виртуальных сетей Azure.

Решение Bicep для этого примера разбито на модули для поддержки развертывания как на уровне группы ресурсов, так и на уровне подписки. В следующих разделах описываются компоненты, уникальные для Диспетчер виртуальных сетей Azure. Кроме этих компонентов, решение разворачивает виртуальные сети, присваиваемый пользователю идентификатор и назначение ролей.

Определите ресурс менеджера виртуальной сети

Этот ресурс создаёт экземпляр Microsoft.Network/networkManagers с версией API 2022-09-01, который реализует подключённую группу для обеспечения связи между виртуальными сетями. Задайте для networkManagerScopes подписки или группы управления, которыми управляет экземпляр, и оставьте Connectivity в networkManagerScopeAccesses, чтобы экземпляр мог развернуть конфигурации подключения.

@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: []
    }
  }
}

Определить статические и динамические сетевые группы

Решение поддерживает либо статическую группу сети членства, либо динамическую группу сети членства. Параметр networkGroupMembershipType определяет, какой из них будет развернут; создается только один из двух ресурсов.

Сетевая группа со статическим членством

Статический сетевой групповой ресурс в Microsoft.Network/networkManagers/networkGroups версии 2022-09-01API явно называет своих членов. Вложенные ресурсы staticMembers добавляют виртуальные сети spoke A, B и C, а также виртуальную сеть hub, используя идентификатор ресурса. Чтобы указать собственные виртуальные сети, измените параметры spokeNetworkGroupMembers и hubVnetId.

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

Сетевая группа с динамическим членством

Ресурс группы динамической сети объявляет отсутствие участников. Членство заполняется определением Политика Azure, описанным в разделе Define the dynamic membership policy.

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

Определите конфигурацию связности сетки

Ресурс конфигурации подключения Microsoft.Network/networkManagers/connectivityConfigurations в версии API 2022-09-01 связывает сетевую группу с топологией ячеистой сети. Свойство appliesToGroups ссылается на развернутую вами сетевую группу, а connectivityTopology вы установили в значение Mesh.

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

Зафиксируйте конфигурацию с помощью скрипта развертывания

Для развертывания конфигурации в целевой сетевой группе используйте скрипт развертывания, вызывающий Deploy-AzNetworkManagerCommit команду PowerShell. Скрипт развертывания требует идентичности с достаточными правами для запуска скрипта PowerShell на виртуальном сетевом менеджере. Файл Bicep создает управляемое пользователем удостоверение и предоставляет ей роль участника в целевой группе ресурсов. Для получения дополнительной информации о скриптах развертывания и связанных идентичностях см. раздел «Использование скриптов развертывания в шаблонах ARM».

Следующий ресурс является ресурсом Microsoft.Resources/deploymentScripts версии API 2020-10-01. Он запускает встроенный скрипт PowerShell, который входит в систему с идентификатором, назначенным пользователем, и вызывает Deploy-AzNetworkManagerCommit. Измените свойства azPowerShellVersion, retentionIntervalи timeout для вашего собственного развертывания. Измените значения, передаваемые через arguments: имя диспетчера сети, целевые расположения, идентификаторы конфигурации, идентификатор подписки, тип конфигурации и имя группы ресурсов.

@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: $_"
    }
    '''
    }
}

Определите политику динамического членства

Когда вы настраиваете развертывание для использования членства в группе сети dynamic, решение также развертывает определение политики Политика Azure и ее назначение.

Следующий ресурс является ресурсом Microsoft.Authorization/policyDefinitions версии API 2021-06-01. Он использует режим политики Microsoft.Network.Data и эффект addToNetworkGroup, который добавляет соответствующие виртуальные сети в сетевую группу, определённую с помощью networkGroupId. Правило политики применяется к виртуальным сетям, которые имеют тег _avnm_quickstart_deployment и находятся в группе ресурсов этого примера. Измените название тега и фильтр группы ресурсов в like состоянии, чтобы они соответствовали вашей среде.

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

Развертывание решения Bicep

Предварительные требования к развертыванию

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
  • Разрешения на создание определения политики и назначения политик в целевой области подписки. Эти разрешения необходимы при использовании параметра развертывания networkGroupMembershipType=Dynamic для развертывания необходимых ресурсов политики для членства в сетевой группе. По умолчанию используется static, что не развертывает политику.
  • Все ресурсы этого решения доступны в репозитории GitHub Azure Samples. Вы можете скачать решение Bicep из репозитория или клонировать репозиторий на локальный компьютер.

Скачайте решение Bicep

  1. Скачайте ZIP-архив примера репозитория по этой ссылке.
  2. Извлеките скачанный ZIP-файл. В терминале перейдите в извлеченный avnm-mesh-connected-group каталог. Файлы Bicep для этого решения находятся в подкаталоге bicep.

Кроме того, можно использовать git для клонирования репозитория:

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

Подключение к Azure

Войдите в учетную запись Azure и выберите подписку.

Чтобы начать настройку, войдите в учетную запись Azure:

Connect-AzAccount

Затем подключитесь к подписке:

Set-AzContext -Subscription <subscription name or id>
Установка модуля Azure PowerShell

Установите последний модуль Az.Network Azure PowerShell с помощью следующей команды:

 Install-Module -Name Az.Network -RequiredVersion 5.3.0

Параметры развертывания

  • resourceGroupName: [обязательно] Имя группы ресурсов, в которой требуется развернуть диспетчер виртуальных сетей и примеры виртуальных сетей.
  • местоположение: [обязательный] Местоположение для развертывания ресурсов.
  • networkGroupMembershipType: [необязательно] Тип членства в группе сети для развертывания. Значение по умолчанию static— но вы можете использовать dynamic для динамического членства в группах.

Примечание.

Выбор динамического членства в группах развертывает Политика Azure для управления членством, что требует дополнительных разрешений.

Развертывание по умолчанию с членством в статической группе сети

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

Развертывание с членством в динамической группе сети

Чтобы использовать Политика Azure для динамического управления составом сетевой группы, включите в параметры развертывания параметр networkGroupMembershipType со значением dynamic.

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

Проверка развертывания конфигурации

Используйте раздел Network Manager для каждой виртуальной сети, чтобы убедиться, что вы развернули конфигурацию:

  1. Перейдите к виртуальной сети vnet-learn-prod-{location}-spoke001 .

  2. В разделе "Параметры" выберите Network Manager.

  3. На вкладке "Конфигурации подключения" убедитесь, что в списке появится cc-learn-prod-{location}-mesh001 .

    Снимок экрана: конфигурация подключения, указанная для виртуальной сети.

  4. Повторите предыдущие шаги для vnet-learn-prod-{location}-spoke004 — вы должны увидеть, что vnet-learn-prod-{location}-spoke004 исключена из конфигурации связности.

Очистка ресурсов

Если вам больше не нужно Диспетчер виртуальных сетей Azure и связанных виртуальных сетей, удалите их, удалив группу ресурсов и ее ресурсы.

  1. На портале Azure перейдите к группе ресурсов — resource-group.
  2. Выберите группу ресурсов и выберите " Удалить группу ресурсов".
  3. В разделе "Удаление группы ресурсов" убедитесь, что вы хотите удалить, введя группу ресурсов в текстовом поле, а затем нажмите кнопку "Удалить".
  4. Если вы использовали динамическое членство в сетевой группе, удалите развёрнутые определение и назначение политики Azure, перейдите к подписке в портале и выберите раздел Политики. В Политиках найдите назначение с именем AVNM quickstart dynamic group membership Policy и удалите его, затем сделайте то же самое для определения с именем AVNM quickstart dynamic group membership Policy.

Следующие шаги

Теперь, когда вы создали экземпляр Диспетчер виртуальных сетей Azure, узнайте, как заблокировать сетевой трафик с помощью конфигурации администратора безопасности: