Démarrage rapide : Déployer une topologie de réseau avec Azure Virtual Network Manager à l’aide d’un modèle Azure Resource Manager - Modèle ARM

Démarrez avec Azure Virtual Network Manager en utilisant des modèles Azure Resource Manager pour gérer la connectivité de tous vos réseaux virtuels.

Dans ce guide de démarrage rapide, un modèle Azure Resource Manager est utilisé pour déployer Azure Virtual Network Manager avec différents types de topologie de connectivité et d’appartenance à un groupe réseau. Utilisez des paramètres de déploiement pour spécifier le type de configuration à déployer.

Important

Azure Virtual Network Manager est généralement disponible pour les configurations de connectivité Virtual Network Manager, hub-and-spoke (en étoile) et les configurations avec des règles d’administration pour la sécurité. Les configurations de connectivité de maillage restent en préversion publique.

Cette préversion est fournie sans contrat de niveau de service et n’est pas recommandée pour les charges de travail de production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’Utilisation Supplémentaires relatives aux Évaluations Microsoft Azure.

Un modèle Azure Resource Manager est un fichier JSON (JavaScript Object Notation) qui définit l’infrastructure et la configuration de votre projet. Le modèle utilise la syntaxe déclarative. Vous décrivez votre déploiement prévu sans écrire la séquence de commandes de programmation pour créer le déploiement.

Si votre environnement remplit les prérequis et que vous êtes déjà familiarisé avec l’utilisation des modèles ARM, sélectionnez le bouton Déployer sur Azure. Le modèle s’ouvre dans le portail Azure.

Déployer dans Azure

Prérequis

  • Compte Azure avec un abonnement actif. Créez un compte gratuitement.
  • Pour prendre en charge le déploiement d’Azure Policy pour une appartenance à un groupe dynamique, le modèle est conçu pour déployer dans l’étendue de l’abonnement. Toutefois, il n’est pas obligatoire pour Azure Virtual Network Manager si vous utilisez une appartenance de groupe statique.

Vérifier le modèle

