빠른 시작: Bicep를 사용하여 Azure Virtual Network Manager에서 메시 네트워크 토폴로지 만들기

모든 가상 네트워크 연결을 관리하기 위해 Bicep를 사용하여 Azure Virtual Network Manager를 시작합니다.

이 빠른 시작에서는 세 개의 가상 네트워크를 배포하고 Azure Virtual Network Manager를 사용하여 메시 네트워크 토폴로지를 만듭니다. 그런 다음, 연결 구성이 적용되었는지 확인합니다.

Azure 가상 네트워크 관리자를 사용하여 메시 가상 네트워크 토폴로지에 배포된 리소스의 다이어그램.

이 샘플에 대한 Bicep 솔루션은 리소스 그룹과 구독 범위 모두에서 배포를 사용할 수 있도록 여러 모듈로 세분화됩니다. 다음 섹션들은 Azure Virtual Network Manager에만 고유한 구성 요소들을 설명합니다. 이 구성 요소들 외에도, 솔루션은 가상 네트워크, 사용자 지정 신원, 역할 할당을 배포합니다.

가상 네트워크 관리자 자원을 정의하세요

이 리소스는 API 버전Microsoft.Network/networkManagers에서 가상 간 네트워크 연결을 위한 연결된 그룹을 구현하는 인스턴스를 2022-09-01 생성합니다. networkManagerScopes를 인스턴스가 관리하는 구독 또는 관리 그룹으로 설정하고, 인스턴스가 연결 구성를 배포할 수 있도록 ConnectivitynetworkManagerScopeAccesses에 유지하세요.

@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 어떤 자원을 배포할지 선택합니다; 두 자원 중 하나만 생성됩니다.

정적 회원 네트워크 그룹

API 버전Microsoft.Network/networkManagers/networkGroups에서 정적 네트워크 그룹 자원 2022-09-01 은 구성원을 명시적으로 명시합니다. 중첩된 staticMembers 자원은 자원 ID에 따라 스포크 가상 네트워크 A, B, C와 허브 가상 네트워크를 추가합니다. 자신의 가상 네트워크를 타겟팅하려면 매개변수 spokeNetworkGroupMembershubVnetId 변경하세요.

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

메시 연결성 구성을 정의하세요

API 버전 Microsoft.Network/networkManagers/connectivityConfigurations에서 연결 구성 자원 2022-09-01 은 네트워크 그룹을 메시 네트워크 토폴로지와 연관시킵니다. appliesToGroups 속성은 배포한 네트워크 그룹을 참조하며, connectivityTopologyMesh(으)로 설정합니다.

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

배포 스크립트로 구성을 커밋하세요

구성 파일을 대상 네트워크 그룹에 배포하려면 PowerShell 명령을 호출 Deploy-AzNetworkManagerCommit 하는 배포 스크립트를 사용하세요. 배포 스크립트는 가상 네트워크 관리자에 대해 PowerShell 스크립트를 실행할 수 있는 충분한 권한이 있는 아이덴티티가 필요합니다. Bicep 파일은 사용자 관리 ID를 만들고 대상 리소스 그룹에 대한 기여자 역할을 부여합니다. 배포 스크립트와 관련 식별에 대한 자세한 내용은 ARM 템플릿에서 배포 스크립트 사용하기를 참조하세요.

다음 자원은 API 버전 Microsoft.Resources/deploymentScripts.의 자료입니다2020-10-01. 이 스크립트는 사용자가 할당한 신원으로 로그인하고 Deploy-AzNetworkManagerCommit호출하는 인라인 PowerShell 스크립트를 실행합니다. 자체 배포에 맞게 azPowerShellVersion, retentionInterval, timeout 속성을 변경하세요. 전달 arguments되는 값을 변경하세요: 네트워크 관리자 이름, 대상 위치, 구성 ID, 구독 ID, 구성 유형, 리소스 그룹 이름.

@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 Policy 정의와 할당도 함께 배포합니다.

다음 자원은 API 버전 Microsoft.Authorization/policyDefinitions.의 자료입니다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정책을 배포하지 않는 것입니다.
  • 이 솔루션의 모든 리소스는 Azure 샘플 GitHub 리포지토리에서 사용할 수 있습니다. 리포지토리에서 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 Policy 배포됩니다.

정적 네트워크 그룹 멤버 자격을 사용하는 기본 배포

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

동적 네트워크 그룹 멤버 자격을 사용하여 배포

Azure Policy 사용하여 네트워크 그룹의 멤버 자격을 동적으로 관리하려면 배포 매개 변수 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 Virtual Network Manager 및 연결된 가상 네트워크가 더 이상 필요하지 않은 경우 리소스 그룹 및 해당 리소스를 삭제하여 제거합니다.

  1. Azure Portal에서 리소스 그룹인 resource-group을 찾습니다.
  2. 리소스 그룹을 선택하고 리소스 그룹 삭제를 선택합니다.
  3. 리소스 그룹 삭제에서 텍스트 상자에 리소스 그룹을 입력하여 삭제할지 확인한 다음 삭제를 선택합니다.
  4. 동적 네트워크 그룹 멤버 자격을 사용한 경우 포털에서 구독으로 이동하고 정책을 선택하여 배포된 Azure Policy 정의 및 할당을 삭제합니다. 정책에서 명명된 AVNM quickstart dynamic group membership Policy을 찾아 삭제한 다음, 명명AVNM quickstart dynamic group membership Policy에 대해 동일한 작업을 수행합니다.

다음 단계

이제 Azure Virtual Network Manager 인스턴스를 만들었으므로 보안 관리자 구성을 사용하여 네트워크 트래픽을 차단하는 방법을 알아봅니다.