最后审核时间:2026年5月
使用原生 Terraform 构建 AZ-104 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,你将使用纯 Terraform 预配 AZ-104 参考工作负载——一个资源组、一个带有 NSG 保护的私有子网的 VNet、一个带有系统分配的托管标识的 Linux 虚拟机、一个该虚拟机可以通过该标识读取的存储账户,以及一个接收虚拟机诊断信息的 Log Analytics 工作区。每个模块都与 AZ-104 考试的五个领域之一相关联。
将这些代码片段放入一个 main.tf 文件中,运行 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。az login)。~/.ssh/id_rsa.pub 路径下有一个 SSH 公钥(或在步骤 4 中更改路径),用于虚拟机的管理员登录。虚拟机是主要费用来源:
不使用时停止虚拟机 (az vm deallocate) 可将计算成本减半。销毁整个资源组以完全停止计费。
标准的 Azure 开场白:锁定 azurerm ~> 4.0,创建资源组,将本地 SSH 公钥作为数据源读取,以便步骤 4 中的虚拟机可以使用它。AZ-104 的“身份和治理”领域将资源组作为最小的 RBAC 范围进行测试;这里的标签会级联到“监控 Azure 资源”下的成本跟踪。
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.6"
}
}
}
provider "azurerm" {
features {}
}
resource "random_id" "suffix" {
byte_length = 2
}
locals {
tags = {
Project = "certlabpro-az-104"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-az-104-rg"
location = "eastus"
tags = local.tags
}每个 AZ-104 工作负载都在虚拟网络内运行。我们创建一个 /16 VNet,并为虚拟机划分出一个 /24 子网。附加到子网的 NSG 允许 SSH(端口 22)入站访问——生产环境会限制源 CIDR;本实验将其开放给 *,以便你可以从任何 IP 连接。
AZ-104 的“部署和管理网络”领域反复测试这种分层安全模式:NSG 是有状态的,它们应用于子网 或 NIC(我们在这里应用于子网——这是 AZ-104 的最佳实践答案),并且默认拒绝 + 显式允许的规则结构是 Azure NSG 与 AWS 安全组的不同之处(Azure NSG 有明确的规则编号;AWS SG 没有)。
resource "azurerm_virtual_network" "main" {
name = "certlabpro-az-104-vnet"
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" "app" {
name = "app"
resource_group_name = azurerm_resource_group.main.name
virtual_network_name = azurerm_virtual_network.main.name
address_prefixes = ["10.0.1.0/24"]
}
resource "azurerm_network_security_group" "app" {
name = "certlabpro-az-104-nsg"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
security_rule {
name = "AllowSSH"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
tags = local.tags
}
resource "azurerm_subnet_network_security_group_association" "app" {
subnet_id = azurerm_subnet.app.id
network_security_group_id = azurerm_network_security_group.app.id
}标准的 AZ-104 存储默认设置:标准层、LRS、仅限 HTTPS、最低 TLS 1.2、公共访问已阻止。我们将在步骤 4 中授予虚拟机的托管标识对此账户的读取权限。“管理 Azure 身份和治理”领域测试这种“托管标识 → 资源”模式,作为在应用配置中存储存储账户密钥的无密码替代方案。
resource "azurerm_storage_account" "data" {
name = "az104data${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
tags = local.tags
}虚拟机是 AZ-104 的典型计算工件。我们使用 Standard_B1s(最小的符合免费套餐资格的 Linux SKU)、Ubuntu 22.04 LTS、SSH 密钥认证(AZ-104 的密码反模式答案)以及系统分配的托管标识。
角色分配授予该托管标识对步骤 3 中的存储账户的 Storage Blob Data Reader 权限——这意味着虚拟机可以使用其身份令牌调用存储 REST API,而无需将密钥存储在磁盘上。这是 AZ-104“实施和管理存储”+“身份”的交叉问题:虚拟机如何在没有凭据的情况下访问存储?通过托管标识 + RBAC 角色分配。
resource "azurerm_public_ip" "vm" {
name = "certlabpro-az-104-vm-pip"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
allocation_method = "Static"
sku = "Standard"
tags = local.tags
}
resource "azurerm_network_interface" "vm" {
name = "certlabpro-az-104-vm-nic"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
ip_configuration {
name = "ipconfig1"
subnet_id = azurerm_subnet.app.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.vm.id
}
tags = local.tags
}
resource "azurerm_linux_virtual_machine" "main" {
name = "certlabpro-az-104-vm"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
size = "Standard_B1s"
admin_username = "azureuser"
disable_password_authentication = true
network_interface_ids = [azurerm_network_interface.vm.id]
admin_ssh_key {
username = "azureuser"
public_key = file("~/.ssh/id_rsa.pub")
}
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
identity {
type = "SystemAssigned"
}
tags = local.tags
}
resource "azurerm_role_assignment" "vm_storage_reader" {
scope = azurerm_storage_account.data.id
role_definition_name = "Storage Blob Data Reader"
principal_id = azurerm_linux_virtual_machine.main.identity[0].principal_id
}AZ-104 的“监控和维护 Azure 资源”领域(约占考试的 10-15%)依赖 Log Analytics 作为所有可观察数据的目的地。我们从步骤 3 中的存储账户创建了工作区和诊断设置——现在每个存储事务都以可查询的 KQL 形式存在。
对于虚拟机,我们通常会通过虚拟机扩展安装 Azure Monitor Agent (AMA)——这是现代的 Log Analytics Agent 后的路径。在本实验中,我们设置了工作区;安装代理本身是一个单独的运行时步骤 (azurerm_virtual_machine_extension),这在浏览 / Editorial 部分中有所涵盖。这种架构形态——工作区存在,资源流向其中——是 AZ-104 考题测试的内容。
resource "azurerm_log_analytics_workspace" "main" {
name = "certlabpro-az-104-logs"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "PerGB2018"
retention_in_days = 30
tags = local.tags
}
resource "azurerm_monitor_diagnostic_setting" "storage" {
name = "diag"
target_resource_id = "${azurerm_storage_account.data.id}/blobServices/default/"
log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id
enabled_log {
category = "StorageRead"
}
enabled_log {
category = "StorageWrite"
}
metric {
category = "AllMetrics"
enabled = true
}
}terraform destroy 会销毁所有资源。两点注意事项:
az vm deallocate 会停止计算计费(存储仍然计费)。terraform destroy 会移除所有资源。Static 分配——它在虚拟机解除分配后仍然存在,并保留 IP 地址。如果你不想为未使用的公共 IP 付费(约 $0.005/小时),请销毁它或将其转换为动态分配。AZ-104 涵盖了广泛的操作领域——Azure Backup、恢复服务保管库、Site Recovery、Azure Files / Azure 文件同步、Azure Migrate、Application Gateway、Load Balancer、Azure Bastion、VPN Gateway、ExpressRoute、Azure Firewall、Azure Policy、Azure Blueprints(已弃用)、Entra ID 中的条件访问、B2B/B2C、RBAC 自定义角色以及 ARM/Bicep 模板。
我们坚持使用 VNet + VM + 存储 + 监控基线,因为它是所有其他 AZ-104 问题所假定的基础。添加 Application Gateway 以进行第 7 层路由;添加 VPN Gateway 以实现混合连接;添加恢复服务保管库以进行备份——每一个都是在此基础上进行的有针对性的附加组件。
有关按服务划分的覆盖范围,请参阅此证书页面的浏览、手册和 Editorial 部分。