最后审核时间:2026年5月
使用原生 Terraform 构建 AZ-700 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,您将使用纯 Terraform 预配 AZ-700 参考网络——一个带有共享服务子网的中心 VNet,一个带有应用子网的辐条 VNet,两者之间的双向对等连接,一个链接到两个 VNet 以实现跨 VNet 名称解析的私有 DNS 区域,以及用于流量可视化的 NSG 流日志到 Log Analytics。
将代码片段放入单个 main.tf 文件中,运行 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。az login)。大部分免费,但有一个注意事项:
闲置状态下每月约 $1–2。AZ-700 的主要成本陷阱是 VPN 网关(约 $60/月)和 ExpressRoute($200+/月)——两者在此处均已省略。
标准的 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
}中心-辐条是 AZ-700 的参考拓扑结构。中心 VNet 集中共享服务(防火墙、VPN 网关、DNS 解析器、监控),而辐条 VNet 与中心 VNet 对等以访问这些服务。我们以 10.0.0.0/16 构建中心 VNet,其中包含一个子网——在真实的中心 VNet 中,您会有一个用于 VPN/ExpressRoute 网关的 GatewaySubnet,一个用于 Azure 防火墙的 AzureFirewallSubnet,以及一个用于 DNS 解析器入站/出站端点的共享服务子网。实验范围是拓扑结构形状;网关服务不在范围之内(成本高昂)。
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"]
}辐条 VNet 的地址空间为 10.1.0.0/16——故意与中心 VNet 不重叠。附加到应用子网的 NSG 在生产环境中会限制入站流量到特定的源 CIDR;本实验将源设置为 * 以便架构可以测试。
AZ-700 的“实现核心网络基础设施”部分反复涉及 每个子网的 NSG 与每个 NIC 的 NSG 的问题。当问题表示“应用于子网中的所有资源”时,子网级别的 NSG(本实验)是正确的答案;NIC 级别是覆盖选项。
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 对等连接是 AZ-700 在区域内的连接原语。考试会测试两个关键属性:
allow_forwarded_traffic——当中心 VNet 计划将流量从一个辐条 VNet 转发到另一个(通过中心 VNet 中的防火墙进行中转)时需要此项。use_remote_gateways / allow_gateway_transit——辐条 VNet 使用 use_remote_gateways = true 来利用中心 VNet 的 VPN/ER 网关。本实验中没有网关,但此属性的形态是考试考查点。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
}私有 DNS 区域是 AZ-700“设计和实现名称解析”中针对不依赖 Azure 默认 DNS 的跨 VNet 名称解析的解决方案。我们创建区域 internal.contoso.com 并将中心 VNet 和辐条 VNet 都链接到它。现在,任一 VNet 中的资源都可以查询此区域中的记录。
中心 VNet 链接上的 registration_enabled = true 标志允许中心 VNet 中的资源自动注册其主机名。AZ-700 经常测试这种自动注册与手动创建 A 记录之间的区别,作为“如何为我的虚拟机获取干净的 DNS 名称”的常见问题。
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 会销毁所有资源。当任一 VNet 被销毁时,对等连接资源会自动分离;Terraform 会正确处理销毁顺序。带有活动记录的私有 DNS 区域销毁可能较慢(Azure 会等待所有消费者链接首先分离)——请耐心等待。
AZ-700 涵盖了本实验无法容纳的网络服务——VPN 网关(约 $60/月,对于实验来说成本过高)、ExpressRoute + ER 网关、Azure 防火墙 + 防火墙策略 + 高级 IDPS(闲置时约 $1/小时)、应用网关 + WAF、Azure Front Door、Azure 负载均衡器(标准层)、Azure DNS 公共区域、DNS 私有解析器、Azure Bastion、网络虚拟设备、虚拟 WAN、路由服务器、自定义路由表 (UDR)、服务终结点、私有终结点 + 私有链接服务以及 DDoS 保护标准。
我们坚持使用中心-辐条 + 对等连接 + 私有 DNS 的形式,因为它是所有其他 AZ-700 模式所依赖的基础。VPN 网关位于中心 VNet。防火墙位于中心 VNet。应用网关保护辐条 VNet 的应用子网。私有终结点通过中心 VNet 路由。首先建立正确的拓扑结构;然后逐个模式进行分层。
对于上述服务,请参阅此认证页面的 浏览、手册 和 Editorial 部分。