Usando LocalStack junto com Serverless Framework: Um guia passo a passo
O LocalStack é uma plataforma de desenvolvimento que permite simular os serviços da AWS localmente, facilitando o desenvolvimento e teste de aplicações antes da implantação em ambientes reais. Já o Serverless Framework é uma ferramenta para criar, gerenciar e implantar aplicações serverless em diferentes provedores de nuvem, como AWS, Google Cloud e Microsoft Azure.
Neste tutorial, vamos ver como utilizar o Serverless Framework e o LocalStack para criar um ambiente de desenvolvimento local para suas aplicações AWS.
Pré-requisitos
- Instale o Node.js (recomendamos a versão 14.x ou superior).
- Instale o Docker e o Docker Compose.
- Instale o Serverless Framework globalmente com o comando
npm install -g serverless
.
Configurar o projeto
Siga os passos abaixo para configurar seu projeto:
- Crie uma nova pasta para o projeto e navegue até ela no terminal.
- Execute
npm init -y
para criar um arquivo package.json. - Instale as dependências necessárias com o comando
npm install --save-dev serverless serverless-localstack aws-sdk
.
Configurando o Serverless e LocalStack
- Crie um arquivo serverless.yml e adicione a seguinte configuração (substitua "meu-projeto" pelo nome do seu projeto):
service: meu-projeto
provider:
name: aws
runtime: nodejs14.x
stage: ${opt:stage, 'local'}
region: us-east-1
environment:
IS_LOCAL: ${opt:stage, 'dev'}
plugins:
- serverless-localstack
custom:
localstack:
stages:
- local
host: http://localhost
edgePort: 4566
functions:
publishMessage:
handler: handler.publishMessage
events:
- http:
path: /publish
method: post
processMessage:
handler: handler.processMessage
events:
- sqs:
arn: arn:aws:sqs:us-east-1:000000000000:meu-projeto-sqs
resources:
Resources:
MySNSTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: meu-projeto-sns
MySQSQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: meu-projeto-sqs
MySNSToSQS:
Type: AWS::SNS::Subscription
Properties:
Protocol: sqs
TopicArn: !Ref MySNSTopic
Endpoint: !GetAtt MySQSQueue.Arn
Este arquivo é a configuração principal do projeto Serverless, onde você define o provedor, plugins, funções e eventos relacionados.
- Crie um arquivo docker-compose.yml com a seguinte configuração:
version: '3.8'
services:
localstack:
container_name: localstack
image: localstack/localstack:latest
ports:
- '4566:4566'
- '4571:4571'
environment:
- SERVICES=s3,sns,sqs,lambda,apigateway
- DEBUG=1
- DATA_DIR=/tmp/localstack/data
- LAMBDA_EXECUTOR=docker
- LAMBDA_REMOTE_DOCKER=false
- DOCKER_HOST=unix:///var/run/docker.sock
- AWS_ACCESS_KEY_ID=test
- AWS_SECRET_ACCESS_KEY=test
volumes:
- './.localstack:/tmp/localstack'
- '/var/run/docker.sock:/var/run/docker.sock'
Este arquivo define a configuração do Docker Compose, que permite executar o LocalStack como um contêiner Docker.
- Crie um arquivo handler.js com o seguinte código:
const AWS = require('aws-sdk');
const isLocal = process.env.IS_LOCAL;
if (isLocal) {
AWS.config.update({
region: 'us-east-1',
accessKeyId: 'test',
secretAccessKey: 'test',
endpoint: new AWS.Endpoint('http://localstack:4566'),
});
}
const sns = new AWS.SNS();
module.exports.publishMessage = async (event) => {
const message = JSON.parse(event.body).message;
const params = {
Message: message,
TopicArn: 'arn:aws:sns:us-east-1:000000000000:meu-projeto-sns',
};
console.log('Publicando mensagem:', message);
await sns.publish(params).promise();
return {
statusCode: 200,
body: JSON.stringify({ message: 'Mensagem publicada com sucesso!' }),
};
};
module.exports.processMessage = async (event) => {
const message = event.Records[0].body;
console.log('Mensagem recebida:', message);
return {
statusCode: 200,
};
};
Este arquivo contém o código-fonte das funções Lambda:
- publishMessage: Esta função recebe uma mensagem do corpo do evento, cria um objeto com os parâmetros necessários (Message e TopicArn) e publica a mensagem no tópico SNS. Retorna um JSON com uma mensagem de sucesso.
- processMessage: Esta função recebe um evento SNS, extrai a mensagem do corpo do evento e a exibe no console. Retorna um status 200, indicando sucesso.
- Atualize os seguintes scripts no se package.json:
"scripts": {
"infra:up": "docker compose up -d",
"infra:down": "docker compose down",
"deploy": "npx sls deploy --stage local"
}
Agora que você configurou tudo, siga os passos abaixo para implantar e testar sua aplicação localmente:
Inicie o LocalStack
No terminal, execute o seguinte comando para subir o LocalStack usando o Docker Compose:
npm run infra:up
Aguarde até que todos os serviços estejam em execução.
Implante sua aplicação:
Com o LocalStack em execução, execute o seguinte comando no terminal para implantar sua aplicação usando o Serverless Framework:
npm run deploy
Este comando empacota e implanta sua aplicação no LocalStack. Observe o URL de endpoint gerado na saída do comando.
Teste sua aplicação:
Para testar sua aplicação, você precisará fazer uma solicitação HTTP POST para a função publishMessage. Você pode fazer isso usando uma ferramenta como Postman ou Curl. Substitua [ENDPOINT_URL] pelo URL gerado no passo anterior.
Exemplo usando Curl:
curl -X POST -H "Content-Type: application/json" -d '{"message": "Olá, LocalStack!"}' [ENDPOINT_URL]/publish
Se a função publishMessage for executada com sucesso, você verá a mensagem "Mensagem publicada com sucesso!" na resposta.
Verifique a mensagem processada:
Para verificar a mensagem processada pela função processMessage, use o comando sls logs.
sls logs -t -f processMessage --stage local
Agora você pode verificar a mensagem processada usando o comando sls logs sem a necessidade de verificar os logs do contêiner Docker ou do terminal onde o LocalStack foi iniciado.
Encerrar o ambiente:
Quando terminar de testar sua aplicação, execute o seguinte comando para encerrar o LocalStack e remover os contêineres Docker:
npm run infra:down
Com este ambiente de desenvolvimento local configurado, você pode continuar a desenvolver sua aplicação AWS, testando-a localmente antes de implantá-la em um ambiente de integração ou produção.
Referências e links úteis:
- LocalStack: https://localstack.cloud/
- Serverless Framework: https://www.serverless.com/
- Docker: https://www.docker.com/
- Docker Compose: https://docs.docker.com/compose/
- Curl: https://curl.se/