Terraform y LocalStack: Tu Nube AWS en Local ¡Gratis y Sin Dolores de Cabeza! (Guía 2025)

15 de abril de 202513 min de lectura
Terraform y LocalStack: Tu Nube AWS en Local ¡Gratis y Sin Dolores de Cabeza! (Guía 2025)

¿Cansado de gestionar manually tu infra AWS local o de esperar a que se aprovisionen recursos en la nube real para probar? Descubre cómo Terraform y LocalStack se convierten en tu dúo dinámico para definir y levantar tu entorno AWS localmente, rápido y sin coste. ¡Ideal para principiantes e intermedios que quieren agilizar su desarrollo!

¡Basta ya de sufrir con la infra AWS para desarrollo!

Seamos sinceros, ¿quién no ha perdido horas peleándose con la consola de AWS o esperando a que un recurso termine de crearse solo para hacer una prueba rápida? O peor aún, ¡recibir una factura inesperada por olvidar algo encendido! Gestionar la infraestructura de AWS para desarrollo y testing puede ser un auténtico quebradero de cabeza: es lento, a veces complejo y, sí, puede costar dinero.

Pero, ¿y si te dijera que hay una forma de tener tu propio entorno AWS en tu máquina, completamente funcional, rápido y... gratis? ¡Pues existe! Y la clave está en combinar dos herramientas brutales: Terraform y LocalStack.

Recuerdo perfectamente una tarde de viernes intentando configurar un bucket S3 con una política específica para una prueba súper simple. Entre la consola, los permisos IAM y los nervios por no romper nada en el entorno real... ¡casi tiro la toalla! Desde que descubrí cómo usar Terraform con LocalStack, esos días quedaron atrás. ¡Es como tener un mini-AWS personal en mi portátil!

En esta guía, vamos a ver paso a paso cómo puedes montar este chiringuito tú mismo. Aprenderás a:

  • Configurar Terraform para que "hable" con tu LocalStack local.
  • Definir y crear recursos AWS (empezaremos con un S3, ¡un clásico!) usando código.
  • Verificar que todo funciona como la seda.
  • Evitar los errores más típicos (¡que yo ya cometí por ti!).

Así que, prepárate para decirle adiós a las esperas y a las facturas sorpresa. ¡Vamos a dominar tu nube AWS local con Terraform y LocalStack!

¿Qué Necesitas Antes de Empezar? (Prerrequisitos)

Vale, antes de meternos en harina, asegúrate de tener estas cosillas listas en tu máquina. Son como los ingredientes antes de cocinar, ¡sin ellos no sale el plato!

  • Terraform Instalado: Obviamente, necesitamos Terraform. Si aún no lo tienes, no te preocupes, en la siguiente sección te doy una chuleta rápida para instalarlo. Si ya eres un pro de Terraform, puedes saltarte ese paso (¡pero asegúrate de tener una versión reciente!). Puedes verificarlo abriendo una terminal y escribiendo terraform --version.
  • LocalStack Funcionando: Aquí es donde ocurre la magia local. Necesitas tener LocalStack corriendo. Si eres nuevo en esto, te recomiendo muchísimo que le eches un ojo a nuestra guía completa sobre LocalStack. Ahí te explicamos qué es y cómo ponerlo en marcha, normalmente usando Docker. ¡Es el compañero perfecto para Terraform en local!
  • AWS CLI (Opcional pero ¡Muy Recomendado!): Aunque Terraform hará el trabajo pesado, tener la AWS Command Line Interface instalada es súper útil para verificar rápidamente que los recursos se han creado en LocalStack. Es como tener una segunda opinión para asegurarte de que todo va bien.

¿Todo listo? ¡Genial! Entonces, si necesitas instalar Terraform, sigue leyendo. Si ya lo tienes, ¡puedes saltar a la sección de configuración!

Instalando Terraform (Si Aún No Lo Tienes)