Le modèle utilisé dans ce guide de démarrage rapide est tiré des modèles de démarrage rapide Azure.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.20.4.51522",
      "templateHash": "12432507404458851067"
    }
  },
  "parameters": {
    "resourceGroupName": {
      "type": "string",
      "defaultValue": "rg-avnm-sample",
      "metadata": {
        "description": "The resource group name where the AVNM and VNET resources will be created"
      }
    },
    "location": {
      "type": "string",
      "minLength": 6,
      "metadata": {
        "description": "The location of this regional hub. All resources, including spoke resources, will be deployed to this region."
      }
    },
    "connectivityTopology": {
      "type": "string",
      "defaultValue": "meshWithHubAndSpoke",
      "allowedValues": [
        "mesh",
        "hubAndSpoke",
        "meshWithHubAndSpoke"
      ],
      "metadata": {
        "description": "Defines how spokes will connect to each other and how spokes will connect the hub. Valid values: \"mesh\", \"hubAndSpoke\", \"meshWithHubAndSpoke\"; default value: \"meshWithHubAndSpoke\""
      }
    },
    "networkGroupMembershipType": {
      "type": "string",
      "defaultValue": "static",
      "allowedValues": [
        "static",
        "dynamic"
      ],
      "metadata": {
        "description": "Connectivity group membership type. Valid values: \"static\", \"dynamic\"; default: \"static\""
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2022-09-01",
      "name": "[parameters('resourceGroupName')]",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "vnet-hub",
      "resourceGroup": "[parameters('resourceGroupName')]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "connectivityTopology": {
            "value": "[parameters('connectivityTopology')]"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.20.4.51522",
              "templateHash": "13874595206391254196"
            }
          },
          "parameters": {
            "location": {
              "type": "string"
            },
            "connectivityTopology": {
              "type": "string"
            }
          },
          "resources": [
            {
              "type": "Microsoft.Network/virtualNetworks",
              "apiVersion": "2022-01-01",
              "name": "[format('vnet-{0}-hub', parameters('location'))]",
              "location": "[parameters('location')]",
              "tags": "[if(equals(parameters('connectivityTopology'), 'mesh'), createObject('_avnm_quickstart_deployment', 'hub'), createObject())]",
              "properties": {
                "addressSpace": {
                  "addressPrefixes": [
                    "10.0.0.0/22"
                  ]
                },
                "subnets": [
                  {
                    "name": "AzureBastionSubnet",
                    "properties": {
                      "addressPrefix": "10.0.1.0/26"
                    }
                  },
                  {
                    "name": "GatewaySubnet",
                    "properties": {
                      "addressPrefix": "10.0.2.0/27"
                    }
                  },
                  {
                    "name": "AzureFirewallSubnet",
                    "properties": {
                      "addressPrefix": "10.0.3.0/26"
                    }
                  },
                  {
                    "name": "AzureFirewallManagementSubnet",
                    "properties": {
                      "addressPrefix": "10.0.3.64/26"
                    }
                  },
                  {
                    "name": "default",
                    "properties": {
                      "addressPrefix": "10.0.3.128/25"
                    }
                  }
                ]
              },
              "metadata": {
                "description": "The regional hub network."
              }
            }
          ],
          "outputs": {
            "hubVnetId": {
              "type": "string",
              "value": "[resourceId('Microsoft.Network/virtualNetworks', format('vnet-{0}-hub', parameters('location')))]"
            }
          }
        }
      },
      "dependsOn": [
        "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('resourceGroupName'))]"
      ]
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "vnet-spokeA",
      "resourceGroup": "[parameters('resourceGroupName')]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "spokeName": {
            "value": "spokeA"
          },
          "spokeVnetPrefix": {
            "value": "10.100.0.0/22"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.20.4.51522",
              "templateHash": "8383771840688895095"
            }
          },
          "parameters": {
            "location": {
              "type": "string"
            },
            "spokeName": {
              "type": "string"
            },
            "spokeVnetPrefix": {
              "type": "string"
            }
          },
          "variables": {
            "taggedVNETs": [
              "spokeA",
              "spokeB",
              "spokeC"
            ]
          },
          "resources": [
            {
              "type": "Microsoft.Network/virtualNetworks",
              "apiVersion": "2022-01-01",
              "name": "[format('vnet-{0}-{1}', parameters('location'), toLower(parameters('spokeName')))]",
              "location": "[parameters('location')]",
              "tags": "[if(contains(variables('taggedVNETs'), parameters('spokeName')), createObject('_avnm_quickstart_deployment', 'spoke'), createObject())]",
              "properties": {
                "addressSpace": {
                  "addressPrefixes": [
                    "[parameters('spokeVnetPrefix')]"
                  ]
                },
                "subnets": [
                  {
                    "name": "default",
                    "properties": {
                      "addressPrefix": "[replace(parameters('spokeVnetPrefix'), '.0.0/22', '.1.0/24')]"
                    }
                  }
                ]
              }
            }
          ],
          "outputs": {
            "vnetId": {
              "type": "string",
              "value": "[resourceId('Microsoft.Network/virtualNetworks', format('vnet-{0}-{1}', parameters('location'), toLower(parameters('spokeName'))))]"
            }
          }
        }
      },
      "dependsOn": [
        "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('resourceGroupName'))]"
      ]
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "vnet-spokeB",
      "resourceGroup": "[parameters('resourceGroupName')]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "spokeName": {
            "value": "spokeB"
          },
          "spokeVnetPrefix": {
            "value": "10.101.0.0/22"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.20.4.51522",
              "templateHash": "8383771840688895095"
            }
          },
          "parameters": {
            "location": {
              "type": "string"
            },
            "spokeName": {
              "type": "string"
            },
            "spokeVnetPrefix": {
              "type": "string"
            }
          },
          "variables": {
            "taggedVNETs": [
              "spokeA",
              "spokeB",
              "spokeC"
            ]
          },
          "resources": [
            {
              "type": "Microsoft.Network/virtualNetworks",
              "apiVersion": "2022-01-01",
              "name": "[format('vnet-{0}-{1}', parameters('location'), toLower(parameters('spokeName')))]",
              "location": "[parameters('location')]",
              "tags": "[if(contains(variables('taggedVNETs'), parameters('spokeName')), createObject('_avnm_quickstart_deployment', 'spoke'), createObject())]",
              "properties": {
                "addressSpace": {
                  "addressPrefixes": [
                    "[parameters('spokeVnetPrefix')]"
                  ]
                },
                "subnets": [
                  {
                    "name": "default",
                    "properties": {
                      "addressPrefix": "[replace(parameters('spokeVnetPrefix'), '.0.0/22', '.1.0/24')]"
                    }
                  }
                ]
              }
            }
          ],
          "outputs": {
            "vnetId": {
              "type": "string",
              "value": "[resourceId('Microsoft.Network/virtualNetworks', format('vnet-{0}-{1}', parameters('location'), toLower(parameters('spokeName'))))]"
            }
          }
        }
      },
      "dependsOn": [
        "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('resourceGroupName'))]"
      ]
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "vnet-spokeC",
      "resourceGroup": "[parameters('resourceGroupName')]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "spokeName": {
            "value": "spokeC"
          },
          "spokeVnetPrefix": {
            "value": "10.102.0.0/22"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.20.4.51522",
              "templateHash": "8383771840688895095"
            }
          },
          "parameters": {
            "location": {
              "type": "string"
            },
            "spokeName": {
              "type": "string"
            },
            "spokeVnetPrefix": {
              "type": "string"
            }
          },
          "variables": {
            "taggedVNETs": [
              "spokeA",
              "spokeB",
              "spokeC"
            ]
          },
          "resources": [
            {
              "type": "Microsoft.Network/virtualNetworks",
              "apiVersion": "2022-01-01",
              "name": "[format('vnet-{0}-{1}', parameters('location'), toLower(parameters('spokeName')))]",
              "location": "[parameters('location')]",
              "tags": "[if(contains(variables('taggedVNETs'), parameters('spokeName')), createObject('_avnm_quickstart_deployment', 'spoke'), createObject())]",
              "properties": {
                "addressSpace": {
                  "addressPrefixes": [
                    "[parameters('spokeVnetPrefix')]"
                  ]
                },
                "subnets": [
                  {
                    "name": "default",
                    "properties": {
                      "addressPrefix": "[replace(parameters('spokeVnetPrefix'), '.0.0/22', '.1.0/24')]"
                    }
                  }
                ]
              }
            }
          ],
          "outputs": {
            "vnetId": {
              "type": "string",
              "value": "[resourceId('Microsoft.Network/virtualNetworks', format('vnet-{0}-{1}', parameters('location'), toLower(parameters('spokeName'))))]"
            }
          }
        }
      },
      "dependsOn": [
        "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('resourceGroupName'))]"
      ]
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "vnet-spokeD",
      "resourceGroup": "[parameters('resourceGroupName')]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "spokeName": {
            "value": "spokeD"
          },
          "spokeVnetPrefix": {
            "value": "10.103.0.0/22"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.20.4.51522",
              "templateHash": "8383771840688895095"
            }
          },
          "parameters": {
            "location": {
              "type": "string"
            },
            "spokeName": {
              "type": "string"
            },
            "spokeVnetPrefix": {
              "type": "string"
            }
          },
          "variables": {
            "taggedVNETs": [
              "spokeA",
              "spokeB",
              "spokeC"
            ]
          },
          "resources": [
            {
              "type": "Microsoft.Network/virtualNetworks",
              "apiVersion": "2022-01-01",
              "name": "[format('vnet-{0}-{1}', parameters('location'), toLower(parameters('spokeName')))]",
              "location": "[parameters('location')]",
              "tags": "[if(contains(variables('taggedVNETs'), parameters('spokeName')), createObject('_avnm_quickstart_deployment', 'spoke'), createObject())]",
              "properties": {
                "addressSpace": {
                  "addressPrefixes": [
                    "[parameters('spokeVnetPrefix')]"
                  ]
                },
                "subnets": [
                  {
                    "name": "default",
                    "properties": {
                      "addressPrefix": "[replace(parameters('spokeVnetPrefix'), '.0.0/22', '.1.0/24')]"
                    }
                  }
                ]
              }
            }
          ],
          "outputs": {
            "vnetId": {
              "type": "string",
              "value": "[resourceId('Microsoft.Network/virtualNetworks', format('vnet-{0}-{1}', parameters('location'), toLower(parameters('spokeName'))))]"
            }
          }
        }
      },
      "dependsOn": [
        "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('resourceGroupName'))]"
      ]
    },
    {
      "condition": "[equals(parameters('networkGroupMembershipType'), 'dynamic')]",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "policy",
      "location": "[deployment().location]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "networkGroupId": {
            "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'avnm'), '2022-09-01').outputs.networkGroupId.value]"
          },
          "resourceGroupName": {
            "value": "[parameters('resourceGroupName')]"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.20.4.51522",
              "templateHash": "6205966345192356792"
            }
          },
          "parameters": {
            "networkGroupId": {
              "type": "string"
            },
            "resourceGroupName": {
              "type": "string"
            }
          },
          "resources": [
            {
              "type": "Microsoft.Authorization/policyDefinitions",
              "apiVersion": "2021-06-01",
              "name": "[uniqueString(parameters('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"
                      },
                      {
                        "field": "tags[_avnm_quickstart_deployment]",
                        "exists": true
                      },
                      {
                        "field": "id",
                        "like": "[format('{0}/resourcegroups/{1}/*', subscription().id, parameters('resourceGroupName'))]"
                      }
                    ]
                  },
                  "then": {
                    "effect": "addToNetworkGroup",
                    "details": {
                      "networkGroupId": "[parameters('networkGroupId')]"
                    }
                  }
                }
              },
              "metadata": {
                "description": "This is a Policy definition for dyanamic group membership"
              }
            },
            {
              "type": "Microsoft.Authorization/policyAssignments",
              "apiVersion": "2022-06-01",
              "name": "[uniqueString(parameters('networkGroupId'))]",
              "properties": {
                "description": "AVNM quickstart dynamic group membership Policy",
                "displayName": "AVNM quickstart dynamic group membership Policy",
                "enforcementMode": "Default",
                "policyDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/policyDefinitions', uniqueString(parameters('networkGroupId')))]"
              },
              "dependsOn": [
                "[subscriptionResourceId('Microsoft.Authorization/policyDefinitions', uniqueString(parameters('networkGroupId')))]"
              ],
              "metadata": {
                "description": "Assigns above policy for dynamic group membership"
              }
            }
          ],
          "outputs": {
            "policyDefinitionId": {
              "type": "string",
              "value": "[subscriptionResourceId('Microsoft.Authorization/policyDefinitions', uniqueString(parameters('networkGroupId')))]"
            },
            "policyAssignmentId": {
              "type": "string",
              "value": "[subscriptionResourceId('Microsoft.Authorization/policyAssignments', uniqueString(parameters('networkGroupId')))]"
            }
          }
        }
      },
      "dependsOn": [
        "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'avnm')]"
      ]
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "avnm",
      "resourceGroup": "[parameters('resourceGroupName')]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "hubVnetId": {
            "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-hub'), '2022-09-01').outputs.hubVnetId.value]"
          },
          "spokeNetworkGroupMembers": {
            "value": [
              "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-spokeA'), '2022-09-01').outputs.vnetId.value]",
              "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-spokeB'), '2022-09-01').outputs.vnetId.value]",
              "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-spokeC'), '2022-09-01').outputs.vnetId.value]",
              "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-spokeD'), '2022-09-01').outputs.vnetId.value]"
            ]
          },
          "connectivityTopology": {
            "value": "[parameters('connectivityTopology')]"
          },
          "networkGroupMembershipType": {
            "value": "[parameters('networkGroupMembershipType')]"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.20.4.51522",
              "templateHash": "4722921437161114326"
            }
          },
          "parameters": {
            "location": {
              "type": "string"
            },
            "spokeNetworkGroupMembers": {
              "type": "array"
            },
            "hubVnetId": {
              "type": "string"
            },
            "connectivityTopology": {
              "type": "string"
            },
            "networkGroupMembershipType": {
              "type": "string"
            }
          },
          "variables": {
            "groupedVNETs": [
              "[format('vnet-{0}-spokea', parameters('location'))]",
              "[format('vnet-{0}-spokeb', parameters('location'))]",
              "[format('vnet-{0}-spokec', parameters('location'))]"
            ]
          },
          "resources": [
            {
              "copy": {
                "name": "staticMemberSpoke",
                "count": "[length(parameters('spokeNetworkGroupMembers'))]"
              },
              "condition": "[and(equals(parameters('networkGroupMembershipType'), 'static'), contains(variables('groupedVNETs'), last(split(parameters('spokeNetworkGroupMembers')[copyIndex()], '/'))))]",
              "type": "Microsoft.Network/networkManagers/networkGroups/staticMembers",
              "apiVersion": "2022-09-01",
              "name": "[format('{0}/{1}/{2}', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location')), format('sm-{0}', last(split(parameters('spokeNetworkGroupMembers')[copyIndex()], '/'))))]",
              "properties": {
                "resourceId": "[parameters('spokeNetworkGroupMembers')[copyIndex()]]"
              },
              "dependsOn": [
                "[resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location')))]"
              ]
            },
            {
              "condition": "[and(equals(parameters('networkGroupMembershipType'), 'static'), equals(parameters('connectivityTopology'), 'mesh'))]",
              "type": "Microsoft.Network/networkManagers/networkGroups/staticMembers",
              "apiVersion": "2022-09-01",
              "name": "[format('{0}/{1}/{2}', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location')), format('sm-{0}', toLower(last(split(parameters('hubVnetId'), '/')))))]",
              "properties": {
                "resourceId": "[parameters('hubVnetId')]"
              },
              "dependsOn": [
                "[resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location')))]"
              ]
            },
            {
              "type": "Microsoft.Network/networkManagers",
              "apiVersion": "2022-09-01",
              "name": "[format('avnm-{0}', parameters('location'))]",
              "location": "[parameters('location')]",
              "properties": {
                "networkManagerScopeAccesses": [
                  "Connectivity"
                ],
                "networkManagerScopes": {
                  "subscriptions": [
                    "[format('/subscriptions/{0}', subscription().subscriptionId)]"
                  ],
                  "managementGroups": []
                }
              },
              "metadata": {
                "description": "This is the Azure Virtual Network Manager which will be used to implement the connected group for spoke-to-spoke connectivity."
              }
            },
            {
              "condition": "[equals(parameters('networkGroupMembershipType'), 'static')]",
              "type": "Microsoft.Network/networkManagers/networkGroups",
              "apiVersion": "2022-09-01",
              "name": "[format('{0}/{1}', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location')))]",
              "properties": {
                "description": "Network Group - Static"
              },
              "dependsOn": [
                "[resourceId('Microsoft.Network/networkManagers', format('avnm-{0}', parameters('location')))]"
              ],
              "metadata": {
                "description": "This is the static network group for the spoke VNETs, and hub when topology is mesh."
              }
            },
            {
              "condition": "[equals(parameters('networkGroupMembershipType'), 'dynamic')]",
              "type": "Microsoft.Network/networkManagers/networkGroups",
              "apiVersion": "2022-09-01",
              "name": "[format('{0}/{1}', format('avnm-{0}', parameters('location')), format('ng-{0}-dynamic', parameters('location')))]",
              "properties": {
                "description": "Network Group - Dynamic"
              },
              "dependsOn": [
                "[resourceId('Microsoft.Network/networkManagers', format('avnm-{0}', parameters('location')))]"
              ],
              "metadata": {
                "description": "This is the dynamic group for spoke VNETs."
              }
            },
            {
              "condition": "[equals(parameters('connectivityTopology'), 'mesh')]",
              "type": "Microsoft.Network/networkManagers/connectivityConfigurations",
              "apiVersion": "2022-09-01",
              "name": "[format('{0}/{1}', format('avnm-{0}', parameters('location')), format('cc-{0}-spokes-mesh', parameters('location')))]",
              "properties": {
                "description": "Spoke-to-spoke connectivity configuration",
                "appliesToGroups": [
                  {
                    "networkGroupId": "[if(equals(parameters('networkGroupMembershipType'), 'static'), resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location'))), resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-dynamic', parameters('location'))))]",
                    "isGlobal": "False",
                    "useHubGateway": "False",
                    "groupConnectivity": "DirectlyConnected"
                  }
                ],
                "connectivityTopology": "Mesh",
                "deleteExistingPeering": "True",
                "hubs": [],
                "isGlobal": "False"
              },
              "dependsOn": [
                "[resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-dynamic', parameters('location')))]",
                "[resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location')))]",
                "[resourceId('Microsoft.Network/networkManagers', format('avnm-{0}', parameters('location')))]"
              ],
              "metadata": {
                "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."
              }
            },
            {
              "condition": "[equals(parameters('connectivityTopology'), 'meshWithHubAndSpoke')]",
              "type": "Microsoft.Network/networkManagers/connectivityConfigurations",
              "apiVersion": "2022-09-01",
              "name": "[format('{0}/{1}', format('avnm-{0}', parameters('location')), format('cc-{0}-meshwithhubandspoke', parameters('location')))]",
              "properties": {
                "description": "Spoke-to-spoke connectivity configuration",
                "appliesToGroups": [
                  {
                    "networkGroupId": "[if(equals(parameters('networkGroupMembershipType'), 'static'), resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location'))), resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-dynamic', parameters('location'))))]",
                    "isGlobal": "False",
                    "useHubGateway": "False",
                    "groupConnectivity": "DirectlyConnected"
                  }
                ],
                "connectivityTopology": "HubAndSpoke",
                "deleteExistingPeering": "True",
                "hubs": [
                  {
                    "resourceId": "[parameters('hubVnetId')]",
                    "resourceType": "Microsoft.Network/virtualNetworks"
                  }
                ],
                "isGlobal": "False"
              },
              "dependsOn": [
                "[resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-dynamic', parameters('location')))]",
                "[resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location')))]",
                "[resourceId('Microsoft.Network/networkManagers', format('avnm-{0}', parameters('location')))]"
              ],
              "metadata": {
                "description": "This connectivity configuration defines the connectivity between the spokes using Hub and Spoke - traffic flow through hub requires an NVA to route it."
              }
            },
            {
              "condition": "[equals(parameters('connectivityTopology'), 'hubAndSpoke')]",
              "type": "Microsoft.Network/networkManagers/connectivityConfigurations",
              "apiVersion": "2022-09-01",
              "name": "[format('{0}/{1}', format('avnm-{0}', parameters('location')), format('cc-{0}-hubandspoke', parameters('location')))]",
              "properties": {
                "description": "Spoke-to-spoke connectivity configuration",
                "appliesToGroups": [
                  {
                    "networkGroupId": "[if(equals(parameters('networkGroupMembershipType'), 'static'), resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location'))), resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-dynamic', parameters('location'))))]",
                    "isGlobal": "False",
                    "useHubGateway": "False",
                    "groupConnectivity": "None"
                  }
                ],
                "connectivityTopology": "HubAndSpoke",
                "deleteExistingPeering": "True",
                "hubs": [
                  {
                    "resourceId": "[parameters('hubVnetId')]",
                    "resourceType": "Microsoft.Network/virtualNetworks"
                  }
                ],
                "isGlobal": "False"
              },
              "dependsOn": [
                "[resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-dynamic', parameters('location')))]",
                "[resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location')))]",
                "[resourceId('Microsoft.Network/networkManagers', format('avnm-{0}', parameters('location')))]"
              ],
              "metadata": {
                "description": "This connectivity configuration defines the connectivity between the spokes using Hub and Spoke - traffic flow through hub requires an NVA to route it."
              }
            },
            {
              "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
              "apiVersion": "2022-01-31-preview",
              "name": "[format('uai-{0}', parameters('location'))]",
              "location": "[parameters('location')]",
              "metadata": {
                "description": "This user assigned identity is used by the Deployment Script resource to interact with Azure resources."
              }
            },
            {
              "type": "Microsoft.Authorization/roleAssignments",
              "apiVersion": "2022-04-01",
              "name": "[guid(resourceGroup().id, format('uai-{0}', parameters('location')))]",
              "properties": {
                "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
                "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('uai-{0}', parameters('location'))), '2022-01-31-preview').principalId]",
                "principalType": "ServicePrincipal"
              },
              "dependsOn": [
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('uai-{0}', parameters('location')))]"
              ],
              "metadata": {
                "description": "This role assignment grants the user assigned identity the Contributor role on the resource group."
              }
            }
          ],
          "outputs": {
            "networkManagerName": {
              "type": "string",
              "value": "[format('avnm-{0}', parameters('location'))]"
            },
            "userAssignedIdentityId": {
              "type": "string",
              "value": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', format('uai-{0}', parameters('location')))]"
            },
            "connectivityConfigurationId": {
              "type": "string",
              "value": "[if(equals(parameters('connectivityTopology'), 'meshWithHubAndSpoke'), resourceId('Microsoft.Network/networkManagers/connectivityConfigurations', format('avnm-{0}', parameters('location')), format('cc-{0}-meshwithhubandspoke', parameters('location'))), if(equals(parameters('connectivityTopology'), 'hubAndSpoke'), resourceId('Microsoft.Network/networkManagers/connectivityConfigurations', format('avnm-{0}', parameters('location')), format('cc-{0}-hubandspoke', parameters('location'))), resourceId('Microsoft.Network/networkManagers/connectivityConfigurations', format('avnm-{0}', parameters('location')), format('cc-{0}-spokes-mesh', parameters('location')))))]"
            },
            "networkGroupId": {
              "type": "string",
              "value": "[coalesce(resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-dynamic', parameters('location'))), resourceId('Microsoft.Network/networkManagers/networkGroups', format('avnm-{0}', parameters('location')), format('ng-{0}-static', parameters('location'))))]"
            }
          }
        }
      },
      "dependsOn": [
        "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-hub')]",
        "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('resourceGroupName'))]",
        "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-spokeA')]",
        "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-spokeB')]",
        "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-spokeC')]",
        "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'vnet-spokeD')]"
      ]
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2022-09-01",
      "name": "[format('ds-{0}-connectivityconfigs', parameters('location'))]",
      "resourceGroup": "[parameters('resourceGroupName')]",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "userAssignedIdentityId": {
            "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'avnm'), '2022-09-01').outputs.userAssignedIdentityId.value]"
          },
          "configurationId": {
            "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'avnm'), '2022-09-01').outputs.connectivityConfigurationId.value]"
          },
          "configType": {
            "value": "Connectivity"
          },
          "networkManagerName": {
            "value": "[reference(extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'avnm'), '2022-09-01').outputs.networkManagerName.value]"
          },
          "deploymentScriptName": {
            "value": "[format('ds-{0}-connectivityconfigs', parameters('location'))]"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "metadata": {
            "_generator": {
              "name": "bicep",
              "version": "0.20.4.51522",
              "templateHash": "16058143652843159439"
            }
          },
          "parameters": {
            "location": {
              "type": "string"
            },
            "userAssignedIdentityId": {
              "type": "string"
            },
            "networkManagerName": {
              "type": "string"
            },
            "configurationId": {
              "type": "string"
            },
            "deploymentScriptName": {
              "type": "string"
            },
            "configType": {
              "type": "string",
              "allowedValues": [
                "Connectivity"
              ]
            }
          },
          "resources": [
            {
              "type": "Microsoft.Resources/deploymentScripts",
              "apiVersion": "2020-10-01",
              "name": "[parameters('deploymentScriptName')]",
              "location": "[parameters('location')]",
              "kind": "AzurePowerShell",
              "identity": {
                "type": "UserAssigned",
                "userAssignedIdentities": {
                  "[format('{0}', parameters('userAssignedIdentityId'))]": {}
                }
              },
              "properties": {
                "azPowerShellVersion": "8.3",
                "retentionInterval": "PT1H",
                "timeout": "PT1H",
                "arguments": "[format('-networkManagerName \"{0}\" -targetLocations {1} -configIds {2} -subscriptionId {3} -configType {4} -resourceGroupName {5}', parameters('networkManagerName'), parameters('location'), parameters('configurationId'), subscription().subscriptionId, parameters('configType'), resourceGroup().name)]",
                "scriptContent": "    param (\r\n      # AVNM subscription id\r\n      [parameter(mandatory=$true)][string]$subscriptionId,\r\n\r\n      # AVNM resource name\r\n      [parameter(mandatory=$true)][string]$networkManagerName,\r\n\r\n      # string with comma-separated list of config ids to deploy. ids must be of the same config type\r\n      [parameter(mandatory=$true)][string[]]$configIds,\r\n\r\n      # string with comma-separated list of deployment target regions\r\n      [parameter(mandatory=$true)][string[]]$targetLocations,\r\n\r\n      # configuration type to deploy. must be either connecticity or securityadmin\r\n      [parameter(mandatory=$true)][ValidateSet('Connectivity','SecurityAdmin','Routing')][string]$configType,\r\n\r\n      # AVNM resource group name\r\n      [parameter(mandatory=$true)][string]$resourceGroupName\r\n    )\r\n  \r\n    $null = Login-AzAccount -Identity -Subscription $subscriptionId\r\n  \r\n    [System.Collections.Generic.List[string]]$configIdList = @()  \r\n    $configIdList.addRange($configIds) \r\n    [System.Collections.Generic.List[string]]$targetLocationList = @() # target locations for deployment\r\n    $targetLocationList.addRange($targetLocations)     \r\n    \r\n    $deployment = @{\r\n        Name = $networkManagerName\r\n        ResourceGroupName = $resourceGroupName\r\n        ConfigurationId = $configIdList\r\n        TargetLocation = $targetLocationList\r\n        CommitType = $configType\r\n    }\r\n  \r\n    try {\r\n      Deploy-AzNetworkManagerCommit @deployment -ErrorAction Stop\r\n    }\r\n    catch {\r\n      Write-Error \"Deployment failed with error: $_\"\r\n      throw \"Deployment failed with error: $_\"\r\n    }\r\n    "
              },
              "metadata": {
                "description": "Create a Deployment Script resource to perform the commit/deployment of the Network Manager connectivity configuration."
              }
            }
          ]
        }
      },
      "dependsOn": [
        "[extensionResourceId(format('/subscriptions/{0}/resourceGroups/{1}', subscription().subscriptionId, parameters('resourceGroupName')), 'Microsoft.Resources/deployments', 'avnm')]",
        "[subscriptionResourceId('Microsoft.Resources/deployments', 'policy')]",
        "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('resourceGroupName'))]"
      ]
    }
  ],
  "outputs": {
    "policyDefinitionId": {
      "type": "string",
      "value": "[coalesce(reference(subscriptionResourceId('Microsoft.Resources/deployments', 'policy'), '2022-09-01').outputs.policyDefinitionId.value, 'not_deployed')]"
    },
    "policyAssignmentId": {
      "type": "string",
      "value": "[coalesce(reference(subscriptionResourceId('Microsoft.Resources/deployments', 'policy'), '2022-09-01').outputs.policyAssignmentId.value, 'not_deployed')]"
    }
  }
}

