Este projeto está configurado para rodar tanto em EC2 (usando main.ts) quanto em AWS Lambda (usando lambda.ts) através do Serverless Framework.
- Node.js 20+ instalado
- AWS CLI configurado com credenciais válidas
- Serverless Framework instalado globalmente (opcional):
npm install -g serverless
Você precisa configurar suas credenciais AWS. Existem várias formas:
Opção A: AWS CLI (recomendado)
aws configureOpção B: Variáveis de ambiente
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_REGION=sa-east-1Opção C: Arquivo de credenciais (~/.aws/credentials)
[default]
aws_access_key_id = your_access_key
aws_secret_access_key = your_secret_keySua conta AWS precisa ter as seguintes permissões:
- Lambda (criar e atualizar funções)
- API Gateway (criar e configurar APIs)
- CloudFormation (criar e gerenciar stacks)
- IAM (criar roles para Lambda)
- S3 (para deploy de artifacts)
- CloudWatch Logs (para logs da Lambda)
Certifique-se de que todas as variáveis estão configuradas no arquivo .env:
# Database
DATABASE_URL="postgresql://..."
# Application
NODE_ENV=production
PORT=3000
# Cloudflare R2 Storage (se usar upload de imagens)
CLOUDFLARE_R2_BASE_URL=https://...
CLOUDFLARE_R2_BUCKET=your-bucket
CLOUDFLARE_R2_ACCESS_KEY_ID=your-key
CLOUDFLARE_R2_SECRET_ACCESS_KEY=your-secret
CLOUDFLARE_R2_REGION=auto
CLOUDFLARE_R2_PUBLIC_BASE_URL=https://...Importante: As variáveis do
.envsão lidas automaticamente pelo pluginserverless-dotenv-plugindurante o deploy.
npm run deploy:lambda:devIsso irá:
- Buildar o projeto TypeScript
- Gerar o Prisma Client
- Fazer deploy para o stage
dev - Retornar a URL do API Gateway
npm run deploy:lambda:prodnpm run build:lambda
serverless deploy --stage staging --region us-east-1Execute a aplicação localmente simulando o ambiente Lambda:
npm run serverless:offlineA API estará disponível em http://localhost:3000
Para rodar no modo tradicional (EC2/servidor):
npm run start:dev # desenvolvimento com hot-reload
npm run start:prod # produçãoassembleo-core/
├── src/
│ ├── main.ts # Entry point para EC2/servidor tradicional
│ ├── lambda.ts # Entry point para AWS Lambda
│ ├── app.module.ts # Módulo principal (compartilhado)
│ └── modules/ # Módulos da aplicação
├── serverless.yml # Configuração do Serverless Framework
├── .env # Variáveis de ambiente (não comitar)
└── .env.example # Template de variáveis
O arquivo serverless.yml está configurado com:
- Runtime: Node.js 20.x
- Região: sa-east-1 (São Paulo)
- Timeout: 30 segundos
- Memória: 1024 MB
- CORS: Habilitado para todas as origens
- Stage padrão: dev
Edite o arquivo serverless.yml para modificar:
provider:
timeout: 30 # Aumentar para funções mais longas
memorySize: 1024 # Ajustar memória (128 - 10240 MB)
region: sa-east-1 # Mudar regiãoserverless logs -f api --tail --stage devserverless logs -f api --stage dev --startTime 1hOs logs também estão disponíveis no AWS CloudWatch:
- Navegue até CloudWatch > Log groups
- Procure por
/aws/lambda/assembleo-core-dev-api
serverless info --stage devRetorna:
- URL da API
- Nome da função Lambda
- Stage atual
- Região
Service Information
service: assembleo-core
stage: dev
region: sa-east-1
stack: assembleo-core-dev
endpoints:
ANY - https://abc123.execute-api.sa-east-1.amazonaws.com/{proxy+}
functions:
api: assembleo-core-dev-api
serverless remove --stage devAtenção: Isso remove todos os recursos criados pelo Serverless (Lambda, API Gateway, IAM Roles, etc.)
npx prisma generate
npm run buildCertifique-se de que todas as dependências estão instaladas:
npm installConfigure suas credenciais AWS:
aws configureSe a função estiver atingindo o timeout, aumente no serverless.yml:
provider:
timeout: 60 # segundosAumente a memória alocada:
provider:
memorySize: 2048 # MBO pacote da Lambda tem limite de 250 MB (comprimido) ou 50 MB (direto).
Para reduzir o tamanho:
- Verifique exclusões no
package.patternsdoserverless.yml - Use Layers para dependências pesadas
- Considere usar Lambda Container Image
- Lambda: Free tier inclui 1M de requisições/mês e 400.000 GB-segundo
- API Gateway: $3.50 por milhão de requisições
- CloudWatch Logs: Primeiros 5GB/mês grátis
- Ajuste a memória para o mínimo necessário
- Configure timeout adequado (não muito alto)
- Use caching no API Gateway se possível
- Monitore uso no AWS Cost Explorer
name: Deploy to Lambda
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'
- run: npm ci
- run: npm run deploy:lambda:prod
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}Para mais informações sobre o Serverless Framework:
- Documentação: https://www.serverless.com/framework/docs
- AWS Lambda: https://docs.aws.amazon.com/lambda
- NestJS + Lambda: https://docs.nestjs.com/faq/serverless
- AWS CLI configurado
- Credenciais AWS válidas
- Variáveis de ambiente configuradas no
.env - Prisma Client gerado (
prisma generate) - Build executado com sucesso (
npm run build) - Testes passando (opcional)
- Deploy executado (
npm run deploy:lambda:dev) - URL da API recebida
- Testes na API funcionando
- Logs verificados no CloudWatch