Desarrollo local con los servicios de AWS usando localStack

Alexis Calderon
Bancolombia Tech
Published in
4 min readMar 30, 2021

Cuando construimos aplicaciones con AWS, frecuentemente hacemos uso de diferentes servicios para diferentes propósitos: almacenar algún archivo en S3, guardar información en DynamoDB, enviar mensajes a colas SQS, construir funciones lambda, entre otras.

Por eso, para evitar consumir los servicios reales de AWS y debido a que en nuestro ambiente local no podemos conectarnos con las cuentas de desarrollo del banco para algunas pruebas, una muy buena opción es hacer uso de localStack para desarrollar y probar nuestras aplicaciones con implementaciones mock de estos servicios.

LocalStack es un proyecto open source, que provee una forma sencilla de construir aplicaciones cloud directamente desde nuestro localhost, generando un entorno de prueba que proporciona las mismas funcionalidades y API’s que el entorno real de los servicio de AWS.

Para instalar localstack en nuestra máquina de desarrollo, necesitamos:

  • Python (2.x o superior).
  • Pip (instalador de paquetes de python).
  • Tener Docker instalado.
  • AWS-cli (AWS Commnand line interface).

¿Cómo se instala?

Hay dos maneras de hacerlo: usando el gestor de paquetes de Python (pip) o usando Docker con el archivo de Docker compose, el cual puede ser encontrado en el repositorio de localstack. En este artículo explicaremos la primera opción. Para empezar, desde una terminal debemos ejecutamos el siguiente comando:

pip install localstack

Luego, ejecutamos el siguiente comando para iniciar localstack con python:

localstack start

Y se genera una salida en consola como la siguiente:

Desde la versión v0.11.5, todos los servicios son expuestos a través de un solo Edge service, el cual es accedido a través del puerto 4566. Este se puede cambiar haciendo uso de las variables de configuración del servicio: EDGE_PORT.

Para verificar el estado de los servicios podemos hacer uso del endpoint http://localhost:4566/health

Por defecto, el endpoint retorna valores en cache que son determinados durante el inicio y luego podemos refrescar el estado de los servicios agregando el query param reload: http://localhost:4566/health?reload.

Conectando con localstack:

Para interactuar con los servicios de AWS, lo podemos hacer a través del CLI o desde nuestras aplicaciones usando el SDK de AWS.

Tanto el SDK de AWS como el CLI, proveen una opción para sobreescribir la url de la API de AWS. Haremos uso de esta característica para conectarnos a localstack desde nuestro ambiente local.

Con el CLI de AWS podemos usar el siguiente comando:

aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name example-queue

Esto envía la solicitud para crear una cola sqs a la url de localstack especificada en el parametro endpoint-url, en lugar del endpoint real de AWS.

Así, podemos usar un enfoque similar con el SDK:

SqsAsyncClient sqs = SqsAsyncClient.builder()
.endpointOverride(URI.create("http://localhost:4566"))
.region(Region.US_EAST_1)
.build();

Interacción con LocalStack a través del CLI:

Como se mencionó anteriormente, podemos usar el CLI de AWS para interactuar con localstack, pasando información adicional para sobreescribir la url:

aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name example-queue

El comando anterior crea una cola sqs en localstack, retornando como respuesta la url de la cola creada:

{
"QueueUrl": "http://localhost:4566/000000000000/localstack-demo"
}

Para enviar un mensaje a la cola, podemos usar el siguiente comando:

aws --endpoint-url=http://localhost:4566 sqs send-message --queue-url http://localhost:4566/000000000000/localstack-demo --message-body "Example message localstack"

El CLI nos retornará el id del mensaje que hemos enviado:

{
"MD5OfMessageBody": "2b09397f9ff2827d903600a21d1e615e",
"MessageId": "69b9b8ef-dfc7-50bb-75da-98e2c7900aee"
}

Para recuperar los mensajes enviados a la cola, usamos:

aws --endpoint-url=http://localhost:4566 sqs receive-message --queue-url http://localhost:4566/000000000000/localstack-demo

Como respuesta, vemos el mensaje que enviamos anteriormente:

{
"Messages": [
{
"MessageId": "69b9b8ef-dfc7-50bb-75da-98e2c7900aee",
"ReceiptHandle": "iyrxsuvaxtgvbdktpgxwgqwvfrvmsbfykhyixreerwcpfcqmqpzbbfktlsxhpoxkxxfqyarsjbdzcivrizcvgvziylaplyotidsplhygrbqwsfweozjdwvkbxdsxibsxaaxlvagpbnafugiwtokfzticayfvakeftoivxtrpnxeikadxiszisetus",
"MD5OfBody": "2b09397f9ff2827d903600a21d1e615e",
"Body": "Example message localstack",
"Attributes": {
"SenderId": "AIDAIT2UOQQY3AUEKVGXU",
"SentTimestamp": "1610399088249",
"ApproximateReceiveCount": "2",
"ApproximateFirstReceiveTimestamp": "1610399169627"
}
}
]
}

En la documentación de Amazon, se encuentran todos los comandos que podemos usar para interactuar con el servicio de sqs y cualquier otro servicio que necesitemos utilizar.

Conclusión

LocalStack le da a los desarrolladores la posibilidad de probar la integración de manera local con los servicios de AWS y les permite realizar pruebas sin incurrir en gastos en sus cuentas personales.

Hay muchas cosas más que se pueden hacer con localStack. Por eso la finalidad de este artículo era mostrar algunas de las características de la herramienta y descubrir cómo nos puede ayudar para que nuestro proceso de desarrollo sea más fácil y cómodo.

Si quieres conocer más, puedes ingresar al repositorio oficial: https://github.com/localstack/localstack

--

--