Le modèle définit plusieurs ressources Azure :

Déployer le modèle

  1. Connectez-vous à Azure et ouvrez le modèle Azure Resource Manager en sélectionnant le bouton Déployer sur Azure ici. Le modèle crée l’instance d’Azure Virtual Network Manager, l’infrastructure réseau et les configurations du gestionnaire de réseau.

    Déployer dans Azure

  2. Dans le portail Azure, sélectionnez ou entrez les informations suivantes :

    Paramètre Valeur
    Abonnement Sélectionnez l’abonnement à utiliser pour le déploiement.
    Détails de l’instance
    Nom du groupe de ressources Utilisez la valeur par défaut rg-avnm-sample
    Région Sélectionner la région dans laquelle déployer les ressources.
    Emplacement Entrez l’emplacement dans lequel déployer les ressources. La valeur d’emplacement est utilisée dans la convention d’affectation de noms de la ressource
    L’emplacement correspond à la région que vous avez choisie et est écrit sans espaces. Par exemple, USA Est s’écrit USAEst.
    Topologie de connectivité Sélectionnez la topologie de connectivité à déployer. Les options incluent mesh, hubAndSpoke et meshWithHubAndSpoke.
    Type d’appartenance au groupe réseau Sélectionnez le type d’appartenance au groupe réseau. Les options incluent statique et dynamique.
  3. Sélectionnez Évaluer + créer pour évaluer les paramètres et lire l’instruction des conditions générales.

  4. Sélectionnez Créer pour déployer le modèle.

  5. Le déploiement prend quelques minutes. Une fois le déploiement terminé, le message Déploiement réussi s’affiche.

