IMG-STACK é um serviço serverless inteligente para processamento de imagens em tempo real totalmente em serverless. Oferecendo redimensionamento, cortes, filtros, analise com IA e otimização automática sem necessidade de pré-processamento.
- Processamento Assincrono: Processamento feito totalmente via AWS SQS
- Cache Inteligente: Sistema de cache baseado em conteúdo com TTL automático
- Arquitetura Serverless: Escalabilidade automática usando AWS Lambda
- URLs Assinadas: Segurança através do CloudFront com chaves privadas
- ImageProcessingService: Orquestrador que decide estratégia de processamento
- WorkerService: Gerencia jobs assíncronos via SQS e DynamoDB
- ProcessImageJob: Worker Lambda para processamento pesado
- StorageService: Abstração para S3 e CloudFront
- DynamoDBService: Responsável por gerenciar a tabela de jobs
- RekognitionService: Utiliza do serviço para análise de imagens com IA
Requisição → Verificar Cache na S3 → Adiciona à Fila → Retorna Informação `Retry-After`
↓
SQS Queue → Lambda Worker → Processa a Imagem → Salva Cache na S3 → Atualiza o Status
↓
Verifica se Finalizou → Retorna a Imagem Processada
- Requisitos
- Instalação
- Configuração
- Deploy
- Utilizando Aplicação
- Infraestrutura AWS
- Comandos Disponíveis
- Desenvolvimento
- Monitoramento
- Troubleshooting
- Contribuição
- Docker - versão 20.10 ou superior
- Docker Compose - versão 2.0 ou superior
- Conta AWS com as seguintes permissões:
- Lambda (criação e execução)
- S3 (buckets e objetos)
- CloudFront (distribuições e chaves)
- DynamoDB (tabelas e índices)
- SQS (filas)
- IAM (roles e políticas)
- Make (opcional, mas recomendado)
git clone https://github.com/AndersonDinizDev/img-stack-serverless.git
cd img-stack-serverlesscp .env.example .envmake upEdite o arquivo .env com as seguintes configurações:
# AWS Credentials
AWS_ACCESS_KEY_ID=sua_access_key_aqui
AWS_SECRET_ACCESS_KEY=sua_secret_key_aqui
AWS_DEFAULT_REGION=us-east-1
# Application
APP_NAME=img-stack
APP_ENV=production
APP_DEBUG=false
Para URLs assinadas, configure no console AWS:
- Acesse CloudFront → Console AWS
- Crie um Key Group:
- Gere um par de chaves RSA-2048
- Adicione a chave pública ao Key Group
- Configure a chave privada no ambiente
- Configure a Distribuição:
- Associe o Key Group à distribuição
- Configure comportamentos de cache
- Adicione as chaves na AWS SSM para uso no serverless.yml:
aws ssm put-parameter \ --name "/img-stack/cloudfront-key-group-id" \ --value "Sua key group aqui" \ --type "String" \ --description "Sua descrição aqui." \ --overwrite aws ssm put-parameter \ --name "/img-stack/cloudfront-key-pair-id" \ --value "Sua key pair aqui" \ --type "String" \ --description "Sua descrição aqui." \ --overwrite aws ssm put-parameter \ --name "/img-stack/cloudfront-private-key" \ --value "Sua private key aqui" \ --type "String" \ --description "Sua descrição aqui." \ --overwrite
Documentação oficial: Trusted Signers
# Deploy inicial
make deploy-dev
# Deploy apenas de código
serverless deploy function --function web --stage dev# Deploy completo
make deploy-prod# Status dos recursos
serverless info --stage prod
# Logs em tempo real
serverless logs --function web --stage prod --tail| Parâmetros | Descrição | Exemplo |
|---|---|---|
r_w |
Largura da imagem | 100 |
w_h |
Altura da imagem | 100 |
i_f |
Formato da imagem | webp |
i_q |
Qualidade da imagem | 100 |
image |
URL da imagem que deseja utilizar | http://example.com/teste.png |
ai |
Utilizar analise de IA para verificar imagens de teor impróprio | ['safe', 'faces'] |
- resources/views/teste.blade.php: Arquivo com um simples exemplo de uso
- faces: Utiliza a aws rekogtion para decteção de rosto na imagem e embaça caso encontrado
- safe: Utiliza a aws rekognition para decteção de conteúdo impróprio, indesejado ou ofensivo e embaçada toda a imagem caso encontrado
- web: API HTTP principal (timeout: 28s)
- worker: Processamento assíncrono (timeout: 300s, RAM: 1GB)
- S3 Bucket: Cache de imagens com lifecycle policy (90 dias)
- DynamoDB:
- Tabela para controle de jobs
- GSI para queries por status
- TTL automático
- CloudFront: CDN global com cache inteligente
- SQS: Fila principal
- IAM Roles: Permissões mínimas necessárias
- Bref Layer: Runtime PHP otimizado para Lambda
- ImageMagick Layer: Processamento nativo de imagens
- CloudFront Cache: Headers inteligentes baseados em conteúdo
- DynamoDB GSI: Queries eficientes por status e timestamp
| Comando | Descrição |
|---|---|
make up |
Inicia ambiente de desenvolvimento |
make down |
Para serviços e remove volumes |
make build |
Reconstrói imagens Docker |
make logs |
Logs em tempo real |
make restart |
Reinicia todos os serviços |
| Comando | Descrição |
|---|---|
make app-bash |
Acessa container Laravel |
make node-bash |
Acessa container Node.js |
| Comando | Descrição |
|---|---|
make deploy-dev |
Deploy para desenvolvimento |
make deploy-prod |
Deploy para produção |
make remove-dev |
Remove stack de desenvolvimento |
make remove-prod |
Remove stack de produção |
| Comando | Descrição |
|---|---|
make git-save |
Atalho para commit no github |
# Listar funções Lambda
aws lambda list-functions --region us-east-1
# Verificar DynamoDB
aws dynamodb describe-table --table-name img-stack-prod-images
# Status da fila SQS
aws sqs get-queue-attributes --queue-url $SQS_QUEUE_URL --attribute-names All# Logs da aplicação
make logs
# Logs específicos do worker
docker-compose logs worker
# Debug de job específico
php artisan queue:retry [job-id]# Testes de Feature/Unit
make test
# Teste de processamento
curl "http://dominio.cloudfront.com/v1/image?url=https://example.com/image.jpg&w=300&h=200&f=webp&t=resize"# Verificar permissões IAM
aws iam get-user
# Verificar configuração Serverless
serverless config credentials --provider aws --key KEY --secret SECRET
# Deploy com verbose
serverless deploy --verbose --stage dev# Verificar worker Lambda
aws lambda get-function --function-name img-stack-prod-worker
# Verificar fila SQS
aws sqs receive-message --queue-url $SQS_QUEUE_URL
# Reprocessar jobs com falha
php artisan queue:retry all# Verificar S3
aws s3 ls s3://img-stack-cache/
# Invalidar CloudFront
aws cloudfront create-invalidation --distribution-id E123456 --paths "/*"
# Verificar DynamoDB
aws dynamodb scan --table-name img-stack-prod-images --limit 10# Status completo da infraestrutura
serverless info --stage prod --verbose
# Métricas de performance
aws logs filter-log-events --log-group-name /aws/lambda/img-stack-prod-web
# Logs em tempo real por função
serverless logs --function web --stage prod --tail
# Logs por período
serverless logs --function worker --stage prod --startTime 1h
# Métricas DynamoDB
aws dynamodb describe-table --table-name img-stack-prod-imagesMantido por: Anderson Diniz