Si eres nuevo en el mundo de Terraform o simplemente no lo tenías instalado, ¡no hay problema! Instalarlo es bastante sencillo. Aquí te dejo unas recetas rápidas dependiendo de tu sistema operativo. Si ya lo tienes, ¡felicidades! Puedes saltar directamente a Configurando Terraform para Hablar con LocalStack.

En Windows (¡Con Chocolatey al rescate!):

Si estás en Windows, mi forma favorita y la más rápida es usar Chocolatey, el gestor de paquetes. Si no lo conoces, échale un vistazo a nuestra guía sobre Chocolatey, ¡te cambiará la vida!

Una vez tengas Chocolatey, abre una terminal (como PowerShell o CMD) con permisos de administrador y lanza:

choco install terraform

¡Listo! Chocolatey se encarga de todo. Magia, ¿verdad?

En Linux (Usando el gestor de paquetes):

La cosa varía un poco según tu distribución, pero generalmente usarás tu gestor de paquetes habitual. HashiCorp (la empresa detrás de Terraform) tiene instrucciones detalladas para varias distribuciones, pero aquí un ejemplo común para sistemas basados en Debian/Ubuntu:

# (Asegúrate de seguir los pasos de HashiCorp para añadir su repositorio GPG y apt)
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

Para otras distribuciones como Fedora, CentOS, etc., consulta la guía oficial de HashiCorp, ¡está muy bien explicada!

Verificación Final:

Sea cual sea el método, abre una nueva terminal y ejecuta:

terraform --version

Deberías ver la versión de Terraform que acabas de instalar. Si aparece, ¡estás listo para el siguiente paso! Si no, revisa la instalación o la configuración del PATH de tu sistema (aunque con estos métodos, normalmente se configura solo).

Configurando Terraform para Hablar con LocalStack

Aquí viene el truco del almendruco, ¡la parte que hace que todo esto funcione! Tenemos que decirle a Terraform: "Oye, colega, olvídate de ir a los servidores de AWS de verdad por ahora. Todo lo que te pida de AWS, pídeselo a ese amigo que tenemos corriendo en local, LocalStack".

¿Cómo hacemos esto? Editando nuestro archivo de configuración de Terraform (normalmente un main.tf o similar) para ajustar el provider de AWS.

Imagina que tienes un archivo main.tf (si no lo tienes, créalo vacío por ahora, ¡enseguida lo llenamos!). Dentro, necesitarás algo parecido a esto:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0" # O la versión que prefieras/necesites
    }
  }
}
 
# ¡Aquí está la magia!
provider "aws" {
  region                      = "us-east-1" # Puedes usar cualquier región válida
  access_key                  = "test" # LocalStack usa 'test' por defecto
  secret_key                  = "test" # LocalStack usa 'test' por defecto
  skip_credentials_validation = true
  skip_metadata_api_check     = true
  skip_requesting_account_id  = true
 
  # ¡¡ESTA ES LA LÍNEA CLAVE!!
  # Le decimos a Terraform dónde encontrar los servicios de AWS en LocalStack
  endpoints_override {
    s3             = "http://localhost:4566"
    # lambda         = "http://localhost:4566" # Añade aquí otros servicios que uses
    # dynamodb       = "http://localhost:4566"
    # ... y así sucesivamente
  }
}
 
# Aquí irán las definiciones de tus recursos (lo vemos en el siguiente paso)
# resource "aws_s3_bucket" "mi_bucket_local" { ... }

