Lambda em .NET 8 que processa arquivos .xlsx enviados por fornecedores, atualizando produtos em DynamoDB via upsert, acionada por eventos de S3 através do EventBridge.
Este projeto automatiza a ingestão de catálogos de produtos, garantindo que novos produtos sejam inseridos e produtos existentes atualizados no DynamoDB, de forma escalável e serverless.
- Fornecedor envia
.xlsxpara o bucket S3catalogo-produtos-uploads. - Evento
ObjectCreatedé enviado para EventBridge. - Lambda ProductCatalogLambda é acionada.
- Lambda baixa o arquivo, lê produtos via
XlsxHelpere faz upsert no DynamoDB.
ProductCatalogLambda/
├─ Aws/ # Clientes de serviços AWS (ex: S3, DynamoDB) ☁️
├─ Extensions/ # Métodos de extensão (ex: Injeção de Dependência) 🔧
├─ Helpers/ # Classes utilitárias 🛠️
├─ Interfaces/ # Contratos das abstrações (ex: IProductProcessingService) 📜
├─ Models/ # POCOs e DTOs (ex: Product) 🏷️
├─ Services/ # Lógica de negócio ⚡
├─ aws-lambda-tools-defaults.json # Configurações de deploy da Lambda ⚙️
├─ Function.cs # Entry point da Lambda 🚀
└─ Readme.md # Este arquivo 📄
ProductCatalogLambda.Unit.Tests/
├─ Aws/ # Testes de serviços AWS 🧪
├─ Helpers/ # Helpers de teste 🛠️
├─ Services/ # Testes da lógica de negócio 🧪
└─ FunctionTests.cs # Testes do handler da Lambda 🎯
| Dependência | Propósito |
|---|---|
| Amazon.Lambda.Core | Serialização e contexto da Lambda |
| Amazon.Lambda.Serialization.SystemTextJson | Serialização JSON de eventos |
| AWSSDK.S3 | Acesso e download de arquivos do S3 |
| AWSSDK.DynamoDBv2 | Operações de upsert no DynamoDB |
| ClosedXML | Leitura de arquivos .xlsx |
| Microsoft.Extensions.DependencyInjection | Injeção de dependência (DI) |
O arquivo .xlsx deve conter as colunas:
| Coluna | Tipo |
|---|---|
| SKU | string |
| Name | string |
| Description | string |
| Price | decimal |
| Category | string |
- 🟢 .NET 8
- 🌐 AWS Lambda
- 💾 DynamoDB (NoSQL)
- 📦 S3
- 📄 ClosedXML
- ⚙️ Dependency Injection (DI)
- Clone o repositório:
git clone https://github.com/SeuUsuario/lambda-process-product-catalog.git
cd lambda-process-product-catalog- Abra no Visual Studio 2022 e restaure pacotes:
dotnet restore
dotnet build- Teste a Lambda com AWS Lambda Test Tool usando um evento simulado:
Quando um arquivo é adicionado ao bucket catalogo-produtos-uploads, o EventBridge envia um evento assim:
{
"version": "0",
"id": "12345678-1234-1234-1234-123456789012",
"detail-type": "Object Created",
"source": "aws.s3",
"account": "123456789012",
"time": "2025-10-25T23:59:00Z",
"region": "sa-east-1",
"resources": [
"arn:aws:s3:::catalogo-produtos-uploads"
],
"detail": {
"bucket": {
"name": "catalogo-produtos-uploads"
},
"object": {
"key": "produtos_fornecedor_XYZ.xlsx",
"size": 1024,
"eTag": "abc123def456ghi789",
"sequencer": "0055AED6DCD90281E5"
}
}
}A Lambda
ProductCatalogLambdavai extrairbucket.nameeobject.keydesse payload para processar o arquivo XLSX.
- Faça deploy para AWS Lambda pelo Visual Studio ou CLI da AWS.
aws s3 mb s3://catalogo-produtos-uploads --region sa-east-1- Cria o bucket na região
sa-east-1. - Nome deve ser único globalmente.
aws s3 ls- Lista todos os buckets da sua conta.
- Você deve ver
catalogo-produtos-uploadsna lista.
Atenção: isso é apenas para teste local. Em produção, restrinja ao Lambda/usuário específico.
aws s3api put-bucket-policy --bucket catalogo-produtos-uploads --policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "*" },
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::catalogo-produtos-uploads",
"arn:aws:s3:::catalogo-produtos-uploads/*"
]
}
]
}'aws s3 ls s3://catalogo-produtos-uploads- Deve listar objetos do bucket (vazio se recém-criado).
- Se funcionar → seu Lambda local pode acessar o bucket.
aws s3 cp arquivo-teste.txt s3://catalogo-produtos-uploads/- Envia
arquivo-teste.txtpara o bucket. - Depois, verifique:
aws s3 ls s3://catalogo-produtos-uploads- Você deve ver
arquivo-teste.txt.
- Workflow sugerido para build, teste unitário e deploy Lambda.
- Cobertura de testes e análises podem ser adicionadas com
coverlete badges atualizados automaticamente.
- 🔄 Logging estruturado com CloudWatch
- 🔒 Configurar IAM Role mínima (S3 + DynamoDB)
- 🧪 Adicionar testes unitários e de integração
- 📑 Criar IAC para a Lambda
- 🔀 Melhorar tratamento de erros e validações de dados
- Clean Architecture aplicada: Lambda, serviços AWS, helpers e modelos separados.
- DynamoDB realiza upsert natural via
PutItemAsync. - Arquivos
.xlsxdevem conter colunas corretas (SKU,Name,Description,Price,Category).
✨ by Diego Lins