Desarrolla para la nube estando sin conexión.

  • 956 - palabras
  • Publicado por Ivan Jaimes
  • 10 min

Probar AWS SQS localmente

Si se ha usado SQS, es común conectarse a la consola de administración de AWS y configurar el envío de mensajes, sin embargo, no todo es color de rosa. Cuando se tiene que viajar o trabajar en lugares donde la conexión no es muy buena la interacción con la nube puede ser muy molesta. Para estos casos y sobre todo para configurar la integración continua donde se necesita que constantemente se reinicie el entorno para validar que todo funciona como se espera, se hace uso de docker con las imágenes de elasticmq (si se desarrolla alguna aplicación con Java posiblemente esta sea la mejor opción) o localstack.

En lo personal me agrada más localstack ya que cuenta con su propia herramienta de interacción con los servicios y en caso de requerir soporte puedes actualizar a la versión PRO. Para más información puedes consultar su sitio web (y no me pagan por hacer publicidad).

Configurando el entorno

Partiendo de un escenario donde se desea desarrollar un sistema con Elixir e interactuar con el servicio de SQS de AWS, se puede practicar el envío y recepción de mensajes. Lo primero es configurar el entorno para que al ejecutar pruebas unitarias se valide que realmente el sistema se comporta como es deseado.

En este caso la integración está pensada con docker-compose, primero se genera el archivo docker-compose.yml con lo siguiente:

  • Si se quiere usar elasticmq:

    version: "3" services: elasticmq: image: softwaremill/elasticmq-native container_name: sqs_elasticmq ports: - 9324:9324 - 9325:9325
  • Y lo siguiente si se quiere usar localstack

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

En el caso de elasticmq se habilita el servicio de SQS usando la variable de entorno SERVICES=sqs, lo que hace esta imagen muy útil para usar en la integración continua ya que la imagen usa menos espacio y además cuenta con una interfaz sencilla. La interfaz de usuario proporciona información en tiempo real sobre el estado de los mensajes y los atributos de la cola. Por defecto se puede consultar en el puerto 9325.

Para localstack se puede consultar los ejemplos de configuración para la integración continua en la página oficial. Si se desea una interfaz gráfica existe la posibilidad de usar DynamoDB Admin Web UI o Commandeer desktop app que es una herramienta de paga pero se ve muy completa. Un punto importante es la asignación del puerto, ya que la herramienta de línea de comandos usará por defecto este puerto y nos ahorra tiempo el evitar poner la url.

Después de esto se puede ejecutar docker-compose para descargar las imágenes y levantar los servicios:

$ docker-compose up

Ahora se puede validar que el servicio está activo con netcat:

$ nc -zv 127.0.0.1 4576 Connection to 127.0.0.1 4576 port [tcp/*] succeeded!

Hasta este punto solamente se ha iniciado el servicio y está disponible para interactuar con él en un entorno local, el siguiente paso es crear una cola para enviar y recibir mensajes.

Un script de inicialización de LocalStack

Se puede crear un script para automatizar el proceso de creación de colas, se puede eligir cualquier nombre pero me parece que es descriptivo el uso de init.d/ como nombre del directorio que contendrá los scripts de inicialización:

$ mkdir init.d $ vim init.d/01_init.sh

Dentro del archivo se deben agregar las instrucciones para la creación de las colas:

#!/usr/bin/env bash set -o errexit set -o nounset awslocal sqs create-queue --queue-name="my-local-queue"

Hay que recordar que si se tiene el servicio inciiado, debemos detener el servicio e iniciarlo nuevamente:

$ docker-compose stop .. $ docker-compose up # alternativa $ docker-compose restart

Después de reiniciar el servicio, para validar que se creó correctamente la cola se puede listar con el comando:

$ awslocal sqs list-queues { "QueueUrls": [ "http://localhost:4566/000000000000/my-local-queue" ] }

Usando la herramienta de línea de comandos (CLI) de localstack se puede ingresar a la imagen mediante ssh:

$ localstack ssh

Ahora se puede probar el envío de mensajes usando awslocal:

$ awslocal sqs send-message \ --queue-url http://localhost:4566/000000000000/my-local-queue \ --message-body '{ "hello":"world" }' { "MD5OfMessageBody": "c1185483306a745058dd47eb96eda313", "MessageId": "3bea6f1a-39f8-43a9-b097-cc16a2c0f10b" }

Para leer el mensaje de la cola se puede ejecutar el siguiente comando:

$ awslocal sqs receive-message \ --queue-url http://localhost:4566/000000000000/my-local-queue { "Messages": [ { "MessageId": "3bea6f1a-39f8-43a9-b097-cc16a2c0f10b", "ReceiptHandle": "OTY3Mjg2MDUtM2VlYS00MjZiLTg2ZGUtMmU4MTRhNzliM2JlIGFybjphd3M6c3FzOnVzLXdlc3QtMjowMDAwMDAwMDAwMDA6YS1jbWQtcXVldWUgM2JlYTZmMWEtMzlmOC00M2E5LWIwOTctY2MxNmEyYzBmMTBiIDE2NjA3MDEwMTQuNjUwMTA0OA==", "MD5OfBody": "df69267381a60e476252c989db9ac8ad", "Body": "{ \"hello\":\"world\" }" } ] }

Si se desea eliminar un mensaje:

awslocal sqs delete-message \ --queue-url http://localhost:4576/123456789012/a-cmd-queue \ --receipt-handle 'OTY3Mjg2MDUtM2VlYS00MjZiLTg2ZGUtMmU4MTRhNzliM2JlIGFybjphd3M6c3FzOnVzLXdlc3QtMjowMDAwMDAwMDAwMDA6YS1jbWQtcXVldWUgM2JlYTZmMWEtMzlmOC00M2E5LWIwOTctY2MxNmEyYzBmMTBiIDE2NjA3MDEwMTQuNjUwMTA0OA=='

Por último, es posible purgar la cola usando el siguiente comando:

$ awslocal sqs purge-queue \ --queue-url http://localhost:4566/000000000000/my-local-queue

Para saber más: