LocalStack, Amazon Web Services en tu local
Estuve en pocos minutos, levantando la mayoría de los servicios más usados de AWS en mi local, usando Docker y un mini Amazon: LocalStack.
Hoy, AWS ha logrado dividir gran parte de las tareas de IT en pequeños servicios públicos e independientes. Podemos levantar maquinas virtuales, funciones Lambda, servicios de almacenamiento, servicios de BigData, computo, bases de datos, IA... Realmente es una gran lista de servicios.
Estas son herramientas útiles para agilizar el despliegue, administración y mantenimiento de nuestros servicios, pero también ha creado una falencia en la fase de desarrollo: No siempre es fácil replicar el comportamiento de los servicios Cloud en nuestro equipo.
Necesitamos garantizar que nuestra etapa de desarrollo sea igual de ágil que la administración en la Nube.
Cuando creamos servicios que serán desplegados en las nubes públicas, queremos simular lo más cerca posible el comportamiento que tendrán los servicios.
El Retry o Visibilidad de un mensaje en una SQS o habilitar streams en un dynamoDB y más casos que solo podemos conocer interactuando con los servicios. Sin embargo, interactuar directamente con AWS puede generar costos y pocos queremos esto 🙂.
💻 LocalStack
LocalStack es un proyecto open-source que se esfuerza por crear las implementaciones locales de distintos servicios de la Nube, enfocándose principalmente en AWS.
LocalStack nos permite conectarnos a él de la misma forma como lo hacemos con Amazon en nuestro equipo, usando su Command Line interface. Solo que, en lugar de dirigirnos a AWS lo hacemos directo a nuestro localhost.
Por mencionar un ejemplo, el comando aws sqs --create-queue
nos servirá exactamente igual a como si habláramos con AWS. Nos entregará las mismas respuestas y creará el mismo comportamiento, solo que está vez será tu equipo quien ejecute TODO.
¿Qué servicios hacen parte de LocalStack?
Si bien la lista de servicios que se han agregados a localstack crece día a día, hoy podemos contar con servicios de Notificaciones(SNS), Computo (Lambda, Step Functions), Base de datos (DynamoDB), Monitoreo (CloudWatch), Manejo de Emails (SES), BigData (Athena, RedShift, Kinesis) y estos son solo algunos de los ejemplos.
Revisa todos los servicios disponibles en la documentación de LocalStack https://github.com/localstack/localstack
¿Cómo usarlos?
Hay varias formas de conectarse a los servicios de AWS en la nube, una de ellas es la Línea de comandos, será nuestra forma de comunicarnos con los servicio de LocalStack en nuestro equipo.
Puedes instalar LocalStack usando Python con PIP o Instanciar una imagen de Localstack con Docker. Para mi, la forma más fácil es usar Docker para levantar el servicio y es así como te mostraré en los ejemplos.
Para iniciar, tengamos instalado en nuestro equipo lo siguiente:
- Command Line Interface (CLI) de AWS
- Docker
- Docker-compose
📁Docker Compose File
Usaremos docker-compose para levantar fácilmente nuestros servicios ejecutando el .yml a continuación con $ docker-compose up --build
.
Nota: en las variables de entorno, agregamos los servicios queremos que sean inicializados en tu equipo, separados por coma.
El ejecutar el docker-compose descargará automáticamente la imagen desde Docker-Hub, la instalará y una vez lista, te entregará acceso a los puertos del contenedor en tu Red. Con esto podremos comunicarnos para crear los servicios.
Nos falta poco para crear nuestro primer servicio ejecutando LocalStack. Por último necesitamos configurar nuestro AWS CLI para que use nuevas credenciales.
Usando
aws configure
agregaremosAPI_KEY=test & SECRET_KEY=test
. Para la región puedes usarus-east-1
.
🎉Let’s do it!
Ahora sí, empecemos a crear servicios en LocalStack. Usaremos la misma app de CLI de amazon pero estableciéndole la ruta a donde se comunicará.
aws --endpoint http://localhost:4566
El endpoint por defecto es AWS, esta vez lo será un puerto de nuestro equipo.
Creando una SQS y enviando un mensaje
Puedes encontrar más información para interactuar con la CLI de AWS en su documentación: https://docs.aws.amazon.com/cli/latest/reference
// Comando para crear una SQS$ aws --endpoint http://localhost:4566 sqs create-queue --queue-name prueba-sqs
La respuesta que nos entrega es la URL de la nueva SQS tal como si la creáramos en la nube de Amazon, pero esta vez está apuntando a tu localhost en el puerto 4566.
Sigamos, enviemos un mensaje!
aws --endpoint http://localhost:4566 sqs send-message \
--message-body='{"foo": "bar"}'\
--queue-url=http://localhost:4566/000000000000/prueba-sqs
Usando \
puedes hacer saltos de línea en tu consola.
Los argumentos que le enviamos a aws sqs send-message
son:
- queue-url: Enviamos la URL de la SQS que creamos en el paso anterior
- message-body: Esta vez enviaremos un JSON como un string
Leyendo los mensajes de la queue en LocalStack
Ahora, deberíamos poder revisar los mensajes que están siendo guardados en la SQS que se ejecuta localmente:
aws --endpoint http://localhost:4566 sqs receive-message \
--queue-url=http://localhost:4566/000000000000/prueba-sqs
y así, solo necesitas ejecutar los comandos de AWS CLI que ya conoces para comunicarte con los servicios de Amazon, solo que esta vez ejecutándose en tu pc.
Gracias por leer este post. Hasta la próxima 👋🏼