Projeto SpringBoot Web com Groovy/Java mostrando como configurar o LocalStack coexistindo com a configuração de "produção" que acessa a AWS real.
LocalStack é um emulador de serviços em nuvem que pode ser executado na sua máquina fornecendo uma estrutura de teste/simulação fácil de usar para desenvolver seus aplicativos em nuvem.
Já testei: S3, SQS, SNS, Event-Bridge (events), KMS, IAM, STS.
- SpringBoot 2.6.7
- AWS 2.17.181
- Java 11
- Groovy 3.0.10
- Gradle 7.4.1
Necessário conhecimento prévio sobre Spring, injeção de dependência...
Temos 2 configurações para instanciar os beans dos clients AWS de acordo o desejado: real ou local e uma configuração para criar os recursos no LocalStack.
Vamos usar o enviroment do Spring adicionando a configuração application.localstack no application.yaml para informar se vamos executar localmente ou não.
- AwsConfig.groovy
- Usado se application.localstack é false (ou quando não tem a config
matchIfMissing = true
) - Responsável por instanciar os beans dos clients AWS usando as credenciais informadas nas variáveis de ambiente:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- Usado se application.localstack é false (ou quando não tem a config
- AwsConfigLocal.groovy
- Usado se application.localstack é true
- Responsável por instanciar os beans dos clients AWS apontando para
http://localhost:4566
- LocalStackConfig.groovy
- Usado se application.localstack é true
- Responsável por criar os recursos no LocalStack, vamos criar 2 filas no SQS e 2 tabelas no DynamoDB.
- Os nomes das filas e tabelas estão no application.yaml
- Necessário ter docker e docker-compose instalados;
- Execute o seguinte comando na raiz do projeto:
docker-compose -up
; - Após iniciar, os recursos do LocalStack estarão disponíveis na porta:
4566
e região:sa-east-1
- As configurações podem ser alteradas no arquivo docker-compose.yaml, além de (des)ativar os serviços desejados.
- Existem diversas maneiras de iniciar uma aplicação SpringBoot;
- Pode usar sua IDE de preferência (eu uso IntelliJ);
- Ou executar o seguinte comando na raiz do projeto:
./gradlew bootRun
- Independente de como executar, em caso de sucesso terá o log: Tomcat started on port(s): 8080 (http) with context path '', informando que a aplicação (endpoints) está sendo exposta na porta: 8080.
No DynamoDbController temos 2 endpoints:
-
Listar todas as tabelas:
curl --location --request GET 'http://localhost:8080/dynamo/list-tables'
-
Inserir um item (json) na tabela:
curl --location --request POST 'http://localhost:8080/dynamo?tableName=Table1' \ --header 'Content-Type: application/json' \ --data-raw '{ "Id": 935, "Value": "content" }'
No SqsController temos 2 endpoints:
-
Listar todas as filas:
curl --location --request GET 'http://localhost:8080/sqs/list-queues'
-
Postar uma mensagem (json) na fila:
curl --location --request POST 'http://localhost:8080/sqs?queueName=Queue1' \ --header 'Content-Type: application/json' \ --data-raw '{ "Id": 935, "Value": "content" }'
Podemos usar as seguintes aplicações node, que são interfaces visuais para DynamoDb e SQS para verificar se os recursos foram criados localmente.
Instalando (necesário ter node/npm já instalado):
npm install dynamodb-admin -g
npm install sqs-admin -g
Executando via terminal (macOS):
DYNAMO_ENDPOINT=http://localhost:4566 AWS_REGION=sa-east-1 dynamodb-admin --open &
SQS_ENDPOINT=http://localhost:4566 AWS_REGION=sa-east-1 sqs-admin & open http://localhost:8002 &
Após executar as aplicações podemos consultar e manipular os recursos criados no navegador:
Para mais detalhes segue os respectivos repositórios dos projetos: