Skip to content

Repository files navigation

python-queue

Lambda Python que consome um batch de mensagens SQS, valida table/colunas contra uma whitelist e executa um UPDATE dinâmico no MySQL (Aurora + RDS Proxy com IAM auth em produção). Reimplementação greenfield, em Python, do message-rustler (Rust) — sem código compartilhado — para comparação de eficiência e complexidade entre as duas stacks.

Arquitetura

flowchart LR
    SQS[("SQS queue")] -->|batch| Lambda["Lambda (Python)<br/>handle_batch"]
    Lambda -->|parse_message + validate| Whitelist["whitelist.json<br/>(cold start, module scope)"]
    Whitelist -->|table/coluna OK| Query["build_update_sql<br/>(bind params)"]
    Query -->|PyMySQL| DB[("Aurora MySQL<br/>via RDS Proxy, IAM auth via boto3")]
    Lambda -->|batchItemFailures| SQS
    SQS -->|maxReceiveCount excedido| DLQ[("Dead-letter queue")]
Loading

Formato da mensagem SQS

{
  "table": "orders",
  "id": 123,
  "fields": { "status": "shipped", "updated_at": "2026-08-14T12:00:00Z" }
}

Whitelist

config/whitelist.json define quais tabelas e colunas podem ser atualizadas. Nomes de tabela/coluna nunca vêm da mensagem — só da whitelist.

Rodando os testes

python3 -m venv .venv
.venv/bin/pip install -r requirements-dev.txt
.venv/bin/pytest -v

Rodando localmente (MySQL + LocalStack SQS + container Lambda real)

docker compose -f local/docker-compose.yml up -d --build
./local/setup-localstack.sh
./local/poll-and-invoke.sh

O serviço lambda roda o handler de verdade atrás do Lambda Runtime Interface Emulator (mesmo mecanismo do cargo lambda watch do message-rustler), invocável em localhost:9001. Passo a passo completo, incluindo como forçar uma mensagem pra DLQ, em local/README.md.

Deploy

./scripts/build.sh
cd terraform
terraform init
terraform apply \
  -var="aws_region=us-east-1" \
  -var="rds_proxy_name=<proxy>" \
  -var="rds_proxy_resource_id=<resource-id>" \
  -var="db_name=<db>" \
  -var="db_user=<user>" \
  -var="vpc_subnet_ids=[\"subnet-xxxx\"]" \
  -var="vpc_security_group_ids=[\"sg-xxxx\"]"

vpc_subnet_ids and vpc_security_group_ids must have network access to the RDS Proxy (the Proxy has no public endpoint).

Design

Ver docs/superpowers/specs/2026-08-15-python-queue-design.md.

About

python-queue

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages