Como configurar LocalStack para mapear serviços da AWS

Valdemar Júnior
5 min readMar 1, 2024

--

Aprenda como mapear serviços da AWS com LocalStack em um tutorial passo a passo e teste seus sistemas localmente

O que é LocalStack?

LocalStack é uma ferramenta que emula serviços AWS localmente sem a necessidade de se conectar remotamente ao provedor de cloud.

Quais problemas o LocalStack tenta resolver?

Quando se começa a desenvolver um sistema onde parte dessa arquitetura envolve algum serviço da AWS, existem alguns desafios que precisam ser enfrentados. Como por exemplo:

  • Slow feedback loop: O tempo para desenvolver a solução, deployar, testar e repetir todo o processo é moroso e lento.
  • Debugging remoto: Debugar aplicações na cloud não é uma tarefa fácil, principalmente se for em ambiente de homologação ou produtivo.
  • Gerenciamento de infra-estrutura: O desenvolvimento da solução utilizando diretamente o provedor de cloud pode elevar os custos da cloud, mesmo sem a solução ainda estar pronta.

A vida de um cloud developer:

E como LocalStack pode ajudar o desenvolvedor?

Se você for um desenvolvedor que:

  • É iniciante e quer aprender a desenvolver para AWS, mas não tem acesso a cartão de crédito, pois é obrigatório para fazer o cadastro na AWS.
  • É estudante e quer ter experiência na prática sobre como desenvolver um serviço para AWS sem precisar gastar para isso.
  • Ou um profissional que quer validar a configuração da infra-estrutura na aplicação sem precisar se conectar na internet ou configurar uma conta separada da AWS para realizar os testes, aumentando os custos de cloud.

O LocalStack pode ajudar, até porque ninguém quer estudar AWS e deixar acidentalmente uma máquina EC2 rodando e gastando dinheiro sem lembrar de desligá-la. Quem nunca!

Hoje o LocalStack emula +30 serviços, a maioria deles de graça.

Serviços da AWS oferecidos pela LocalStack

Vamos para o exemplo!

Para o nosso exemplo, iremos subir o LocalStack usando docker-compose e emular os serviços Simple Notification Service(SNS) e Simple Queue Service(SQS). É necessário ter o docker e o docker-compose instalados.

docker-compose.yml

Esse é o exemplo de arquivo docker-compose.yml para subirmos o LocalStack com SNS e o SQS configurados.

version: "3.8"
services:
localstack:
container_name: localstack-example
image: localstack/localstack
hostname: localstack
ports:
- "127.0.0.1:4566:4566"
environment:
- SKIP_SSL_CERT_DOWNLOAD=1
- SERVICES=sns,sqs
- DOCKER_HOST=unix:///var/run/docker.sock
- AWS_DEFAULT_REGION=us-east-1
- AWS_ACCESS_KEY_ID=ANUJDEKAVADIYAEXAMPLE
- AWS_SECRET_ACCESS_KEY=2QvM4/Tdmf38SkcD/qalvXO4EXAMPLEKEY
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"

O parâmetro SERVICES do atributo services.localstack.environment é responsável por definir quais serviços da AWS serão emulados nessa instância do LocalStack, no casoSERVICES=sns,sqs.

Para subir o nosso container basta executar o comando docker-compose up --build -d. Se executado com sucesso irá aparece algo como:

Resultado do comando docker-compose executado

No meu caso a imagem docker do LocalStack já tinha sido baixada previamente.

Agora que o container está inicializado, iremos entrar no container e criar um tópico SNS e uma fila(SQS), fazendo a fila se escrever ao tópico, conforme desenho abaixo:

Para entrar no bash do container do LocalStack execute o comando: docker container exec -it localstack-example bash.

Criando recursos

Dentro do container iremos criar o tópico notification-topic e a fila notification-queue e inscrever a fila no tópico. Para isso execute os comandos:

