Este documento descreve a stack Docker para desenvolvimento local, a matriz de serviços AWS emulados e as limitações da edição Community do LocalStack (validado em LocalStack 4.4).
O projeto separa control plane (APIs AWS via LocalStack) e data plane (protocolo Redis/Memcached):
flowchart LR
subgraph app [Aplicação Java]
SDK[AwsSdkClientFactory]
RedisF[RedisCacheClientFactory]
end
subgraph localstack [LocalStack :4566]
SM[Secrets Manager]
STS[STS]
CW[CloudWatch]
EC[ElastiCache API]
end
subgraph dataplane [Data plane]
Redis[(Redis :6379)]
MC[(Memcached :11211 opcional)]
end
SDK --> SM
SDK --> STS
SDK --> CW
SDK -.->|Pro only| EC
RedisF --> Redis
| Camada | Componente | Função |
|---|---|---|
| Control plane | LocalStack | Secrets Manager, STS, CloudWatch; ElastiCache API (Pro) |
| Data plane | Container Redis | Tráfego Lettuce (CacheProvider) |
| Data plane | Container Memcached (profile) | Tráfego Spymemcached |
Em desenvolvimento local, o cache não passa pelo ElastiCache emulado — usa-se o Redis/Memcached
do docker-compose com as variáveis AWS_JAVA_CACHE_REDIS_* / AWS_JAVA_CACHE_MEMCACHED_*.
- Copie as variáveis de ambiente:
cp .env.example .env- Suba a stack manualmente quando precisar (não arranca sozinha ao iniciar o WSL/Docker):
docker compose up -dOs serviços usam restart: "no" — só sobem com docker compose up. Para parar:
docker compose downMemcached (opcional):
docker compose --profile memcached up -d- Exporte o
.envno shell ou usedirenv.
As classes LocalStackEnvConfig e AwsSdkEnvConfig leem essas variáveis; AwsSdkClientFactory
cria clientes AWS SDK v2 com endpoint override quando AWS_JAVA_CACHE_LOCALSTACK_ENABLED=true.
| Serviço AWS | Declarado no Compose | Community | Validado | Notas |
|---|---|---|---|---|
| Secrets Manager | Sim | Disponível | Sim | Bootstrap cria aws-java-cache/local/redis-password |
| STS | Sim | Disponível | Sim | get-caller-identity retorna account 000000000000 |
| CloudWatch | Sim | Disponível | Sim | Métricas/alarms; smoke test opcional |
| ElastiCache | Sim | Não emulado | Não | DescribeCacheClusters → InternalFailure; requer LocalStack Pro |
- Community: a API ElastiCache não está emulada. Chamadas como
describeCacheClustersfalham comInternalFailuree mensagem indicando licença/cobertura. - Pro: necessário para testes de integração que exercitem o control plane ElastiCache via AWS SDK.
- Desenvolvimento local atual: use o container Redis (ou Memcached) para o data plane; use LocalStack Community para Secrets Manager / STS / CloudWatch.
Referência: LocalStack coverage.
curl -s http://localhost:4566/_localstack/health | jq .Serviços esperados em Community: secretsmanager (running), sts (available), cloudwatch (available).
docker exec aws-java-cache-localstack awslocal secretsmanager get-secret-value \
--secret-id aws-java-cache/local/redis-passworddocker exec aws-java-cache-redis redis-cli ping
# PONGdocker exec aws-java-cache-localstack awslocal sts get-caller-identitydocker exec aws-java-cache-localstack awslocal elasticache describe-cache-clusters
# InternalFailure — confirma necessidade de Pro para esta APIset -a && source .env && set +a
# AwsSdkEnvConfig.fromEnvironment() → endpoint http://localhost:4566
# AwsSdkClientFactory.secretsManager() → lê o secret de bootstrap
# RedisCacheClientFactory.fromEnvironment() → PONG no Redis localdocker compose down # para containers
docker compose down -v # remove volumes (incl. dados LocalStack)Perfis Maven, comandos, configuração do .env, validação da stack e guia para agentes de IA
(sem permissão Docker API): docs/integration-tests.md.
- Dependências Testcontainers (
testcontainers-junit-jupiter,testcontainers-localstack) - Profile
integration— Testcontainers + Failsafe (*IT.java) - Profile
integration-compose— stackdocker compose+ Failsafe (*ComposeIT.java) - Testes ElastiCache API apenas com LocalStack Pro ou em CI dedicado
- CI opcional: job com
-Pintegrationou-Pintegration-compose
mvn clean verify não depende de Docker. Integração: -Pintegration-compose (stack no ar) ou
-Pintegration (Docker API).