Um projeto de aprendizado para experimentar com AWS S3, Lambda e processamento de imagens, construído com Node.js e TypeScript.
Este projeto demonstra como:
- Fazer upload de imagens para Amazon S3
- Processar imagens automaticamente com AWS Lambda
- Gerar thumbnails de diferentes tamanhos e formatos
- Integrar serviços AWS com Node.js/TypeScript
1. Upload de Imagem(ns) → API Node.js
2. API → Amazon S3 (bucket input)
3. S3 Event → AWS Lambda (processamento)
4. Lambda → Sharp (redimensionamento)
5. Lambda → S3 (salvar thumbnails no bucket output)
├── src/ # Código fonte da API
│ ├── controllers/ # Controladores das rotas
│ ├── services/ # Serviços (S3, etc.)
│ ├── types/ # Definições de tipos TypeScript
│ ├── utils/ # Utilitários (thumbnail generator)
│ └── index.ts # Entrada da aplicação
├── lambda/ # Código da função AWS Lambda
│ ├── src/ # Código fonte da Lambda
│ │ ├── utils/ # Utilitários (thumbnail generator)
│ │ └── index.ts # Handler da Lambda
│ └── package.json # Dependências da Lambda
├── tests/ # Testes automatizados
│ ├── utils/ # Testes dos utilitários
│ └── helpers/ # Helpers para testes
└── docs/ # Documentação
├── lambda/ # Código da função Lambda
│ ├── src/ # Código fonte Lambda
│ ├── package.json # Dependências Lambda
│ └── tsconfig.json # Config TypeScript Lambda
├── docs/ # Documentação
└── README.md # Este arquivo
npm installCopie o arquivo .env.example para .env e configure:
cp .env.example .envEdite o .env com suas credenciais AWS:
# AWS Credentials
AWS_ACCESS_KEY_ID=sua_access_key_aqui
AWS_SECRET_ACCESS_KEY=sua_secret_key_aqui
AWS_REGION=us-east-1
# S3 Configuration
S3_BUCKET_NAME=seu-bucket-de-imagens
S3_BUCKET_REGION=us-east-1
# Server Configuration
PORT=3000
NODE_ENV=development# Desenvolvimento (com hot reload)
npm run dev
# Build e Start
npm run build
npm startEste projeto utiliza Jest para testes unitários da função de geração de thumbnails.
# Todos os testes
yarn test
# Testes específicos da função generateThumbnail
yarn test:thumbnail
# Testes em modo watch (re-executa quando arquivos mudam)
yarn test:watch- Acesse o Console AWS S3
- Clique em "Create bucket"
- Nome:
seu-bucket-de-imagens(deve ser único globalmente) - Clique em "Create bucket"
- Acesse o Console AWS IAM
- Clique em "Users" → "Create user"
- Nome:
thumbnail-processor-user - Anexe políticas:
AmazonS3FullAccess(para desenvolvimento)AWSLambda_FullAccess(para desenvolvimento)
- Crie e anote as credenciais (Access Key + Secret Key)
- Acesse o Console AWS Lambda
- Clique em "Create function"
- Nome:
thumbnail-processor - Runtime:
Node.js 18.x - Role: Criar nova role com permissões básicas do Lambda
- Adicionar permissões S3 à role criada
- No bucket S3, vá para "Configuration > Triggers"
- Clique em "Add trigger"
- Vincule ao Bucket criado anteriormente
- Prefix:
uploads/4
COnfiguration > Environment variables
POST /api/upload/single
Content-Type: multipart/form-data
Form data:
- image: [arquivo de imagem]POST /api/upload/multiple
Content-Type: multipart/form-data
Form data:
- images: [múltiplos arquivos de imagem]GET /health
GET /api/upload/status- JPEG (.jpg, .jpeg)
- PNG (.png)
- GIF (.gif)
- WebP (.webp)
Limite de tamanho: 10MB por arquivo
# Upload single image
curl -X POST http://localhost:3000/api/upload/single \
-F "image=@/path/to/your/image.jpg"
# Upload multiple images
curl -X POST http://localhost:3000/api/upload/multiple \
-F "images=@/path/to/image1.jpg" \
-F "images=@/path/to/image2.jpg" \
-F "images=@/path/to/image3.jpg"- Selecione
POSTmethod - URL:
http://localhost:3000/api/upload/single - Body → form-data
- Key:
image, Type: File - Selecione sua imagem e Send
- ✅ Setup básico do projeto
- ✅ API de upload para S3
- ⏳ Função Lambda para processamento
- ⏳ Geração de thumbnails com Sharp
- ⏳ Triggers S3 → Lambda
- ⏳ Interface web (opcional)
- ⏳ Monitoring e logs
- Verifique se as variáveis de ambiente estão corretas
- Confirme se o usuário IAM tem as permissões necessárias
- Verifique se o bucket foi criado
- Confirme o nome do bucket no
.env
- Verifique as políticas do usuário IAM
- Confirme a região do bucket
Status: 🚧 Em desenvolvimento - Projeto para aprendizado AWS