# Cria tópico
awslocal sns create-topic --name notification-topic
# Cria fila
awslocal sqs create-queue --queue-name notification-queue
# Inscreve a fila no tópico
awslocal --endpoint-url=http://localhost:4566 sns subscribe --topic-arn arn:aws:sns:us-east-1:000000000000:notification-topic --protocol sqs --notification-endpoint arn:aws:sqs:us-east-1:000000000000:notification-queue

Para testarmos, podemos instalar o awslocal, que é uma abstração do AWS CLI para LocalStack, fora do container e conectá-lo ao LocalStack para enviar uma mensagem para o tópico notification-topic.

Agora iremos executar o comando para enviar uma mensagem para o tópico:

awslocal --endpoint-url=http://localhost:4566 sns publish --topic-arn arn:aws:sns:us-east-1:000000000000:notification-topic --message '{"content": "message content"}'

Se o comando for executado com sucesso, irá retornar algo como:

{
"MessageId": "a7c6a131-8aaf-4bbf-81f4-b1638906e5b4"
}

Consumir a mensagem

Agora iremos consumir a mensagem enviada. Para isso execute o comando:

awslocal --endpoint-url=http://localhost:4566 sqs receive-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/notification-queue

O resultado é algo parecido com:

{
"Messages": [
{
"MessageId": "a89198b2-1bb9-4b1e-a189-7a41bef1b196",
"ReceiptHandle": "NzJmZDY0NGUtYmJhZi00ODkyLTkzNTMtZTQ2N2EyNmFiMzYxIGFybjphd3M6c3FzOnVzLWVhc3QtMTowMDAwMDAwMDAwMDA6bm90aWZpY2F0aW9uLXF1ZXVlIGE4OTE5OGIyLTFiYjktNGIxZS1hMTg5LTdhNDFiZWYxYjE5NiAxNzA3MDYyMDA4LjA3MDc0Mw==",
"MD5OfBody": "eabc9408fa5b704ea8c9e6a848b8f257",
"Body": "{\"Type\": \"Notification\", \"MessageId\": \"90bf2564-c9e2-4ecd-8472-ddea02bbbff0\", \"TopicArn\": \"arn:aws:sns:us-east-1:000000000000:notification-topic\", \"Message\": \"{\\\"content\\\": \\\"message content\\\"}\", \"Timestamp\": \"2024-02-04T15:29:11.406Z\", \"SignatureVersion\": \"1\", \"Signature\": \"EXAMPLEpH+..\", \"SigningCertURL\": \"https://sns.us-east-1.amazonaws.com/SimpleNotificationService-0000000000000000000000.pem\", \"UnsubscribeURL\": \"http://localhost.localstack.cloud:4566/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:000000000000:notification-topic:92babe99-3a21-4531-b2c7-50c8ce600db7\"}"
}
]
}

No atributo Messages.Body e na propriedade Message teremos a mensagem enviada ao tópico e marcada como consumida agora.

Conclusão

Para esse post podemos ver a capacidade do LocalStack de emular os serviços da AWS e testar a configuração da sua aplicação previamente antes de se conectar ao provedor de cloud, economizando recursos e proporcionando experiência de testar serviços da AWS na prática sem custos.

Fique à vontade para compartilhar quais serviços você já emulou ou se pretende usar o LocalStack em algum projeto pessoal ou na empresa em que você trabalha.

Caso queira ver um exemplo de uma aplicação Spring Boot usando os recursos do LocalStack, acesse o Github.

Se você gostou do artigo, por favor não deixe de bater palmas 👏 (você pode fazer várias vezes), me seguir, ou até mesmo me comprar um café☕️https://www.buymeacoffee.com/valdemarjuniorr

--

--

Valdemar Júnior

Escrevo sobre lições aprendidas, estudos, dicas de produtividade e assuntos relacionados a Java, Spring e seus ecosistemas. Gosto de compartilhar conhecimento