Dernière révision : mai 2026
Configurez les services AWS figurant à l'examen AZ-700 avec Terraform simple — un bloc à la fois, chacun étant lié à un domaine de l'examen. Le même code fonctionne sur OpenTofu.
À la fin de ce laboratoire, vous aurez provisionné, avec Terraform pur, le réseau de référence AZ-700 : un VNet hub avec un sous-réseau de services partagés, un VNet spoke avec un sous-réseau d'application, un peering bidirectionnel entre les deux, une zone DNS privée liée aux deux VNets pour la résolution de noms inter-VNet, et des journaux de flux NSG dans Log Analytics pour la visibilité du trafic.
Déposez les extraits dans un unique main.tf, exécutez terraform init, puis terraform apply étape par étape.
>= 1.5 ou OpenTofu >= 1.6.az login).Principalement gratuit, avec une mise en garde :
Environ 1 à 2 $/mois au repos. Les pièges de coût de l'AZ-700 sont la VPN Gateway (environ 60 $/mois) et ExpressRoute (200 $+/mois) – tous deux omis ici.
Ouverture standard Azure.
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = { source = "hashicorp/azurerm", version = "~> 4.0" }
}
}
provider "azurerm" {
features {}
}
locals {
tags = {
Project = "certlabpro-az-700"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-700-rg"
location = "eastus"
tags = local.tags
}Le modèle hub-spoke est la topologie de référence AZ-700. Le hub centralise les services partagés (pare-feu, passerelle VPN, résolveur DNS, surveillance) et les spokes sont appairés au hub pour y accéder. Nous construisons le hub à 10.0.0.0/16 avec un seul sous-réseau — dans un hub réel, vous auriez un GatewaySubnet pour la passerelle VPN/ExpressRoute, un AzureFirewallSubnet pour Azure Firewall, et un sous-réseau de services partagés pour les points d'entrée/sortie du résolveur DNS. La portée du laboratoire est la forme de la topologie ; les services de passerelle sont hors de portée (coût élevé).
resource "azurerm_virtual_network" "hub" {
name = "vnet-hub"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
address_space = ["10.0.0.0/16"]
tags = local.tags
}
resource "azurerm_subnet" "hub_shared" {
name = "shared-services"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.hub.name
address_prefixes = ["10.0.1.0/24"]
}Le spoke à 10.1.0.0/16 — délibérément non-chevauchant avec le hub. Le NSG attaché au sous-réseau d'application restreindrait en production l'accès entrant à des CIDR sources spécifiques ; le laboratoire utilise * pour la source afin que l'architecture soit testable.
L'AZ-700 Mettre en œuvre l'infrastructure réseau principale aborde à plusieurs reprises la question du NSG par sous-réseau vs NSG par NIC. Les NSG au niveau du sous-réseau (ce laboratoire) sont la bonne réponse lorsque la question dit "appliqué à toutes les ressources du sous-réseau" ; le niveau NIC est la dérogation.
resource "azurerm_virtual_network" "spoke" {
name = "vnet-spoke"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
address_space = ["10.1.0.0/16"]
tags = local.tags
}
resource "azurerm_subnet" "spoke_app" {
name = "app"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.spoke.name
address_prefixes = ["10.1.1.0/24"]
}
resource "azurerm_network_security_group" "spoke_app" {
name = "nsg-spoke-app"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
security_rule {
name = "AllowHttpsFromInternet"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "443"
source_address_prefix = "*"
destination_address_prefix = "*"
}
tags = local.tags
}
resource "azurerm_subnet_network_security_group_association" "spoke_app" {
subnet_id = azurerm_subnet.spoke_app.id
network_security_group_id = azurerm_network_security_group.spoke_app.id
}Le peering VNet est la primitive de connectivité AZ-700 au sein d'une région. Deux propriétés clés testées à l'examen :
allow_forwarded_traffic — requis lorsque le hub prévoit de transférer le trafic d'un spoke à un autre (transit via un pare-feu dans le hub).use_remote_gateways / allow_gateway_transit — le spoke utilise use_remote_gateways = true pour utiliser la passerelle VPN/ER du hub. Nous n'avons pas de passerelle dans ce laboratoire, mais la forme de l'attribut est testée à l'examen.resource "azurerm_virtual_network_peering" "hub_to_spoke" {
name = "hub-to-spoke"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.hub.name
remote_virtual_network_id = azurerm_virtual_network.spoke.id
allow_forwarded_traffic = true
allow_gateway_transit = true
}
resource "azurerm_virtual_network_peering" "spoke_to_hub" {
name = "spoke-to-hub"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.spoke.name
remote_virtual_network_id = azurerm_virtual_network.hub.id
allow_forwarded_traffic = true
# use_remote_gateways = true # uncomment when a gateway exists in the hub
}Les zones DNS privées sont la réponse de l'AZ-700 pour la Conception et la mise en œuvre de la résolution de noms pour la résolution de noms inter-VNet qui ne repose pas sur le DNS par défaut d'Azure. Nous créons la zone internal.contoso.com et y lions les VNets hub et spoke. Les ressources de l'un ou l'autre VNet peuvent désormais interroger les enregistrements de cette zone.
Le drapeau registration_enabled = true sur le lien du hub permet aux ressources du hub d'enregistrer automatiquement leurs noms d'hôte. L'AZ-700 teste cette auto-enregistrement par rapport à la création manuelle d'enregistrements A comme la question récurrente "comment obtenir des noms DNS propres pour mes machines virtuelles".
resource "azurerm_private_dns_zone" "main" {
name = "internal.contoso.com"
resource_group_name = azurerm_resource_group.main.name
tags = local.tags
}
resource "azurerm_private_dns_zone_virtual_network_link" "hub" {
name = "hub-link"
resource_group_name = azurerm_resource_group.main.name
private_dns_zone_name = azurerm_private_dns_zone.main.name
virtual_network_id = azurerm_virtual_network.hub.id
registration_enabled = true # auto-register hub-resident VMs
tags = local.tags
}
resource "azurerm_private_dns_zone_virtual_network_link" "spoke" {
name = "spoke-link"
resource_group_name = azurerm_resource_group.main.name
private_dns_zone_name = azurerm_private_dns_zone.main.name
virtual_network_id = azurerm_virtual_network.spoke.id
registration_enabled = false # spoke resources query but don't register
tags = local.tags
}terraform destroy déconstruit tout. Les ressources de peering se détachent automatiquement lorsqu'un VNet est détruit ; Terraform gère l'ordre correctement. Les zones DNS privées avec des enregistrements actifs peuvent être lentes à détruire (Azure attend d'abord que tous les liens consommateurs se détachent) — soyez patient.
L'AZ-700 couvre des aspects de mise en réseau que ce laboratoire ne peut pas aborder — VPN Gateway (environ 60 $/mois, coût prohibitif pour un laboratoire), ExpressRoute + Passerelle ER, Azure Firewall + Stratégie de pare-feu + IDPS Premium (environ 1 $/heure au repos), Application Gateway + WAF, Azure Front Door, Azure Load Balancer (niveau Standard), zones publiques Azure DNS, Résolveur DNS privé, Azure Bastion, Appliances virtuelles réseau, Virtual WAN, Route Server, tables de routage personnalisées (UDR), Points de terminaison de service, Points de terminaison privés + Service Private Link, et Protection DDoS Standard.
Nous nous en tenons à la forme hub-spoke + peering + DNS privé car c'est le substrat auquel tous les autres modèles AZ-700 se connectent. La VPN Gateway se trouve dans le hub. Le pare-feu se trouve dans le hub. L'Application Gateway protège le sous-réseau d'application du spoke. Les Points de terminaison privés routent via le hub. Maîtrisez la topologie ; superposez les modèles au fur et à mesure.
Pour les surfaces mentionnées ci-dessus, consultez les sections Parcourir, Guide et Editorial de cette page de certification.