LocalStack, una alternativa a AWS para desarrollo local

The Amazon Web Services (AWS) office at CityCentre Five, 825 Town and Country Lane, Houston, Texas.

Amazon Web Services es uno de los proveedores de servicios en la nube más usado por las empresas, y por lo tanto, su dominio es bastante demandado en los desarrolladores.

Sin embargo, aunque AWS ofrece una capa gratuita con ciertos servicios disponibles, se requiere de un registro previo con el respectivo “billing” asociado. Esto no está siempre al alcance de todos, sobre todo en los países con menos desarrollo. La buena noticia es que puedes aprender a trabajar con algunos de los servicios más demandados de AWS sin tener que contar con acceso a internet, hoy presentamos LocalStack.

¿Qué es localstack?

Específicamente para mí, que vengo de un país con poco acceso a internet representó la posibilidad de poder aprender una tecnología inalcanzable en aquel entonces.

Los creadores definen a localstack es su página de GitHub como:

A fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline! LocalStack provides an easy-to-use test/mocking framework for developing Cloud applications.

Localstack Project

LocalStack provee dos versiones, una gratuita y una pro. La gratuita provee libre de costo los siguientes servicios de AWS que puedes ejecutar de forma local en tu computadora, y usarla para el desarrollo de aplicaciones.

  • ACM
  • API Gateway
  • CloudFormation
  • CloudWatch
  • CloudWatch Logs
  • DynamoDB
  • DynamoDB Streams
  • EC2
  • Elasticsearch Service
  • EventBridge (CloudWatch Events)
  • Firehose
  • IAM
  • Kinesis
  • KMS
  • Lambda
  • Redshift
  • Route53
  • S3
  • SecretsManager
  • SES
  • SNS
  • SQS
  • SSM
  • StepFunctions
  • STS

Instalación de localstack / SQS

El proceso de instalación de localstack puede realizarse con docker, pueden instalarse todos los servicios o algunos de ellos. En dependencia del servicio a emplear, te recomiendo lo pongas operativo.

En lo particular, me gusta solo disponibilizar los servicios que voy a usar, por ejemplo en el siguiente archivo docker-compose.yml vamos a poner operativo a SQS.

 version: '3'
services:
    sqs:
        image: localstack/localstack
        ports:
        - "4576:4576"
        environment:
        - SERVICES=sqs
        - DOCKER_HOST=unix:///var/run/docker.sock
        volumes:
        - "${TMPDIR:-/tmp/localstack}:/tmp/localstack"

Aunque la receta es bastante clara, es importante resaltar dos elementos:

  • En ports exponemos el puerto de los servicios que estamos haciendo referencia en services, en este caso 4576 que es el puerto estándar de SQS.
  • En services, hacemos referencia a los servicios dentro del stack de localstack/aws que queremos se pongan disponibles.

Luego de guardar la receta anterior en un fichero de nombre docker-compose.yml, para poner el servicio SQS en ejecución nos movemos en la terminal hasta el directorio que contiene el fichero .YML y ejecutamos el comando:

docker-compose up -d

La terminal debe iniciar el proceso de descarga de la imagen de localstack y posteriormente la pondrá en ejecución:

Creating network "sqs_default" with the default driver
Pulling sqs (localstack/localstack:)...
latest: Pulling from localstack/localstack
.....
0974748c771a: Downloading [=>
0974748c771a: Downloading [=>
0974748c771a: Downloading [=>
 0974748c771a: Downloading [=>
 0974748c771a: Downloading [=>
 0974748c771a: Pull complete
Creating sqs_sqs_1_f8f03d85d42a ... done

Para verificar si SQS está disponible podemos verificar que el puerto 4576 esté disponible, para ello podemos ejecutar el comando:

nc -zv 127.0.0.1 4576

Si se muestra la siguiente salida entonces ha sido satisfactorio:

Connection to 127.0.0.1 4576 port [tcp/*] succeeded!

También puedes hacer uso de Portainer para ver que esté en ejecución. En este artículo te muestro como instalar y poner operativo a Portainer.

SQS en ejecución, visualizado en Portainer

Espero te sea útil este artículo, en próximos artículos estaremos viendo como usar SQS con Postman para enviar mensajes a la una cola.