Última revisión: mayo de 2026
Crea los servicios de AWS del examen AZ-104 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ás aprovisionado, con Terraform simple, la carga de trabajo de referencia AZ-104: un Grupo de recursos, una VNet con una subred privada protegida por NSG, una VM Linux con una identidad administrada asignada por el sistema, una cuenta de almacenamiento de la que la VM puede leer a través de esa identidad, y un espacio de trabajo de Log Analytics que recibe diagnósticos de la VM. Cada bloque se vincula a uno de los cinco dominios del examen AZ-104.
Copia los fragmentos en un único main.tf, ejecuta terraform init y luego terraform apply paso a paso.
>= 1.5 o OpenTofu >= 1.6.az login).~/.ssh/id_rsa.pub (o cambia la ruta en el Paso 4) para el inicio de sesión de administrador de la VM.La VM es el principal costo:
Detén la VM (az vm deallocate) cuando no la estés usando activamente para reducir a la mitad el costo de cómputo. Destruye todo el grupo de recursos para detener completamente la facturación.
Inicio estándar de Azure: fija azurerm ~> 4.0, crea el Grupo de recursos, lee la clave pública SSH local como fuente de datos para que la VM del Paso 4 pueda usarla. El dominio Identidad y Gobernanza de AZ-104 prueba los Grupos de recursos como el ámbito RBAC más pequeño; las etiquetas aquí se usan en cascada para el seguimiento de costos en Monitorear recursos de 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
}Toda carga de trabajo de AZ-104 se ejecuta dentro de una Red Virtual. Creamos una VNet /16 y reservamos una subred /24 para la VM. El NSG adjunto a la subred permite SSH (puerto 22) de entrada — la producción restringiría el CIDR de origen; el laboratorio lo abre a * para que puedas conectarte desde cualquier IP.
El dominio Implementar y Administrar Redes de AZ-104 prueba repetidamente este patrón de seguridad por capas: los NSG tienen estado, se aplican a subredes o NICs (aquí lo aplicamos a la subred — la respuesta de mejores prácticas de AZ-104), y la estructura de reglas de denegación predeterminada + permiso explícito es cómo los NSG de Azure difieren de los grupos de seguridad de AWS (los NSG de Azure tienen números de regla explícitos; los SG de AWS no).
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
}Valores predeterminados de almacenamiento AZ-104: nivel Estándar, LRS, solo HTTPS, TLS 1.2 mínimo, acceso público bloqueado. Concederemos a la identidad administrada de la VM acceso de lectura a esta cuenta en el Paso 4. El dominio Administrar Identidades y Gobernanza de Azure prueba este patrón de identidad administrada → recurso como la alternativa sin contraseña para almacenar claves de cuenta de almacenamiento en la configuración de la aplicación.
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
}La VM es el artefacto de cómputo canónico de AZ-104. Usamos Standard_B1s (el SKU de Linux elegible para el nivel gratuito más pequeño), Ubuntu 22.04 LTS, autenticación con clave SSH (la respuesta anti-patrón de contraseña de AZ-104), y una identidad administrada asignada por el sistema.
La asignación de roles otorga a esa identidad administrada el rol Storage Blob Data Reader en la cuenta de almacenamiento del Paso 3 — lo que significa que la VM puede llamar a las API REST de almacenamiento usando su token de identidad, sin claves almacenadas en disco. Esta es la pregunta transversal de AZ-104 sobre Implementar y Administrar Almacenamiento + Identidad: ¿cómo accede una VM al almacenamiento sin credenciales? Identidad administrada + asignación de rol 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
}El dominio Monitorear y Mantener Recursos de Azure de AZ-104 (~10–15% del examen) se apoya en Log Analytics como el destino para todo lo observable. Creamos el espacio de trabajo y una Configuración de diagnóstico en la cuenta de almacenamiento del Paso 3 — cada transacción de almacenamiento ahora llega en formato KQL consultable.
Para la VM, normalmente instalaríamos el Agente de Azure Monitor (AMA) a través de una extensión de VM — ese es el camino moderno después del Agente de Log Analytics. Para el laboratorio, configuramos el espacio de trabajo; la instalación del agente en sí es un paso de tiempo de ejecución separado (azurerm_virtual_machine_extension) que se cubre en las secciones Buscar / Editorial. La forma arquitectónica — el espacio de trabajo existe, los recursos fluyen hacia él — es lo que prueban las preguntas de 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 destruye todo. Dos notas:
az vm deallocate detiene la facturación de cómputo (el almacenamiento sigue facturando). terraform destroy elimina todo.Static — sobrevive a la desasignación de la VM, mantiene la reserva de la dirección IP. Destrúyela o conviértela a Dinámica si no quieres pagar por una IP pública no utilizada (~0,005 $/hora).AZ-104 cubre una amplia superficie operativa: 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 (en desuso), Acceso Condicional en Entra ID, B2B/B2C, roles personalizados de RBAC y plantillas ARM/Bicep.
Nos ceñimos a la línea base de VNet + VM + Almacenamiento + Monitor porque es el sustrato que asumen todas las demás preguntas de AZ-104. Añade un Application Gateway para el enrutamiento de capa 7; añade un VPN Gateway para la conectividad híbrida; añade Recovery Services Vault para la copia de seguridad — cada uno es un complemento enfocado a esta base.
Para una cobertura servicio por servicio, consulta las secciones Buscar, Manual y Editorial de esta página de certificación.