Guía completa
Terraform Associate 004
Toca cualquier servicio para ver más detalles y documentación oficial.
Distribución del examen
40–60
Preguntas
~45
Min lectura
700
Puntaje mínimo
IaC y propósito de Terraform
15% del examen¿Qué es Infrastructure as Code?
IaC es la práctica de definir y gestionar infraestructura mediante archivos de configuración legibles por máquinas, en lugar de configuración manual o herramientas de UI. Los archivos se versionan en VCS igual que el código de aplicación.
| Característica | Manual / Consola | IaC con Terraform |
|---|---|---|
| Reproducibilidad | Depende del operador | Idéntico en cada ejecución |
| Versionado | No | Git — historial completo |
| Revisión | No hay diff | Pull Request con terraform plan |
| Colaboración | Un operador a la vez | Múltiples via VCS + locking |
| Rollback | Manual, propenso a errores | git revert + apply |
| Documentación | Implícita | El código ES la documentación |
Ventajas del enfoque declarativo de Terraform
Declarativo
Describes el estado DESEADO, no los pasos. Terraform calcula el diff y determina las acciones necesarias.
Provider-agnostic
Un mismo lenguaje (HCL) para AWS, Azure, GCP, Kubernetes, Datadog, GitHub y cientos de providers más.
Idempotente
Ejecutar apply múltiples veces produce el mismo resultado — si ya existe, no lo recrea.
DAG de dependencias
Terraform construye un grafo de dependencias y aplica cambios en paralelo cuando es seguro.
Terraform vs otras herramientas IaC
| Herramienta | Tipo | Cuándo usarla |
|---|---|---|
| Terraform | Declarativo · multi-cloud | Gestión de infraestructura cloud/on-prem. Cualquier proveedor. |
| Ansible | Procedural · agentless | Configuración de SO, instalación de software, gestión de estado de servidores. |
| CloudFormation | Declarativo · solo AWS | Infraestructura AWS en equipos que no necesitan multi-cloud. |
| Pulumi | Declarativo · multi-cloud | Mismo rol que Terraform pero usando lenguajes de programación (Python, TypeScript). |
| Chef/Puppet | Procedural · agente | Gestión de configuración de flotas de servidores con agente instalado. |
Terraform es complementario a Ansible, no competidor. Terraform crea la infraestructura (VMs, redes, DBs). Ansible configura lo que hay dentro (instala paquetes, configura apps). En el examen: Terraform = provisioning, Ansible = configuration management.
Flujo de trabajo core
11% del examenWrite → Plan → Apply
El flujo de trabajo estándar de Terraform. Cada etapa tiene un propósito claro y el orden es siempre el mismo.
1. Write
Defines recursos en archivos .tf con HCL
2. Plan
Terraform muestra qué cambiará sin aplicar
3. Apply
Aplica los cambios y actualiza el state
Comandos principales
Haz clic en cualquier servicio para ver más detalles
Comandos adicionales de ciclo de vida
| Comando | Función |
|---|---|
| terraform fmt | Formatea archivos .tf al estilo canónico de HCL. Equivalente a prettier. |
| terraform validate | Valida sintaxis y coherencia de la configuración SIN llamar a la API del provider. |
| terraform apply -replace=addr | Fuerza la recreación de un recurso específico (reemplaza terraform taint, deprecado desde v0.15.2). |
| terraform plan -refresh-only | Detecta drift entre state y realidad sin aplicar cambios de configuración (reemplaza terraform refresh, deprecado desde v1.6). |
| terraform output | Muestra los outputs definidos en el state actual. |
| terraform show | Muestra el state o plan guardado en formato legible. |
| terraform graph | Genera el grafo de dependencias en formato DOT (visualizable con Graphviz). |
| terraform force-unlock | Libera manualmente un lock de state cuando apply falló a medias. |
| terraform login | Autentica con HCP Terraform y guarda credenciales localmente. |
En el examen: terraform fmt y terraform validate son seguros de correr en cualquier momento — no tocan infraestructura real ni el state. Son pasos de calidad pre-plan.
Providers y configuración
12% del examenArquitectura de plugins
Terraform Core se comunica con providers mediante RPC. Cada provider es un binario separado descargado durante init. Esta arquitectura desacopla Terraform del ciclo de releases de cada proveedor.
Haz clic en cualquier servicio para ver más detalles
Configuración de provider
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
}
# Provider con alias para múltiples regiones
provider "aws" {
alias = "us_east"
region = "us-east-1"
}| Constraint | Significado | Ejemplo |
|---|---|---|
| = 5.0.0 | Exactamente esa versión | = 5.0.0 |
| != 5.0.0 | Cualquiera excepto esa | != 4.0.0 |
| > 5.0 | Mayor que | > 5.0 |
| ~> 5.0 | 5.x pero no 6.x (patch libre) | ~> 5.0 |
| ~> 5.0.0 | 5.0.x pero no 5.1 (micro libre) | ~> 5.0.4 |
| >= 4.0, < 6.0 | Rango explícito | >= 4.0, < 6.0 |
Terraform Registry
registry.terraform.io es el repositorio oficial de providers y módulos. Providers oficiales (HashiCorp), verificados (Partner) y community.
| Tier | Quién lo mantiene | Badge |
|---|---|---|
| Official | HashiCorp | hashicorp/aws, hashicorp/azurerm, hashicorp/google |
| Partner | Empresa con acuerdo HashiCorp | Verificados y soportados por el partner |
| Community | Comunidad open source | Sin soporte garantizado |
Variables, outputs y expresiones
18% del examenTipos de valores
Haz clic en cualquier servicio para ver más detalles
Tipos de datos en HCL
| Tipo | Ejemplo | Nota |
|---|---|---|
| string | "us-east-1" | Texto unicode |
| number | 42 / 3.14 | Entero o decimal |
| bool | true / false | Booleano |
| list(type) | ["a", "b", "c"] | Lista ordenada, acceso por índice |
| set(type) | toset(["a", "b", "c"]) | Sin orden, sin duplicados |
| map(type) | { key = "value" } | Pares clave-valor del mismo tipo |
| object({}) | { name = string, port = number } | Atributos tipados nombrados |
| tuple([]) | [string, number, bool] | Lista con tipos heterogéneos |
| any | cualquier | Tipo dinámico — Terraform infiere |
Funciones built-in de HCL
| Categoría | Funciones clave | Ejemplo |
|---|---|---|
| String | format, join, split, replace, upper, lower, trimspace | format("Hello %s", var.name) |
| Colección | length, concat, flatten, merge, keys, values, lookup | length(var.subnets) |
| Numérica | max, min, ceil, floor, abs | max(var.min_size, 2) |
| Encoding | jsonencode, jsondecode, base64encode, base64decode | jsonencode({ port = 80 }) |
| Filesystem | file, templatefile, pathexpand, abspath | file("./scripts/init.sh") |
| Date/Time | timestamp, formatdate, timeadd | formatdate("YYYY-MM-DD", timestamp()) |
| IP Network | cidrsubnet, cidrhost, cidrnetmask | cidrsubnet("10.0.0.0/8", 8, 2) |
Meta-argumentos de recursos
| Meta-argumento | Función |
|---|---|
| count = N | Crea N copias del recurso. Acceso con recurso.nombre[index]. |
| for_each = map/set | Crea una instancia por elemento. Acceso con recurso.nombre[key]. |
| depends_on = [...] | Dependencia explícita cuando no hay referencia directa. |
| provider = alias | Usa instancia específica de provider (para múltiples regiones/cuentas). |
| lifecycle {} | Controla comportamiento: prevent_destroy, create_before_destroy, ignore_changes. |
| provisioner (evitar) | Ejecuta scripts post-creación. Desaconsejado — usa cloud-init o user_data en su lugar. |
count vs for_each: usa for_each cuando los elementos tienen identidad propia (keys). Con count, eliminar un elemento del medio re-numera todos los siguientes y puede destruir recursos no deseados.
Módulos
12% del examenEstructura y uso de módulos
Haz clic en cualquier servicio para ver más detalles
# Llamar un módulo del Terraform Registry
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"
name = var.vpc_name
cidr = "10.0.0.0/16"
}
# Acceder output del módulo
output "vpc_id" {
value = module.vpc.vpc_id
}Fuentes de módulos
| Source | Ejemplo | Cuándo |
|---|---|---|
| Terraform Registry | "hashicorp/consul/aws" | Módulos públicos oficiales/partner/community |
| Path local | "./modules/networking" | Módulos propios dentro del mismo repo |
| GitHub (HTTPS) | "github.com/org/repo//modules/vpc" | Módulos privados en GitHub sin registry |
| GitHub (SSH) | "git@github.com:org/repo.git" | GitHub con auth SSH |
| S3 bucket | "s3::https://bucket.s3.amazonaws.com/module.zip" | Artefactos en S3 |
| HCP Registry | "app.terraform.io/org/module/aws" | Módulos privados en organización HCP |
Buenas prácticas de módulos
Siempre versionar
version = "~> 1.0" en módulos del registry. Sin versión = siempre la última, rompe en updates.
variables.tf
Define todos los inputs en variables.tf separado. Agrega description y validation.
outputs.tf
Todos los outputs en outputs.tf. Expón solo lo necesario — evita exponer internals.
README.md
Documenta inputs, outputs y ejemplos de uso. terraform-docs genera esto automáticamente.
State management
15% del examenEl state de Terraform
Haz clic en cualquier servicio para ver más detalles
Backends remotos
| Backend | Provider | State Locking | Nota |
|---|---|---|---|
| s3 | AWS | DynamoDB separado | Backend más popular. Requiere tabla DynamoDB para locking. |
| azurerm | Azure | Blob lease nativo | Azure Blob Storage. Locking nativo sin configuración extra. |
| gcs | Nativo | Google Cloud Storage. Locking nativo. | |
| http | Cualquiera | Opcional | Backend genérico vía HTTP. Útil para backends custom. |
| kubernetes | K8s | Nativo | State en ConfigMap/Secret de Kubernetes. |
| cloud (HCP) | HCP Terraform | Nativo | Recomendado. Locking + cifrado + historial de versiones. |
Comandos de state
| Comando | Función |
|---|---|
| terraform state list | Lista todos los recursos en el state |
| terraform state show addr | Muestra atributos detallados de un recurso en el state |
| terraform state mv src dst | Renombra/mueve recurso en el state (sin tocar infraestructura) |
| terraform state rm addr | Elimina recurso del state SIN destruirlo en la nube |
| terraform state pull | Descarga y muestra el state remoto como JSON |
| terraform state push | Sube un state local al backend remoto (peligroso — puede sobrescribir) |
| terraform import addr id | Importa recurso existente al state |
| terraform plan -refresh-only | Detecta drift comparando state vs realidad sin aplicar cambios (terraform refresh deprecado v1.6) |
terraform state rm NO destruye el recurso real — solo lo elimina del tracking de Terraform. Útil para "liberar" un recurso de Terraform sin eliminarlo. Después del rm, Terraform ya no gestiona ese recurso.
CLI avanzado y HCP Terraform
14% del examenHCP Terraform
Haz clic en cualquier servicio para ver más detalles
| Tier | Qué incluye |
|---|---|
| Free | Hasta 500 recursos, remote state, remote execution, 1 concurrent run, VCS básico |
| Plus | Policy as Code (Sentinel/OPA), SSO, audit logs, self-hosted agents |
| Enterprise | On-premises, clustering, SAML, soporte dedicado |
terraform import
Importa infraestructura existente (creada manualmente o por otro sistema) al state de Terraform para gestionarla desde ahora con IaC.
# Antes de importar, define el recurso en tu .tf:
resource "aws_instance" "web" {
# terraform import llenará los atributos
}
# Luego importa con el ID real del recurso:
terraform import aws_instance.web i-1234567890abcdef0
# Terraform 1.5+: bloque import nativo en HCL
import {
to = aws_instance.web
id = "i-1234567890abcdef0"
}Después de importar, ejecuta terraform plan — si el plan muestra cambios, tu configuración .tf no coincide con el recurso real. Ajusta los atributos hasta que el plan muestre "No changes".
terraform apply -replace (reemplaza taint)
terraform taint está deprecado desde v0.15.2. Forzar la recreación de un recurso se hace ahora con el flag -replace.
| Método | Estado | Cómo funciona |
|---|---|---|
| terraform taint resource.addr | ⚠️ Deprecado v0.15.2 | Marcaba el recurso; el siguiente apply lo recrea. Sin plan previo visible. |
| terraform apply -replace=resource.addr | ✅ Moderno | Muestra el plan de reemplazo primero (-/+). Más seguro y explícito. |
| terraform plan -replace=resource.addr | ✅ Moderno | Solo muestra qué recrearía, sin aplicar. |
Usa -replace cuando un recurso está en mal estado y necesitas recrearlo sin destruir toda la infraestructura. El plan muestra el símbolo -/+ (destruir y recrear).
Logging y debugging
| Variable | Valor | Efecto |
|---|---|---|
| TF_LOG | TRACE / DEBUG / INFO / WARN / ERROR | Activa logging detallado en stderr |
| TF_LOG_PATH | ruta/al/archivo.log | Guarda logs en archivo en lugar de stderr |
| TF_LOG_CORE | nivel | Logging solo del core de Terraform |
| TF_LOG_PROVIDER | nivel | Logging solo de los providers |
TF_LOG=DEBUG es el nivel más útil para debugging. TF_LOG=TRACE muestra cada llamada a la API del provider — muy verboso pero útil para diagnosticar errores de autenticación o throttling.
Tips para el día del examen
Flujo obligatorio: init → plan → apply. Sin init no hay plan. Sin plan no hay apply correcto.
State locking previene apply concurrentes. Solo disponible en backends remotos, no en local.
State file puede contener secrets en texto claro. Siempre usa remote backend con cifrado en producción.
.terraform.lock.hcl debe commitearse al VCS. terraform.tfstate NUNCA debe commitearse.
Orden de variables: -var CLI > TF_VAR_* > *.auto.tfvars > terraform.tfvars > default.
for_each > count para recursos con identidad. count con índices rompe al insertar/eliminar elementos del medio.
Terraform Registry: registry.terraform.io. Providers: hashicorp/aws. Módulos: org/nombre/provider.
HCP Terraform ≠ workspaces CLI. Son conceptos distintos. HCP workspace = entorno aislado con state, vars y VCS.
sensitive = true oculta en CLI pero el valor SÍ está en el state. ephemeral = true (1.10+) es la única forma de que un valor NUNCA se persista en el state.
terraform taint deprecado (v0.15.2) → usar terraform apply -replace. terraform refresh deprecado (v1.6) → usar terraform plan -refresh-only.
¿Quieres más profundidad?
Esta guía es un resumen rápido. Visita la sección Deep Dive para exploración exhaustiva con casos reales, análisis de costos y decisiones arquitectónicas.
¿Listo para practicar?
Pon a prueba lo que aprendiste con preguntas originales del examen Terraform Associate.
Iniciar simulacro Terraform AssociateSin límite de simulacros con plan Pro
¿Listo para poner a prueba lo aprendido?
Practica Terraform Associate con preguntas originales. Disponible con plan Pro o compra individual — crea tu cuenta para empezar.