- Instalar o AWS CLI e LocalStack CLI
- Configurar o Docker Compose
- Estrutura de Diretórios
- Criar o Código da Lambda
- Criar o Script de Configuração do LocalStack
- Iniciar o Docker Compose e Configurar o LocalStack
- Comandos Úteis para Interagir com a Lambda
- Código para Invocar a Lambda com Node.js
- Instalar Dependências
- Executar o Código
- Verificar a Resposta
- Referências
Siga as instruções para instalar o AWS CLI: AWS CLI Installation
pip install localstack
Crie um arquivo docker-compose.yml
na raiz do seu projeto:
version: '3.7'
services:
localstack:
container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-container}"
image: localstack/localstack:latest
ports:
- "127.0.0.1:4566:4566" # LocalStack Gateway
- "127.0.0.1:4510-4559:4510-4559" # external services port range
environment:
- DEBUG=${DEBUG:-0}
- SERVICES=lambda,logs
- LAMBDA_REMOTE_DOCKER=false
- REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
volumes:
- "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
Certifique-se de ter a seguinte estrutura de diretórios e arquivos:
seu-projeto
├── docker-compose.yml
└── localstack
├── setup-localstack.sh
└── lambdas
└── example-lambda
└── index.js
Arquivo: localstack/lambdas/example-lambda/index.js
exports.handler = async (event) => {
let body = JSON.parse(event.body);
const product = body.num1 * body.num2;
const response = {
statusCode: 200,
body: "The product of " + body.num1 + " and " + body.num2 + " is " + product,
};
return response;
};
Arquivo: localstack/setup-localstack.sh
#!/bin/bash
# Parar execução em caso de erro
set -e
# Detalhes das lambdas
LAMBDAS=(
"example-lambda,index.handler,nodejs18.x,arn:aws:iam::000000000000:role/lambda-role"
# Adicione mais lambdas aqui se necessário
)
# Caminho para o diretório das lambdas
LAMBDA_DIR="localstack/lambdas"
# Esperar o LocalStack estar pronto
until awslocal lambda list-functions
do
echo "Waiting for LocalStack Lambda..."
sleep 3
done
# Criar funções Lambda no LocalStack
for LAMBDA_INFO in "${LAMBDAS[@]}"; do
IFS=',' read -r LAMBDA_NAME HANDLER RUNTIME ROLE <<< "$LAMBDA_INFO"
ZIP_NAME="$LAMBDA_DIR/$LAMBDA_NAME.zip"
LAMBDA_CODE_DIR="$LAMBDA_DIR/$LAMBDA_NAME"
# Verificar se o diretório da lambda existe
if [ -d "$LAMBDA_CODE_DIR" ]; then
# Navegar até o diretório da lambda
cd $LAMBDA_CODE_DIR
# Criar o ZIP no diretório pai
echo "Creating ZIP for $LAMBDA_NAME"
zip -r "../$LAMBDA_NAME.zip" ./*
# Voltar ao diretório raiz do projeto
cd ../../../
# Verificar se o grupo de logs existe
if ! awslocal logs describe-log-groups --log-group-name-prefix "/aws/lambda/$LAMBDA_NAME" | grep -q "/aws/lambda/$LAMBDA_NAME"; then
# Criar grupo de logs
awslocal logs create-log-group --log-group-name /aws/lambda/$LAMBDA_NAME
else
echo "Log group /aws/lambda/$LAMBDA_NAME already exists. Skipping creation."
fi
# Criar função Lambda no LocalStack
echo "Creating Lambda function $LAMBDA_NAME"
if awslocal lambda create-function \
--function-name $LAMBDA_NAME \
--runtime $RUNTIME \
--role $ROLE \
--handler $HANDLER \
--zip-file fileb://$ZIP_NAME; then
echo "Lambda function '$LAMBDA_NAME' created and configured successfully in LocalStack."
else
echo "Lambda function '$LAMBDA_NAME' already exists. If you want to recreate it, delete the function first."
fi
else
echo "Directory $LAMBDA_CODE_DIR does not exist. Skipping..."
fi
done
Dê permissão de execução ao script:
chmod +x localstack/setup-localstack.sh
Inicie os serviços:
docker-compose up -d
Execute o script de configuração (a partir da raiz do projeto):
./localstack/setup-localstack.sh
Consultar Lambda:
awslocal lambda invoke --function-name example-lambda --cli-binary-format raw-in-base64-out --payload '{"body": "{\"num1\": 3, \"num2\": 4}"}' response.json
Criar Lambda:
awslocal lambda create-function \
--function-name example-lambda \
--runtime nodejs18.x \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler index.handler \
--zip-file fileb://localstack/lambdas/example-lambda.zip
Listar Lambdas:
awslocal lambda list-functions
Listar Lambda Específica:
awslocal lambda get-function --function-name example-lambda
Aguardar até que o Status seja Ativo:
awslocal lambda wait function-active-v2 --function-name example-lambda
Deletar Lambda Específica:
awslocal lambda delete-function --function-name example-lambda
Verificar Logs da Lambda:
awslocal logs tail /aws/lambda/example-lambda
Verificar Logs do Container LocalStack:
docker logs localstack-container
Criar Grupo de Logs:
awslocal logs create-log-group --log-group-name /aws/lambda/example-lambda
Verificar Logs em um Grupo de Logs:
awslocal logs describe-log-streams --log-group-name /aws/lambda/example-lambda
Lambda Logs Stream:
awslocal logs get-log-events --log-group-name /aws/lambda/example-lambda --log-stream-name <LOG_STREAM_NAME>
Substitua <LOG_STREAM_NAME>
pelo nome do stream de logs retornado pelo comando anterior.
Arquivo: index.js
import { InvokeCommand, LambdaClient, LogType } from "@aws-sdk/client-lambda";
// Função para invocar a Lambda
const invoke = async (funcName, payload) => {
const client = new LambdaClient({ endpoint: 'http://localhost:4566' });
const command = new InvokeCommand({
FunctionName: funcName,
Payload: JSON.stringify(payload),
LogType: LogType.Tail,
});
const { Payload, LogResult } = await client.send(command);
const result = Buffer.from(Payload).toString();
const logs = Buffer.from(LogResult, "base64").toString();
console.log("Result:", result);
console.log("Logs:", logs);
return { logs, result };
};
// Nome da função Lambda e payload
const funcName = 'example-lambda';
const payload = { body
: JSON.stringify({ num1: 3, num2: 4 }) };
// Invocar a função Lambda
invoke(funcName, payload).catch((error) => {
console.error("Error invoking Lambda function:", error.message);
});
Certifique-se de que as dependências necessárias estão instaladas:
npm install @aws-sdk/client-lambda
Execute o script para invocar a Lambda:
node index.js
Verifique a saída no terminal para ver o resultado da invocação da função Lambda.
- AWS CLI Installation
- LocalStack Installation
- AWS Lambda Documentation
- AWS SDK for JavaScript - Lambda Invoke Example