Zuletzt überprüft: Mai 2026
Erstellen Sie die AWS-Dienste der AZ-700-Prüfung mit reinem Terraform — ein Block nach dem anderen, jeweils abgestimmt auf eine Prüfungsdomäne. Derselbe Code funktioniert auch mit OpenTofu.
Am Ende dieses Labs haben Sie mit reinem Terraform das AZ-700-Referenznetzwerk bereitgestellt – ein Hub-VNet mit einem Subnetz für gemeinsam genutzte Dienste, ein Spoke-VNet mit einem App-Subnetz, bidirektionales Peering zwischen beiden, eine private DNS-Zone, die mit beiden VNets für die VNet-übergreifende Namensauflösung verknüpft ist, und NSG-Flow-Logs in Log Analytics für die Transparenz des Datenverkehrs.
Fügen Sie die Snippets in eine einzelne main.tf ein, führen Sie terraform init aus, und dann Schritt für Schritt terraform apply.
>= 1.5 oder OpenTofu >= 1.6.az login).Größtenteils kostenlos, mit einer Einschränkung:
Im Leerlauf ca. 1–2 $/Monat. Die AZ-700-Kostenfallen sind VPN Gateway (ca. 60 $/Monat) und ExpressRoute (über 200 $/Monat) – beide hier weggelassen.
Standard Azure-Einführung.
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
}Hub-Spoke ist die AZ-700-Referenztopologie. Der Hub zentralisiert gemeinsam genutzte Dienste (Firewall, VPN-Gateway, DNS-Resolver, Überwachung), und Spokes verbinden sich per Peering mit dem Hub, um auf diese zuzugreifen. Wir erstellen den Hub unter 10.0.0.0/16 mit einem Subnetz – in einem echten Hub hätten Sie ein GatewaySubnet für das VPN/ExpressRoute-Gateway, ein AzureFirewallSubnet für die Azure Firewall und ein Subnetz für gemeinsam genutzte Dienste für DNS-Resolver-Inbound-/Outbound-Endpunkte. Der Lab-Umfang ist die Topologieform; die Gateway-Dienste sind außerhalb des Umfangs (hohe Kosten).
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"]
}Das Spoke-VNet unter 10.1.0.0/16 – bewusst nicht überlappend mit dem Hub. Die an das App-Subnetz angehängte NSG würde in der Produktion den Ingress auf bestimmte Quell-CIDRs beschränken; das Lab verwendet * als Quelle, damit die Architektur testbar ist.
AZ-700 Implement core networking infrastructure behandelt wiederholt die Frage NSG pro Subnetz vs. NSG pro NIC. NSGs auf Subnetz-Ebene (dieses Lab) sind die richtige Antwort, wenn die Frage lautet „auf alle Ressourcen im Subnetz angewendet“; NIC-Ebene ist die Überschreibung.
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
}VNet-Peering ist die AZ-700-Konnektivitäts-Primitive innerhalb einer Region. Zwei wichtige Eigenschaften, die die Prüfung testet:
allow_forwarded_traffic – erforderlich, wenn der Hub plant, Datenverkehr von einem Spoke zu einem anderen weiterzuleiten (Transit durch eine Firewall im Hub).use_remote_gateways / allow_gateway_transit – der Spoke verwendet use_remote_gateways = true, um das VPN/ER-Gateway des Hubs zu nutzen. Wir haben in diesem Lab kein Gateway, aber die Attributform wird in der Prüfung getestet.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
}Private DNS-Zonen sind die AZ-700-Antwort im Bereich Design and implement name resolution für die VNet-übergreifende Namensauflösung, die nicht auf Azure's Standard-DNS angewiesen ist. Wir erstellen die Zone internal.contoso.com und verknüpfen sowohl das Hub- als auch das Spoke-VNet damit. Ressourcen in beiden VNets können nun Datensätze in dieser Zone abfragen.
Das Flag registration_enabled = true auf der Hub-Verknüpfung ermöglicht es Ressourcen im Hub, ihre Hostnamen automatisch zu registrieren. AZ-700 testet diese automatische Registrierung im Vergleich zur manuellen A-Record-Erstellung als wiederkehrende Frage „wie erhalte ich saubere DNS-Namen für meine VMs“.
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 reißt alles ab. Peering-Ressourcen lösen sich automatisch, wenn eines der VNets zerstört wird; Terraform handhabt die Reihenfolge korrekt. Private DNS-Zonen mit aktiven Datensätzen können langsam zerstört werden (Azure wartet, bis alle Consumer-Links zuerst getrennt sind) – haben Sie Geduld.
AZ-700 deckt Netzwerkoberflächen ab, die dieses Lab nicht behandeln kann – VPN Gateway (ca. 60 $/Monat, zu teuer für ein Lab), ExpressRoute + ER Gateway, Azure Firewall + Firewall Policy + Premium IDPS (ca. 1 $/Stunde im Leerlauf), Application Gateway + WAF, Azure Front Door, Azure Load Balancer (Standard-Tier), öffentliche Azure DNS-Zonen, DNS Private Resolver, Azure Bastion, Network Virtual Appliances, Virtual WAN, Route Server, benutzerdefinierte Routingtabellen (UDRs), Service Endpoints, Private Endpoints + Private Link Service und DDoS Protection Standard.
Wir halten uns an die Form Hub-Spoke + Peering + Private DNS, da dies das Substrat ist, an das sich jedes andere AZ-700-Muster anfügt. VPN Gateway kommt in den Hub. Firewall kommt in den Hub. Application Gateway schützt das App-Subnetz des Spoke. Private Endpoints routen durch den Hub. Die Topologie richtig aufbauen; pro Muster schichten.
Für die oben genannten Oberflächen siehe die Abschnitte Durchsuchen, Handbuch und Editorial dieser Zertifizierungsseite.