Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

DiegoLins10/lambda-process-product-catalog

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🚀 ProductCatalogLambda – AWS Lambda para Processamento de Catálogo de Produtos

.NET AWS Lambda DynamoDB S3 Coverage

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.


📖 Visão Geral

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.

Fluxo de Trabalho

  1. Fornecedor envia .xlsx para o bucket S3 catalogo-produtos-uploads.
  2. Evento ObjectCreated é enviado para EventBridge.
  3. Lambda ProductCatalogLambda é acionada.
  4. Lambda baixa o arquivo, lê produtos via XlsxHelper e faz upsert no DynamoDB.

📂 Estrutura do Projeto

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ências

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)

🌐 Modelo de Dados

O arquivo .xlsx deve conter as colunas:

Coluna Tipo
SKU string
Name string
Description string
Price decimal
Category string

🛠 Tecnologias

  • 🟢 .NET 8
  • 🌐 AWS Lambda
  • 💾 DynamoDB (NoSQL)
  • 📦 S3
  • 📄 ClosedXML
  • ⚙️ Dependency Injection (DI)

🚀 Como rodar localmente

  1. Clone o repositório:
git clone https://github.com/SeuUsuario/lambda-process-product-catalog.git
cd lambda-process-product-catalog
  1. Abra no Visual Studio 2022 e restaure pacotes:
dotnet restore
dotnet build
  1. 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 ProductCatalogLambda vai extrair bucket.name e object.key desse payload para processar o arquivo XLSX.

  1. Faça deploy para AWS Lambda pelo Visual Studio ou CLI da AWS.

Sessão de comandos S3

1️⃣ Criar o bucket

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.

2️⃣ Verificar se o bucket foi criado

aws s3 ls
  • Lista todos os buckets da sua conta.
  • Você deve ver catalogo-produtos-uploads na lista.

3️⃣ Dar permissão total para teste local (opcional)

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/*"
      ]
    }
  ]
}'

4️⃣ Testar acesso ao bucket

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.

5️⃣ Enviar um arquivo de teste (opcional)

aws s3 cp arquivo-teste.txt s3://catalogo-produtos-uploads/
  • Envia arquivo-teste.txt para o bucket.
  • Depois, verifique:
aws s3 ls s3://catalogo-produtos-uploads
  • Você deve ver arquivo-teste.txt.

📦 GitHub Actions – CI/CD

  • Workflow sugerido para build, teste unitário e deploy Lambda.
  • Cobertura de testes e análises podem ser adicionadas com coverlet e badges atualizados automaticamente.

🔧 Próximos Passos

  • 🔄 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

💡 Observações

  • Clean Architecture aplicada: Lambda, serviços AWS, helpers e modelos separados.
  • DynamoDB realiza upsert natural via PutItemAsync.
  • Arquivos .xlsx devem conter colunas corretas (SKU, Name, Description, Price, Category).

by Diego Lins


About

Lambda em .NET 8 para processar arquivos XLSX de fornecedores e realizar upsert de produtos no DynamoDB via eventos S3/EventBridge.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.