クイックスタート: Bicep を使用して Azure Virtual Network Manager でメッシュ ネットワーク トポロジを作成する

Bicep を使用した Azure Virtual Network Manager の利用を開始して、すべての仮想ネットワークの接続を管理します。

このクイックスタートでは、3 つの仮想ネットワークをデプロイし、Azure Virtual Network Manager を使用してメッシュ ネットワーク トポロジを作成します。 次に、接続構成が適用されたことを確認します。

メッシュ仮想ネットワーク トポロジ用に Azure Virtual Network Manager を使用してデプロイされたリソースの図。

このサンプルの 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パラメータはどのリソースを展開するかを選択します。2つのリソースのうち1つだけが作成されます。

静的会員ネットワークグループ

APIバージョンMicrosoft.Network/networkManagers/networkGroups2022-09-01 静的ネットワークグループリソースは、メンバー名を明示的に示します。 ネストされた staticMembers リソースは、リソースIDによってスポーク仮想ネットワークA、B、Cに加えハブ仮想ネットワークを追加します。 自分の仮想ネットワークをターゲットにするには、 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 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/connectivityConfigurations2022-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'
  }
}

デプロイスクリプトで設定をコミットします

設定をターゲットネットワークグループに展開するには、 Deploy-AzNetworkManagerCommitPowerShellコマンドを呼び出すデプロイスクリプトを使用します。 デプロイメントスクリプトは、PowerShellスクリプトを仮想ネットワークマネージャーに対して実行するための十分な権限を持つアイデンティティが必要です。 Bicep ファイルは、ユーザーマネージド ID を作成し、ターゲット リソース グループに対する共同作成者ロールを付与します。 デプロイスクリプトおよび関連する識別子の詳細については、「 ARMテンプレートでデプロイススクリプトを使う」をご覧ください。

以下のリソースはAPIバージョンMicrosoft.Resources/deploymentScriptsのリソース2020-10-01です。 ユーザー割り当てのIDでサインインし、 Deploy-AzNetworkManagerCommitを呼び出しるインラインPowerShellスクリプトを実行します。 自分のデプロイメントで azPowerShellVersionretentionIntervaltimeout のプロパティを変更してください。 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: [必須] 仮想ネットワーク マネージャーとサンプル仮想ネットワークをデプロイするリソース グループの名前。
  • location: [必須] デプロイするリソースの場所。
  • networkGroupMembershipType: [省略可能] 展開するネットワーク グループ メンバーシップの種類。 既定値は staticですが、動的グループ メンバーシップには dynamic を使用できます。

Note

動的グループ メンバーシップを選択すると、メンバーシップを管理するための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

構成のデプロイを確認する

各仮想ネットワークの [ネットワーク マネージャー] セクションを使用して、構成をデプロイしたことを確認します。

  1. vnet-learn-prod-{location}-spoke001 仮想ネットワークに移動します。

  2. [設定][ネットワーク マネージャー] を選択します。

  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. resource-group を選択し、[リソース グループの削除] を選択します。
  3. [ リソース グループの削除] で、テキスト ボックスに 「リソース グループ 」と入力して削除することを確認し、[削除] を選択 します
  4. 動的ネットワーク グループ メンバーシップを使用した場合は、ポータルでサブスクリプションに移動し、ポリシーを選択して、デプロイされたAzure Policyの定義と割り当てを削除します[ポリシー] で、という名前のAVNM quickstart dynamic group membership Policy見つけて削除し、という名前のAVNM quickstart dynamic group membership Policyに対して同じ操作を行います。

次のステップ

Azure Virtual Network Manager インスタンスを作成したら、セキュリティ管理者の構成を使用してネットワーク トラフィックをブロックする方法について説明します。