FleetPulse é um sistema de telemetria para dispositivos IoT (como rastreadores veiculares), que processa dados de sensores como GPS, giroscópio e imagens. Ele utiliza serviços da AWS simulados com LocalStack, permitindo desenvolvimento e testes locais com serviços como Lambda, SQS, S3, DynamoDB, Rekognition e Mosquitto para MQTT.
Desenvolvido em Go, com infraestrutura gerenciada via Terraform e Serverless Framework, este projeto é ideal para protótipos e simulações de sistemas de frotas inteligentes.
Eu alterei o nome do projeto por isso, quando clonares altere o nome da pasta do projeto para go-lambda-localstack-test
- Processamento de dados de sensores via AWS Lambda
- Armazenamento de dados em DynamoDB e imagens em S3
- Reconhecimento facial com Rekognition
- Consumo de mensagens via SQS
- Publicação e assinatura de tópicos MQTT com Mosquitto
- Infraestrutura local usando Docker Compose + LocalStack
| Categoria | Tecnologia |
|---|---|
| Linguagem | Go (provided.al2) |
| Backend | AWS Lambda (via Serverless) |
| Fila de Mensagens | AWS SQS |
| Banco de Dados | AWS DynamoDB |
| Armazenamento | AWS S3 |
| Reconhecimento | AWS Rekognition (simulado) |
| MQTT | Mosquitto |
| IaC | Terraform + Serverless Framework |
| Ambiente Local | LocalStack + Docker Compose |
go-lambda-localstack-test/
├── bootstrap # Binário da Lambda
├── main.go # Código principal em Go
├── build.sh # Script para build/deploy/testes
├── terraform/ # Infraestrutura (SQS, S3, DynamoDB)
├── serverless.yml # Lambda e Event Source Mapping
├── docker-compose.yml # LocalStack + Mosquitto
├── mosquitto.conf # Configuração MQTT
├── go.mod / go.sum # Módulos Go
- Go ≥ 1.18
- Terraform
- Node.js + npm (para Serverless)
- AWS CLI
- Docker + Docker Compose
zipoubuild-lambda-zip(Linux/WSL)- Mosquitto CLI (opcional):
sudo apt install mosquitto-clients
git clone https://github.com/iamrosada0/lambda-terraform.git
cd go-lambda-localstack-testgo mod download
npm install # para o Serverless Frameworkaws configure
# Access Key: test
# Secret Key: test
# Region: us-east-1docker-compose up -dchmod +x build.sh
./build.shEsse script:
- Compila o código Go para
bootstrap - Cria o ZIP da Lambda
- Aplica os recursos do Terraform
- Implanta a Lambda via Serverless Framework
- Testa envio de mensagem SQS e consulta no DynamoDB
aws --endpoint-url=http://localhost:4566 sqs send-message \
--queue-url http://localhost:4566/000000000000/minha-fila \
--message-body '{"type":"gps","data":{"device_id":"device123","timestamp":"2025-05-19T17:00:00Z","latitude":40.7128,"longitude":-74.0060}}'aws --endpoint-url=http://localhost:4566 sqs send-message \
--queue-url http://localhost:4566/000000000000/minha-fila \
--message-body '{"type":"photo","data":{"device_id":"device123","timestamp":"2025-05-19T17:00:00Z","image":"<base64>"}}'aws --endpoint-url=http://localhost:4566 dynamodb scan \
--table-name fleet-telemetryaws --endpoint-url=http://localhost:4566 s3 ls s3://my-test-bucketPara testar o fluxo de publicação MQTT e envio para a SQS, siga os passos abaixo:
Deves rodar o arquivo no folder mqtt_to_sqs
Execute o seguinte comando para simular uma mensagem de GPS:
mosquitto_pub -h localhost -p 1883 -t sensor/gps -m '{"device_id":"device123","timestamp":"2025-05-19T17:00:00Z","latitude":40.7128,"longitude":-74.0060}'Confira os logs do container responsável pelo envio à SQS para confirmar o recebimento da mensagem:
docker logs go-lambda-localstack-test-mqtt-to-sqs-1Recebida mensagem no tópico sensor/gps: {"device_id":"device123","timestamp":"2025-05-19T17:00:00Z","latitude":40.7128,"longitude":-74.0060}
Enviando para SQS: {"type":"gps","data":{"device_id":"device123","timestamp":"2025-05-19T17:00:00Z","latitude":40.7128,"longitude":-74.0060}}
Mensagem gps do dispositivo device123 enviada para SQS com MessageId: <message-id>
mosquitto_sub -h localhost -p 1883 -t test/topic
---
## 📌 Notas Importantes
* O Serverless cria automaticamente o **Event Source Mapping** entre SQS e a Lambda.
Verifique com:
aws --endpoint-url=http://localhost:4566 lambda list-event-source-mappings
* Para evitar o erro `InvalidClientTokenId` no Terraform, use no `main.tf`:
```hcl
provider "aws" {
skip_requesting_account_id = true
access_key = "test"
secret_key = "test"
region = "us-east-1"
endpoints {
dynamodb = "http://localhost:4566"
sqs = "http://localhost:4566"
s3 = "http://localhost:4566"
}
}
- Adicionar filtros e índices no DynamoDB
- Migrar runtime para
provided.al2023 - Adicionar testes unitários e mocks de Rekognition
- Adicionar suporte a múltiplos dispositivos e usuários
Contribuições são bem-vindas! Abra uma issue ou envie um pull request. Sugestões, melhorias e correções são sempre apreciadas.
Distribuído sob a licença MIT. Veja LICENSE para mais informações.
Projeto desenvolvido por Luis de Água Rosada — 2025 🚚📡
