DEV Community

Cover image for Rodando SQS localmente com LocalStack
Felipe Lima
Felipe Lima

Posted on

Rodando SQS localmente com LocalStack

O LocalStack é um emulador de serviços na nuvem que permite que serviços AWS sejam testados localmente, sem que seja necessário se conectar a uma conta remota.


O que iremos fazer:

Vou documentar aqui como executei o LocalStack pela primeira vez.
Os passos que segui foram:

  • iniciar um container com o LocalStack usado docker-compose
  • configurar o aws cli
  • criar e consumir uma fila SQS

Vou utilizar o docker-compose, conforme a documentação disponível na página https://docs.localstack.cloud/get-started/#docker-compose.


Requisitos:


Iniciando o container

Iremos utilizar o arquivo disponibilizado na própria página do LocalStack:

version: "3.8"

services:
  localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}"
    image: localstack/localstack
    ports:
      - "127.0.0.1:4566:4566" # LocalStack Gateway
      - "127.0.0.1:4510-4559:4510-4559" # external services port range
      - "127.0.0.1:53:53" # DNS config (only required for Pro)
      - "127.0.0.1:53:53/udp" # DNS config (only required for Pro)
      - "127.0.0.1:443:443" # LocalStack HTTPS Gateway (only required for Pro)
    environment:
      - DEBUG=${DEBUG-}
      - PERSISTENCE=${PERSISTENCE-}
      - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR-}
      # - LOCALSTACK_API_KEY=${LOCALSTACK_API_KEY-} # only required for Pro
      - DOCKER_HOST=unix:///var/run/docker.sock
    volumes:
      - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"
Enter fullscreen mode Exit fullscreen mode

E iniciar o container:

docker compose up
Enter fullscreen mode Exit fullscreen mode

Configurando AWS Cli

Caso não tenha o Cli da AWS pode seguir essa documentação: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

$ aws --version
$ export AWS_ACCESS_KEY_ID="test"
$ export AWS_SECRET_ACCESS_KEY="test"
$ export AWS_DEFAULT_REGION="us-east-1"
$ aws configure --profile localstack
$ aws configure list
Enter fullscreen mode Exit fullscreen mode

Criando uma fila

Criando uma fila chamada "teste", utilizando o profile "localstack":

$ aws sqs create-queue --endpoint-url http://localhost:4566 --queue-name teste --profile localstack

{
    "QueueUrl": "http://localhost:4566/000000000000/teste"
}
Enter fullscreen mode Exit fullscreen mode

Listando filas

Conferindo as filas criadas:

$ aws sqs list-queues --endpoint-url http://localhost:4566 --profile localstack

{
    "QueueUrls": [
        "http://localhost:4566/000000000000/teste"
    ]
}
Enter fullscreen mode Exit fullscreen mode

Enviando uma mensagem à fila

Antes de mais nada vamos criar um arquivo message.json contendo os atributos da mensagem:

{
  "id": {
    "DataType": "String",
    "StringValue": "e8f50240-be67-463a-a479-d540697931c0"
  },
  "name": {
    "DataType": "String",
    "StringValue": "blue-car-toy"
  }
}
Enter fullscreen mode Exit fullscreen mode

Após isso irei enviar a nossa fila "teste" a mensagem "Mensagem de Teste":

$ aws sqs send-message --endpoint-url http://localhost:4566 --queue-url http://localhost:4566/000000000000/teste --message-body "Mensagem de Teste" --message-attributes file://./message.json --profile localstack
{
    "MD5OfMessageBody": "90a9cc3ce1350489e33ee38d19bf287a",
    "MD5OfMessageAttributes": "16894947ed19d2117e32efdb4f734250",
    "MessageId": "bc406501-3632-4f87-934b-11a1c909f8c6"
}
Enter fullscreen mode Exit fullscreen mode

Recebendo as mensagens da fila

Lendo a mensagem da fila, uma a uma:

$ aws sqs receive-message --endpoint-url http://localhost:4566 --queue-url http://localhost:4566/000000000000/teste --attribute-names All --message-attribute-names All  --profile localstack
{
    "Messages": [
        {
            "MessageId": "bc406501-3632-4f87-934b-11a1c909f8c6",
            "ReceiptHandle": "N2VkNDdhZGQtMmUxZS00NmVjLWE5NzYtNGQzM2
ExNWZmODVlIGFybjphd3M6c3FzOnVzLWVhc3QtMTowMDAwMDAwMDAwMDA6dGVzdGUgYm
M0MDY1MDEtMzYzMi00Zjg3LTkzNGItMTFhMWM5MDlmOGM2IDE2NjU5MzkyODIuNDQ3NTc4NA==",
            "MD5OfBody": "90a9cc3ce1350489e33ee38d19bf287a",
            "Body": "Mensagem de Teste",
            "Attributes": {
                "SenderId": "000000000000",
                "SentTimestamp": "1665939195032",
                "ApproximateReceiveCount": "1",
                "ApproximateFirstReceiveTimestamp": "1665939282447"
            },
            "MD5OfMessageAttributes": "16894947ed19d2117e32efdb4f734250",
            "MessageAttributes": {
                "id": {
                    "StringValue": "e8f50240-be67-463a-a479-d540697931c0",
                    "DataType": "String"
                },
                "name": {
                    "StringValue": "blue-car-toy",
                    "DataType": "String"
                }
            }
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

É isso! 😉


Referências:

https://github.com/flflima/localstack-docker

LocalStack

AWS Cli

Latest comments (0)

An Animated Guide to Node.js Event Loop

Node.js doesn’t stop from running other operations because of Libuv, a C++ library responsible for the event loop and asynchronously handling tasks such as network requests, DNS resolution, file system operations, data encryption, etc.

What happens under the hood when Node.js works on tasks such as database queries? We will explore it by following this piece of code step by step.