Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена AZ-104 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы подготовите, используя чистый Terraform, эталонную рабочую нагрузку AZ-104 — группу ресурсов, виртуальную сеть с частной подсетью, защищенной NSG, виртуальную машину Linux с системно-управляемым удостоверением, учетную запись хранения, из которой виртуальная машина сможет читать данные через это удостоверение, и рабочую область Log Analytics, получающую диагностические данные виртуальной машины. Каждый блок связан с одной из пяти областей экзамена AZ-104.
Поместите фрагменты кода в один файл main.tf, запустите terraform init, затем пошагово выполните terraform apply.
>= 1.5 или OpenTofu >= 1.6.az login).~/.ssh/id_rsa.pub (или измените путь в Шаге 4) для входа администратора в ВМ.Виртуальная машина — это основная статья расходов:
Останавливайте ВМ (az vm deallocate), когда активно не используете ее, чтобы сократить расходы на вычисления вдвое. Удаление всей группы ресурсов полностью прекратит начисления.
Стандартное начало работы с Azure: закрепите azurerm ~> 4.0, создайте группу ресурсов, прочитайте локальный публичный ключ SSH как источник данных, чтобы ВМ в Шаге 4 могла его использовать. Домен AZ-104 Управление идентификацией и доступом (Identity and Governance) проверяет группы ресурсов как наименьшую область RBAC; теги здесь распространяются для отслеживания затрат в рамках Мониторинга ресурсов Azure (Monitor Azure resources).
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 работает внутри виртуальной сети. Мы создадим VNet /16 и выделим одну подсеть /24 для ВМ. NSG, прикрепленная к подсети, разрешает входящий SSH (порт 22) — в продакшене источник CIDR будет ограничен; лабораторная работа открывает его для *, чтобы вы могли подключиться с любого IP.
Домен AZ-104 Развертывание и управление сетями (Deploy and Manage Networking) многократно проверяет этот многоуровневый шаблон безопасности: NSG являются stateful, они применяются к подсетям или сетевым интерфейсам (здесь мы применяем к подсети — это лучший ответ на 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: уровень Standard, LRS, только HTTPS, минимум TLS 1.2, публичный доступ заблокирован. Мы предоставим управляемому удостоверению ВМ доступ на чтение к этой учетной записи в Шаге 4. Домен Управление идентификацией и доступом Azure (Manage Azure Identities and Governance) проверяет этот шаблон "управляемое удостоверение → ресурс" как бесключевую альтернативу хранению ключей учетной записи хранения в конфигурации приложения.
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 (наименьший SKU Linux, подходящий для бесплатного уровня), Ubuntu 22.04 LTS, аутентификацию по SSH-ключу (ответ AZ-104 против шаблона использования пароля) и системно-управляемое удостоверение.
Назначение роли предоставляет этому управляемому удостоверению роль Storage Blob Data Reader для учетной записи хранения из Шага 3 — это означает, что ВМ может вызывать REST API хранилища, используя свой токен удостоверения, без хранения ключей на диске. Это перекрестный вопрос AZ-104 Реализация и управление хранилищем (Implement and Manage Storage) + Идентификация (Identity): как ВМ получает доступ к хранилищу без учетных данных? Управляемое удостоверение + назначение роли 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 (Monitor and Maintain Azure Resources) (~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-адреса. Удалите или преобразуйте в Dynamic, если не хотите платить за неиспользуемый публичный IP-адрес (~0,005 $/час).AZ-104 охватывает широкий спектр операций — Azure Backup, Recovery Services Vault, Site Recovery, Azure Files / Azure File Sync, Azure Migrate, Application Gateway, Load Balancer, Azure Bastion, VPN Gateway, ExpressRoute, Azure Firewall, Azure Policy, Azure Blueprints (устаревает), Conditional Access в Entra ID, B2B/B2C, настраиваемые роли RBAC и шаблоны ARM/Bicep.
Мы придерживаемся базовой конфигурации VNet + VM + Storage + Monitor, поскольку это основа, которую предполагает каждый другой вопрос AZ-104. Добавьте Application Gateway для маршрутизации на уровне 7; добавьте VPN Gateway для гибридного подключения; добавьте Recovery Services Vault для резервного копирования — каждый из этих компонентов является целенаправленным дополнением к этой базе.
Для обзора услуг см. разделы Просмотр, Справочник и Editorial этой страницы сертификата.