Desgranando lo importante:

  • provider "aws" { ... }: Aquí configuramos cómo Terraform interactúa con AWS.
  • region, access_key, secret_key: Para LocalStack, puedes usar us-east-1 como región y test para las claves. ¡Fácil!
  • skip_...: Estas opciones básicamente le dicen a Terraform "relájate, estamos en local, no te pongas quisquilloso con las validaciones de credenciales y metadatos de AWS real".
  • endpoints_override { ... }: ¡El corazón del asunto! Aquí mapeamos cada servicio de AWS que vayamos a usar (S3, Lambda, DynamoDB, etc.) a la URL donde LocalStack lo está escuchando (normalmente http://localhost:4566). Si solo vas a usar S3, solo necesitas esa línea. Si usas más, añádelos.

Mi confesión de novato: Las primeras veces que intenté esto, ¡se me olvidaba por completo el bloque endpoints_override! Me volvía loco porque Terraform intentaba conectar con AWS de verdad y, claro, fallaba o (peor) creaba cosas donde no debía. ¡Que no te pase a ti! Revisa bien esa parte.

Con esta configuración, Terraform ya sabe que tiene que llamar a la puerta de LocalStack. ¡Ahora sí estamos listos para crear cosas!

¡Manos a la Obra! Creando un Bucket S3 con Terraform y LocalStack

¡Llegó el momento de la verdad! Vamos a usar Terraform para pedirle a LocalStack que nos cree un bucket S3. Verás que, una vez configurado el provider, el resto es casi igual que si lo hicieras contra AWS real, ¡pero en tu máquina!

  1. Define el Recurso en main.tf: Abre tu archivo main.tf (el mismo donde configuraste el provider) y añade esto al final:

    resource "aws_s3_bucket" "mi_bucket_local" {
      bucket = "mi-primer-bucket-terraform-localstack"
     
      # Puedes añadir más configuraciones aquí, como etiquetas, versionado, etc.
      tags = {
        Name        = "MiBucketLocal"
        Environment = "Desarrollo"
        ManagedBy   = "Terraform"
      }
    }
    • resource "aws_s3_bucket" "mi_bucket_local": Le decimos a Terraform: "Quiero un recurso del tipo aws_s3_bucket (un bucket S3 de AWS) y llámalo mi_bucket_local dentro de mi código Terraform". Este nombre (mi_bucket_local) es solo para que Terraform lo identifique, no es el nombre real del bucket.
    • bucket = "...": ¡Este SÍ es el nombre real que tendrá el bucket en LocalStack (y en AWS si lo aplicaras allí)! Asegúrate de que sea un nombre único.
    • tags: ¡Siempre es buena idea etiquetar tus recursos!
  2. Inicializa Terraform (terraform init): Abre tu terminal en la carpeta donde tienes el main.tf y ejecuta:

    terraform init

    Este comando es como el "arranque". Terraform lee tu configuración, ve que necesitas el provider de AWS y lo descarga si no lo tenía. Solo necesitas hacerlo la primera vez o si cambias los providers.

  3. Planifica los Cambios (terraform plan): Ahora, veamos qué va a hacer Terraform antes de que lo haga:

    terraform plan

    Terraform comparará lo que tienes definido en tu main.tf con el "estado" actual (que ahora mismo está vacío) y te dirá exactamente qué recursos va a crear, modificar o destruir. En este caso, te mostrará que va a crear (+) un aws_s3_bucket. ¡Es súper útil para evitar sorpresas!

  4. Aplica los Cambios (terraform apply): Si el plan te parece correcto (¡y debería!), dale caña:

    terraform apply

    Te volverá a mostrar el plan y te pedirá confirmación. Escribe yes y pulsa Enter. Terraform se conectará a LocalStack (gracias a nuestra configuración del provider) y ¡creará el bucket S3!

    Deberías ver un mensaje como Apply complete! Resources: 1 added, 0 changed, 0 destroyed. ¡Éxito!

  5. ¡Verifícalo! (Con AWS CLI): Ahora, usemos la AWS CLI para asegurarnos de que el bucket existe en nuestro LocalStack. Abre la terminal y lanza:

    aws --endpoint-url=http://localhost:4566 s3 ls
    • ¡OJO! El --endpoint-url=http://localhost:4566 es crucial. Le dice a la AWS CLI que hable con LocalStack, no con AWS real.

    Si todo ha ido bien, deberías ver tu mi-primer-bucket-terraform-localstack listado. ¡Ahí lo tienes! Tu primer recurso AWS creado localmente con Terraform.

¿A que no era tan difícil? ¡Acabas de dar un gran paso para gestionar tu infraestructura como un profesional!

Errores Comunes y Cómo Solucionarlos (Modo Detective)

Vale, todo muy bonito hasta que terraform apply te escupe un error rojo y te quedas con cara de póker. ¡Que no cunda el pánico! Es súper habitual, sobre todo al principio. Aquí te dejo algunos de los "sospechosos habituales" y cómo ponerte el sombrero de detective para cazarlos:

  1. Error: Connection refused o Could not connect to the endpoint URL

    • El Culpable: ¡El clásico! Lo más probable es que:
      • LocalStack no esté corriendo: ¿Te aseguraste de levantarlo (con localstack start o docker-compose up) antes de lanzar Terraform?
      • El endpoint_override es incorrecto: Revisa al milímetro la URL en tu provider "aws". ¿Pusiste http://localhost:4566 (o el puerto que use tu LocalStack)? Un simple typo aquí (httpS en vez de http, un puerto equivocado) y ¡zas! error.
      • El servicio no está mapeado: ¿Estás intentando crear un recurso (ej: una Lambda) pero no añadiste lambda = "http://localhost:4566" dentro de endpoints_override? Terraform no sabrá a dónde ir.
    • Modo Detective:
      • Verifica que LocalStack está vivo y coleando (un docker ps ayuda).
      • Revisa tu main.tf buscando typos en la URL del endpoint.
      • Asegúrate de que el servicio específico está en endpoints_override.
  2. Error: InvalidAccessKeyId o SignatureDoesNotMatch

    • El Culpable: Aunque pusimos skip_credentials_validation = true, a veces algo se lía con las credenciales, especialmente si tienes otras variables de entorno de AWS configuradas globalmente.
    • Modo Detective:
      • Asegúrate de tener access_key = "test" y secret_key = "test" en tu provider "aws".
      • Comprueba si tienes variables de entorno como AWS_ACCESS_KEY_ID o AWS_SECRET_ACCESS_KEY definidas en tu terminal que puedan estar interfiriendo. Intenta quitarlas temporalmente (unset VARIABLE en Linux/Mac, $env:VARIABLE='' en PowerShell) y prueba de nuevo.
      • Verifica que skip_credentials_validation = true esté presente.
  3. Error: El recurso aws_algo ya existe

    • El Culpable: Intentaste aplicar (terraform apply) algo que ya creaste antes, quizás en una ejecución anterior o manualmente con la AWS CLI.
    • Modo Detective:
      • ¡Terraform tiene memoria! Gestiona el estado de lo que ha creado en un archivo terraform.tfstate. Si el recurso ya está en ese estado (o si realmente existe en LocalStack con el mismo nombre), Terraform te avisará.
      • Puedes usar terraform plan para ver si detecta el recurso existente.
      • Si quieres que Terraform "adopte" un recurso que ya existe en LocalStack pero no está en su estado, puedes usar terraform import. ¡Aunque esto es un poco más avanzado!
      • O simplemente, ¡cambia el nombre en tu main.tf si no te importa crear uno nuevo!
  4. Consejos Rápidos de Debugging General:

    • Lee el Mensaje de Error: Suena obvio, ¡pero a veces lo pasamos por alto! Terraform suele dar pistas bastante buenas sobre qué ha ido mal.
    • Aumenta el Log: Puedes obtener más detalles ejecutando Terraform con una variable de entorno: TF_LOG=DEBUG terraform apply. ¡Saldrá un montón de información, pero puede ser útil para ver exactamente qué está fallando en la comunicación!
    • Verifica con AWS CLI: Siempre ten a mano el aws --endpoint-url=http://localhost:4566 s3 ls (o el comando para el servicio que estés usando) para ver el estado real en LocalStack.

¡No te frustres si te encuentras errores! Son parte del aprendizaje. Con un poco de paciencia y estos trucos, ¡te convertirás en un crack solucionándolos!

¿Y Ahora Qué? Próximos Pasos

¡Felicidades! Ya has montado tu entorno AWS local con Terraform y LocalStack y has creado tu primer recurso. ¡Esto es solo el principio! Ahora que tienes la base, el cielo (o mejor dicho, tu máquina local) es el límite. Aquí te dejo algunas ideas para que sigas explorando y te conviertas en un maestro Jedi de la infraestructura local:

  1. Prueba Otros Servicios AWS: ¡No te quedes solo con S3! LocalStack soporta una cantidad enorme de servicios AWS.

    • ¿Qué tal crear una función Lambda simple? Define el recurso aws_lambda_function, empaqueta un código básico y ¡lánzala localmente!
    • ¿Necesitas una base de datos NoSQL? Prueba a definir una tabla DynamoDB con aws_dynamodb_table.
    • ¿Una cola SQS? ¿Un tema SNS? ¡Adelante! Solo recuerda añadir el endpoint_override correspondiente en tu provider.
    • Mi recomendación: Empieza poco a poco. Añade un servicio, hazlo funcionar, y luego pasa al siguiente. ¡Así se aprende mejor!
  2. Organiza tu Código con Módulos: A medida que tu infraestructura crece, tener todo en un solo main.tf se vuelve un caos. ¡Es el momento de descubrir los Módulos de Terraform! Te permiten encapsular conjuntos de recursos relacionados (como una base de datos con sus reglas de seguridad) y reutilizarlos. Es un cambio de juego para mantener el código limpio y manejable.

  3. Experimenta con Variables y Outputs: Haz tu código más flexible usando Variables de Entrada (para cosas como nombres de entornos o tamaños de instancias) y Valores de Salida (para obtener información útil después de aplicar, como el ARN de un recurso creado).

  4. Integra con tu Aplicación: Ahora que puedes levantar tu infra localmente, úsalo para probar tu aplicación conectándose a estos servicios locales. Configura tu app para que apunte a los endpoints de LocalStack (http://localhost:4566) en lugar de a los de AWS real durante el desarrollo.

  5. Destruye y Recrea (terraform destroy): Una de las magias de IaC es poder destruir todo lo que creaste con un solo comando: terraform destroy. ¡Pruébalo! Es genial para asegurarte de que puedes recrear tu entorno desde cero de forma fiable (¡y para limpiar tu LocalStack!).

Lo más importante es: ¡No tengas miedo de experimentar! Estás en un entorno local seguro. Rompe cosas, arréglalas, prueba configuraciones raras. Así es como realmente se aprende. ¡Diviértete construyendo tu propia nube!

Conclusión: ¡Tu Desarrollo AWS Local Despega!

¡Y eso es todo, amigos! Si has llegado hasta aquí, ya tienes las herramientas y el conocimiento para decirle adiós a muchos de los dolores de cabeza del desarrollo tradicional con AWS. Combinar Terraform para definir tu infraestructura como código y LocalStack para emular los servicios de AWS en tu propia máquina es, sinceramente, un cambio radical.

¿Los beneficios?

  • Rapidez: Olvídate de esperar minutos por recursos. ¡Todo se crea localmente en segundos!
  • Ahorro: ¡Cero costes! Pruebas todo lo que quieras sin miedo a la factura de AWS.
  • Consistencia: Defines tu infra una vez con Terraform y la levantas igual siempre, en local o (con mínimos cambios) en la nube real.
  • Desarrollo Offline: ¿Sin conexión? ¡No hay problema! LocalStack funciona sin internet.
  • Menos Errores: Pruebas en un entorno seguro antes de tocar la producción.

Quizás al principio parezca un paso extra configurar Terraform y LocalStack, pero créeme, el tiempo y los disgustos que te ahorras a medio y largo plazo hacen que valga totalmente la pena. Es una de esas inversiones iniciales que te dan superpoderes después.

Espero que esta guía te haya sido útil y te anime a adoptar esta forma de trabajo. Ahora te toca a ti:

¿Ya usabas Terraform o LocalStack? ¿Qué te ha parecido esta combinación? ¿Tienes algún truco o consejo extra que compartir? ¿Alguna duda o problema que te hayas encontrado?

¡Me encantaría leer tus experiencias y comentarios aquí abajo! 👇

Compartir este artículo

Última actualización: 15 de abril de 2025

Si te ha gustado este artículo, no dudes en compartirlo con tus colegas o dejar un comentario.