Valider le déploiement

  1. Dans la page Accueil du portail Azure, sélectionnez Groupes de ressources, puis rg-avnm-sample.

  2. Vérifiez que tous les composants sont correctement déployés.

    Capture d’écran de toutes les ressources déployées dans le portail Azure.

  3. Sélectionnez la ressource avnm-EastUS.

  4. Dans la page Groupes réseau, sélectionnez Paramètres>Groupes réseau>ng-EastUS-static.

    Capture d’écran des groupes réseau déployés dans le portail Azure.

  5. Dans la page ng-EastUS-static, sélectionnez Paramètres>Membres du groupe et vérifiez qu’un ensemble de réseaux virtuels est déployé.

    Capture d’écran des membres statiques dans un groupe réseau pour un déploiement de topologie statique.

Remarque

Selon les sélections que vous avez effectuées pour le déploiement, vous pouvez voir différents réseaux virtuels pour les membres du groupe.

Nettoyer les ressources

Quand vous n’avez plus besoin des ressources que vous avez créées avec le point de terminaison privé, supprimez le groupe de ressources. Cette action supprime le point de terminaison privé et toutes les ressources qui y sont associées.

  1. Pour supprimer le groupe de ressources, ouvrez le groupe de ressources dans le portail Azure et sélectionnez Supprimer un groupe de ressources.
  2. Entrez le nom du groupe de ressources, puis sélectionnez Supprimer.
  3. Une fois le groupe de ressources supprimé, vérifiez que l’instance manager de réseau et toutes les ressources associées sont supprimées.

Étapes suivantes

Pour plus d’informations sur le déploiement d’Azure Virtual Network Manager, consultez :