Contenidos
Terraform es una herramienta de Infraestructura como Código (IaC): describes en ficheros de texto qué infraestructura quieres (una red, una VM, un bucket, un contenedor) y Terraform calcula qué cambios hacen falta para llegar a ese estado y los aplica de forma reproducible.
Ideas clave (sin complicarse)
- Provider: el “conector” con una plataforma (AWS, Azure, Google Cloud, Docker, etc.).
- Resource: una pieza de infraestructura (un bucket, una red, una instancia, un contenedor).
- Estado (state): Terraform guarda un “mapa” de lo que ha creado para poder comparar lo deseado con lo real.
- Plan / Apply: primero te enseña qué va a cambiar (plan) y luego lo ejecuta (apply).
- Variables / Outputs: para parametrizar y para “devolver” valores útiles (IDs, URLs, nombres).
- Módulos: empaquetas recursos reutilizables.
Flujo típico de trabajo
En una carpeta con tus .tf:
terraform init # descarga providers y prepara el proyecto
terraform fmt # formatea los .tf
terraform validate # valida sintaxis
terraform plan # previsualiza cambios
terraform apply # aplica cambios
terraform destroy # elimina lo creado por ese proyecto
Ejemplo 1 (muy simple): crear un fichero local
Este ejemplo no requiere cloud, sirve para entender el ciclo plan/apply y el concepto de “estado”.
main.tf
terraform {
required_providers {
local = {
source = "hashicorp/local"
version = "~> 2.0"
}
}
}
provider "local" {}
resource "local_file" "saludo" {
filename = "${path.module}/hola.txt"
content = "Hola, Terraform 👋\n"
}
Ejecuta:
terraform init
terraform plan
terraform apply
Resultado: se crea hola.txt y Terraform guarda el estado en terraform.tfstate.
Ejemplo 2: contenedor Docker (fácil para ver “infra” real)
Necesitas Docker instalado y funcionando.
main.tf
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:stable"
}
resource "docker_container" "web" {
name = "web-nginx"
image = docker_image.nginx.image_id
ports {
internal = 80
external = 8080
}
}
output "url" {
value = "http://localhost:8080"
}
Ejecuta:
terraform init
terraform apply
Luego abre la URL del output. Para borrarlo:
terraform destroy
Ejemplo 3: variables y outputs (para no “hardcodear”)
variables.tf
variable "nombre" {
type = string
description = "Nombre del recurso (ejemplo)"
default = "hola"
}
main.tf (usando esa variable)
resource "local_file" "saludo" {
filename = "${path.module}/${var.nombre}.txt"
content = "Fichero creado con variable.\n"
}
output "ruta_fichero" {
value = local_file.saludo.filename
}
Cambiar el valor al vuelo:
terraform apply -var="nombre=prueba"

