Última revisión: mayo de 2026
Crea los servicios de AWS del examen AZ-700 con Terraform puro: bloque a bloque, cada uno vinculado a un dominio del examen. El mismo código funciona en OpenTofu.
Al final de este laboratorio, habrá aprovisionado, con Terraform simple, la red de referencia AZ-700: una VNet de hub con una subred de servicios compartidos, una VNet de spoke con una subred de aplicación, emparejamiento bidireccional entre ambas, una zona DNS privada vinculada a ambas VNets para la resolución de nombres entre VNets, y registros de flujo de NSG en Log Analytics para la visibilidad del tráfico.
Pegue los fragmentos en un único main.tf, ejecute terraform init, y luego terraform apply paso a paso.
>= 1.5 o OpenTofu >= 1.6.az login).Mayormente gratuito, con una salvedad:
$1–2/mes en reposo. Las trampas de costos de AZ-700 son VPN Gateway ($60/mes) y ExpressRoute ($200+/mes), ambas omitidas aquí.
Inicio estándar de 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
}La topología de hub-spoke es la topología de referencia AZ-700. El hub centraliza los servicios compartidos (firewall, gateway VPN, resolvedor DNS, monitoreo) y los spokes se emparejan con el hub para acceder a ellos. Construimos el hub en 10.0.0.0/16 con una subred; en un hub real, tendría una GatewaySubnet para la puerta de enlace VPN/ExpressRoute, una AzureFirewallSubnet para Azure Firewall y una subred de servicios compartidos para los puntos de conexión de entrada/salida del resolvedor DNS. El alcance del laboratorio es la forma de la topología; los servicios de gateway están fuera del alcance (alto costo).
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"]
}El spoke en 10.1.0.0/16 — deliberadamente sin superposición con el hub. El NSG adjunto a la subred de aplicación en producción restringiría la entrada a CIDRs de origen específicos; el laboratorio usa * como origen para que la arquitectura sea comprobable.
AZ-700 Implementar infraestructura de red central aborda repetidamente la pregunta NSG por subred vs NSG por NIC. Los NSG a nivel de subred (este laboratorio) son la respuesta correcta cuando la pregunta dice "aplicado a todos los recursos en la subred"; el nivel de NIC es la anulación.
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
}El emparejamiento de VNets es la primitiva de conectividad AZ-700 dentro de una región. Dos propiedades clave que el examen evalúa:
allow_forwarded_traffic — requerido cuando el hub planea reenviar tráfico de un spoke a otro (tránsito a través de un firewall en el hub).use_remote_gateways / allow_gateway_transit — el spoke usa use_remote_gateways = true para usar el gateway VPN/ER del hub. No tenemos un gateway en este laboratorio, pero la forma del atributo es evaluada en el 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
}Las zonas DNS privadas son la respuesta de AZ-700 para Diseñar e implementar la resolución de nombres para la resolución de nombres entre VNets que no depende del DNS predeterminado de Azure. Creamos la zona internal.contoso.com y vinculamos a ella tanto la VNet de hub como la de spoke. Los recursos en cualquiera de las VNets ahora pueden consultar registros en esta zona.
El flag registration_enabled = true en el enlace del hub permite que los recursos en el hub registren automáticamente sus nombres de host. AZ-700 prueba este registro automático frente a la creación manual de registros A como la pregunta recurrente de "cómo obtengo nombres DNS limpios para mis 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 destruye todo. Los recursos de emparejamiento se desvinculan automáticamente cuando se destruye cualquiera de las VNets; Terraform maneja el orden correctamente. Las zonas DNS privadas con registros activos pueden tardar en destruirse (Azure espera a que todos los enlaces de consumo se desvinculen primero) — sea paciente.
AZ-700 cubre superficies de red que este laboratorio no puede abarcar: VPN Gateway ($60/mes, prohibitivo en costos para el laboratorio), ExpressRoute + ER Gateway, Azure Firewall + Firewall Policy + Premium IDPS ($1/hora en reposo), Application Gateway + WAF, Azure Front Door, Azure Load Balancer (nivel Standard), zonas públicas de Azure DNS, DNS Private Resolver, Azure Bastion, Network Virtual Appliances, Virtual WAN, Route Server, tablas de rutas personalizadas (UDRs), Service Endpoints, Private Endpoints + Private Link Service y DDoS Protection Standard.
Nos apegamos a la forma de hub-spoke + emparejamiento + DNS privado porque es el sustrato al que se adhieren todos los demás patrones de AZ-700. VPN Gateway va en el hub. El firewall va en el hub. Application Gateway protege la subred de la aplicación del spoke. Los Private Endpoints se enrutan a través del hub. Entienda bien la topología; luego agregue capa por patrón.
Para las superficies anteriores, consulte las secciones Buscar, Manual y Editorial de esta página de certificación.