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
zip
oubuild-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-test
go mod download
npm install # para o Serverless Framework
aws configure
# Access Key: test
# Secret Key: test
# Region: us-east-1
docker-compose up -d
chmod +x build.sh
./build.sh
Esse 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-telemetry
aws --endpoint-url=http://localhost:4566 s3 ls s3://my-test-bucket
Para 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-1
Recebida 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 🚚📡