Última revisão: maio de 2026
Construa os serviços da AWS do exame AZ-700 com Terraform puro — um bloco de cada vez, cada um vinculado a um domínio do exame. O mesmo código funciona no OpenTofu.
Ao final deste laboratório, você terá provisionado, com Terraform puro, a rede de referência AZ-700 — uma VNet hub com uma sub-rede de serviços compartilhados, uma VNet spoke com uma sub-rede de aplicativo, emparelhamento bidirecional entre as duas, uma zona DNS privada ligada a ambas as VNets para resolução de nomes entre VNets, e logs de fluxo NSG no Log Analytics para visibilidade de tráfego.
Solte os trechos de código em um único main.tf, execute terraform init e, em seguida, terraform apply passo a passo.
>= 1.5 ou OpenTofu >= 1.6.az login).Em grande parte gratuito, com uma ressalva:
~$1–2/mês ocioso. As armadilhas de custo do AZ-700 são VPN Gateway (~US$ 60/mês) e ExpressRoute (US$ 200+/mês) — ambos omitidos aqui.
Abertura padrão do 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
}Hub-spoke é a topologia de referência do AZ-700. O hub centraliza serviços compartilhados (firewall, gateway VPN, resolvedor DNS, monitoramento) e os spokes se emparelham com o hub para acessá-los. Construímos o hub em 10.0.0.0/16 com uma sub-rede — em um hub real, você teria uma GatewaySubnet para o Gateway VPN/ExpressRoute, uma AzureFirewallSubnet para o Azure Firewall e uma sub-rede de serviços compartilhados para endpoints de entrada/saída do Resolvedor DNS. O escopo do laboratório é a forma da topologia; os serviços de gateway estão fora do escopo (alto custo).
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"]
}O spoke em 10.1.0.0/16 — deliberadamente não sobreposto ao hub. O NSG anexado à sub-rede do aplicativo restringiria em produção a entrada a CIDRs de origem específicos; o laboratório usa * para a origem para que a arquitetura seja testável.
O AZ-700 Implementar infraestrutura de rede principal aborda repetidamente a questão NSG por sub-rede vs NSG por NIC. NSGs em nível de sub-rede (este laboratório) são a resposta correta quando a pergunta diz "aplicado a todos os recursos na sub-rede"; o nível de NIC é a substituição.
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
}O emparelhamento de VNet é o primitivo de conectividade do AZ-700 dentro de uma região. Duas propriedades chave que o exame testa:
allow_forwarded_traffic — necessário quando o hub planeja encaminhar tráfego de um spoke para outro (trânsito através de um firewall no hub).use_remote_gateways / allow_gateway_transit — o spoke usa use_remote_gateways = true para usar o gateway VPN/ER do hub. Não temos um gateway neste laboratório, mas a forma do atributo é testada no exame.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
}As zonas DNS Privado são a resposta do AZ-700 para Projetar e implementar resolução de nomes para resolução de nomes entre VNets que não dependem do DNS padrão do Azure. Criamos a zona internal.contoso.com e ligamos a ela tanto a VNet hub quanto a VNet spoke. Os recursos em qualquer VNet podem agora consultar registros nesta zona.
A flag registration_enabled = true no link do hub permite que os recursos no hub registrem automaticamente seus nomes de host. O AZ-700 testa este registro automático versus a criação manual de registros A como a pergunta recorrente "como obtenho nomes DNS limpos para minhas 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 derruba tudo. Os recursos de emparelhamento se desanexam automaticamente quando qualquer VNet é destruída; o Terraform lida com a ordem corretamente. As zonas DNS privadas com registros ativos podem ser lentas para destruir (o Azure espera que todos os links de consumidor se desanexem primeiro) — seja paciente.
O AZ-700 cobre superfícies de rede que este laboratório não pode incluir — VPN Gateway (~US$ 60/mês, custo proibitivo para laboratório), ExpressRoute + ER Gateway, Azure Firewall + Firewall Policy + Premium IDPS (~US$ 1/hora ociosa), Application Gateway + WAF, Azure Front Door, Azure Load Balancer (camada Standard), zonas públicas do Azure DNS, DNS Private Resolver, Azure Bastion, Network Virtual Appliances, Virtual WAN, Route Server, tabelas de rotas personalizadas (UDRs), Service Endpoints, Private Endpoints + Private Link Service, e DDoS Protection Standard.
Nós nos limitamos à forma hub-spoke + emparelhamento + DNS Privado porque é o substrato ao qual todos os outros padrões do AZ-700 se conectam. O VPN Gateway vai no hub. O Firewall vai no hub. O Application Gateway protege a sub-rede do aplicativo do spoke. Os Private Endpoints roteiam através do hub. Entenda a topologia corretamente; adicione camadas por padrão.
Para as superfícies acima, consulte as seções Navegar, Guia e Editorial desta página de certificação.