GuíasTerraform Associate
Practicar ahora
HashiCorpAsociadoGratis~45 min

Guía completa
Terraform Associate 004

Toca cualquier servicio para ver más detalles y documentación oficial.

D1

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ísticaManual / ConsolaIaC con Terraform
ReproducibilidadDepende del operadorIdéntico en cada ejecución
VersionadoNoGit — historial completo
RevisiónNo hay diffPull Request con terraform plan
ColaboraciónUn operador a la vezMúltiples via VCS + locking
RollbackManual, propenso a erroresgit revert + apply
DocumentaciónImplícitaEl 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

HerramientaTipoCuándo usarla
TerraformDeclarativo · multi-cloudGestión de infraestructura cloud/on-prem. Cualquier proveedor.
AnsibleProcedural · agentlessConfiguración de SO, instalación de software, gestión de estado de servidores.
CloudFormationDeclarativo · solo AWSInfraestructura AWS en equipos que no necesitan multi-cloud.
PulumiDeclarativo · multi-cloudMismo rol que Terraform pero usando lenguajes de programación (Python, TypeScript).
Chef/PuppetProcedural · agenteGestió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.

D2

Flujo de trabajo core

11% del examen

Write → 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

ComandoFunción
terraform fmtFormatea archivos .tf al estilo canónico de HCL. Equivalente a prettier.
terraform validateValida sintaxis y coherencia de la configuración SIN llamar a la API del provider.
terraform apply -replace=addrFuerza la recreación de un recurso específico (reemplaza terraform taint, deprecado desde v0.15.2).
terraform plan -refresh-onlyDetecta drift entre state y realidad sin aplicar cambios de configuración (reemplaza terraform refresh, deprecado desde v1.6).
terraform outputMuestra los outputs definidos en el state actual.
terraform showMuestra el state o plan guardado en formato legible.
terraform graphGenera el grafo de dependencias en formato DOT (visualizable con Graphviz).
terraform force-unlockLibera manualmente un lock de state cuando apply falló a medias.
terraform loginAutentica 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.

D3

Providers y configuración

12% del examen

Arquitectura 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"
}
ConstraintSignificadoEjemplo
= 5.0.0Exactamente esa versión= 5.0.0
!= 5.0.0Cualquiera excepto esa!= 4.0.0
> 5.0Mayor que> 5.0
~> 5.05.x pero no 6.x (patch libre)~> 5.0
~> 5.0.05.0.x pero no 5.1 (micro libre)~> 5.0.4
>= 4.0, < 6.0Rango 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.

TierQuién lo mantieneBadge
OfficialHashiCorphashicorp/aws, hashicorp/azurerm, hashicorp/google
PartnerEmpresa con acuerdo HashiCorpVerificados y soportados por el partner
CommunityComunidad open sourceSin soporte garantizado
D4

Variables, outputs y expresiones

18% del examen

Tipos de valores

Haz clic en cualquier servicio para ver más detalles

Tipos de datos en HCL

TipoEjemploNota
string"us-east-1"Texto unicode
number42 / 3.14Entero o decimal
booltrue / falseBooleano
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
anycualquierTipo dinámico — Terraform infiere

Funciones built-in de HCL

CategoríaFunciones claveEjemplo
Stringformat, join, split, replace, upper, lower, trimspaceformat("Hello %s", var.name)
Colecciónlength, concat, flatten, merge, keys, values, lookuplength(var.subnets)
Numéricamax, min, ceil, floor, absmax(var.min_size, 2)
Encodingjsonencode, jsondecode, base64encode, base64decodejsonencode({ port = 80 })
Filesystemfile, templatefile, pathexpand, abspathfile("./scripts/init.sh")
Date/Timetimestamp, formatdate, timeaddformatdate("YYYY-MM-DD", timestamp())
IP Networkcidrsubnet, cidrhost, cidrnetmaskcidrsubnet("10.0.0.0/8", 8, 2)

Meta-argumentos de recursos

Meta-argumentoFunción
count = NCrea N copias del recurso. Acceso con recurso.nombre[index].
for_each = map/setCrea una instancia por elemento. Acceso con recurso.nombre[key].
depends_on = [...]Dependencia explícita cuando no hay referencia directa.
provider = aliasUsa 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.

D5

Módulos

12% del examen

Estructura 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

SourceEjemploCuá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.

D6

State management

15% del examen

El state de Terraform

Haz clic en cualquier servicio para ver más detalles

Backends remotos

BackendProviderState LockingNota
s3AWSDynamoDB separadoBackend más popular. Requiere tabla DynamoDB para locking.
azurermAzureBlob lease nativoAzure Blob Storage. Locking nativo sin configuración extra.
gcsGoogleNativoGoogle Cloud Storage. Locking nativo.
httpCualquieraOpcionalBackend genérico vía HTTP. Útil para backends custom.
kubernetesK8sNativoState en ConfigMap/Secret de Kubernetes.
cloud (HCP)HCP TerraformNativoRecomendado. Locking + cifrado + historial de versiones.

Comandos de state

ComandoFunción
terraform state listLista todos los recursos en el state
terraform state show addrMuestra atributos detallados de un recurso en el state
terraform state mv src dstRenombra/mueve recurso en el state (sin tocar infraestructura)
terraform state rm addrElimina recurso del state SIN destruirlo en la nube
terraform state pullDescarga y muestra el state remoto como JSON
terraform state pushSube un state local al backend remoto (peligroso — puede sobrescribir)
terraform import addr idImporta recurso existente al state
terraform plan -refresh-onlyDetecta 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.

D7

CLI avanzado y HCP Terraform

14% del examen

HCP Terraform

Haz clic en cualquier servicio para ver más detalles

TierQué incluye
FreeHasta 500 recursos, remote state, remote execution, 1 concurrent run, VCS básico
PlusPolicy as Code (Sentinel/OPA), SSO, audit logs, self-hosted agents
EnterpriseOn-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étodoEstadoCómo funciona
terraform taint resource.addr⚠️ Deprecado v0.15.2Marcaba el recurso; el siguiente apply lo recrea. Sin plan previo visible.
terraform apply -replace=resource.addr✅ ModernoMuestra el plan de reemplazo primero (-/+). Más seguro y explícito.
terraform plan -replace=resource.addr✅ ModernoSolo 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

VariableValorEfecto
TF_LOGTRACE / DEBUG / INFO / WARN / ERRORActiva logging detallado en stderr
TF_LOG_PATHruta/al/archivo.logGuarda logs en archivo en lugar de stderr
TF_LOG_COREnivelLogging solo del core de Terraform
TF_LOG_PROVIDERnivelLogging 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 Associate

Sin 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.

Ver todos los planes →·Ya tengo acceso