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.
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")]
{
"table": "orders",
"id": 123,
"fields": { "status": "shipped", "updated_at": "2026-08-14T12:00:00Z" }
}config/whitelist.json define quais tabelas e colunas podem ser
atualizadas. Nomes de tabela/coluna nunca vêm da mensagem — só da whitelist.
python3 -m venv .venv
.venv/bin/pip install -r requirements-dev.txt
.venv/bin/pytest -vdocker compose -f local/docker-compose.yml up -d --build
./local/setup-localstack.sh
./local/poll-and-invoke.shO 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.
./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).
Ver docs/superpowers/specs/2026-08-15-python-queue-design.md.