backend
backend copied to clipboard
Deploy em AWS Lambda
Sobre
Modificações no projeto que permite o deploy da aplicação em um Lambda da AWS.
Testar
A aplicação já está configurada em um lambda. Para testar, basta executar um curl
:
curl -v https://4otgb7u14b.execute-api.us-east-1.amazonaws.com/shelters
Ou usar o frontend:
VITE_API_URL="https://4otgb7u14b.execute-api.us-east-1.amazonaws.com/" npm run dev
Devido a forma como Lambdas funcionam, eles podem estar desligados no momento dos primeiros requests. Contudo, após inicar, os próximos requests serão mais rápidos.
Infra
Eu já configurei uma pequena infraestrutura para a aplicação na conta do AWS:
- RDS: banco PostgreSQL (dados importados já)
- Paramemeter Store: credenciais de conexão do RDS
- CloudWatch: configurado automaticamente pelo Serverless
Serverless irá buscar o valor da conexão do RDS no parameter store e usará o valor na variável de ambiente DATABASE_URL
Todo
O host do RDS está aberto publicamente. O correto seria configurar um proxy para o lambda conseguir conectar no banco (docs). Eu posso fazer isso nos próximos dias se acharem necessário...
Podemos configurar o Github Actions para realizar o deploy. Segue um exemplo de configuração:
deploy:
if: github.ref == 'refs/heads/master'
runs-on: ubuntu-latest
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: current
cache: npm
- run: npm ci
env:
PRISMA_CLI_BINARY_TARGETS: native,rhel-openssl-1.0.x
- run: npx prisma generate
- run: npm run build
- run: npx serverless deploy --verbose
Cara, não sei se faz muito sentido subir essa aplicação numa lambda ao invés de uma instância no EC2
Cara, não sei se faz muito sentido subir essa aplicação numa lambda ao invés de uma instância no EC2
Eu decidi ir com o lambda por alguns motivos:
- É extremamente fácil de deployar
- É extremamente fácil de configurar
- Scale up e down automático
- Logs automáticos
Como a nossa aplicação é apenas um CRUD, vi como sendo uma boa escolha. Contudo, não faço ideia dos planos futuros para a aplicação. Certas coisas não funcionam direito no contexto "serverless".
Se quiserem, posso configurar para realizar um deploy num ECS Fargate com um Application Load Balancer (ALB). O deploy seria realizado fazendo upload de uma imagem docker nova para o repositório configurado
PS: Eu só uso EC2 se estritamente necessário, pois temos que configurar bastante coisa para conseguir realizar deploys em EC2s.