Skip to content

marcusvoltolim/localstack-aws

Repository files navigation

Motivação

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.

Tecnologias

  • SpringBoot 2.6.7
  • AWS 2.17.181
  • Java 11
  • Groovy 3.0.10
  • Gradle 7.4.1

Explicação

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
  • 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

Executando

LocalStack - docker-compose

  • 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.

Aplicação

  • 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.

Endpoints

DynamoDb

No DynamoDbController temos 2 endpoints:

  • Listar todas as tabelas:

    curl --location --request GET 'http://localhost:8080/dynamo/list-tables'
    

    img.png

  • 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"
    }'
    

    img.png


SQS

No SqsController temos 2 endpoints:

  • Listar todas as filas:

    curl --location --request GET 'http://localhost:8080/sqs/list-queues'
    

    img.png

  • 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"
    }'
    

    dynamo-postman-2.png

Validando

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:


dynamodb-admin-1


dynamodb-admin-2


sqs-admin-1


sqs-admin-2


Para mais detalhes segue os respectivos repositórios dos projetos: