O que roda onde
| Serviço AWS | Equivalente local | Seu fluxo local |
|---|---|---|
| Tarefa ECS, tarefa Fargate | Docker Compose com as imagens da tarefa | Execute seus serviços juntos, com healthchecks e portas publicadas |
| Lambda (imagem de contêiner) | Imagem-base Lambda com Runtime Interface Emulator | Invoque sua função por HTTP em arm64 nativo |
| S3 e outras APIs AWS | LocalStack | Desenvolva operações de buckets e objetos S3 localmente |
| EKS | kubectl e k9s no cluster real; kwok para uma API local | Compile e teste localmente, depois use kubectl e k9s no seu cluster |
Tarefas ECS e Fargate como projeto Compose
Uma definição de tarefa ECS é uma lista de contêineres com imagens, ambiente, mapeamentos de portas, verificações de saúde e ordem de início. O Compose descreve as mesmas coisas, então a conversão é direta: um serviço por definição de contêiner.
| Definição de tarefa | compose.yaml |
|---|---|
image | image |
environment, secrets | environment, env_file (mantenha segredos reais fora do arquivo) |
portMappings | ports |
healthCheck | healthcheck |
dependsOn com HEALTHY | depends_on com condition: service_healthy |
runtimePlatform.cpuArchitecture | platform: linux/amd64 ou linux/arm64 |
services:
api:
image: ACCOUNT.dkr.ecr.us-east-1.amazonaws.com/api:1.4.0
platform: linux/amd64 # match the task's cpuArchitecture
environment:
DATABASE_URL: postgres://postgres:dev@db:5432/app
ports: ["8080:8080"]
depends_on:
db:
condition: service_healthy
db:
image: postgres:17-alpine
environment:
POSTGRES_PASSWORD: dev
POSTGRES_DB: app
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
interval: 2s
retries: 30 docker compose up -d --wait # returns when db is healthy and api has started
curl localhost:8080/health
docker compose down -v Verificamos esse padrão no Oxcart com Postgres 17 e um serviço nginx condicionado a service_healthy: up --wait retornou com ambos saudáveis e a porta publicada respondendo em localhost. Para imagens amd64 compiladas no Mac, informe a mesma plataforma ao executá-las; uma imagem local exclusiva de amd64 só é encontrada com --platform linux/amd64 (ou platform: no Compose).
Execute e invoque uma imagem de contêiner Lambda localmente
- Escreva o handler. Crie
app.pycom uma funçãohandler(event, context)que retorne um dicionário, por exemplo{"statusCode": 200, "body": "hello"}. - Escreva o Dockerfile. Comece com uma imagem-base AWS Lambda, que inclui o Runtime Interface Emulator:
FROM public.ecr.aws/lambda/python:3.13, depoisCOPY app.py ${LAMBDA_TASK_ROOT}/eCMD ["app.handler"]. - Compile a imagem. Execute
docker build -t my-lambda .. Adicione--platform linux/amd64se a função estiver configurada para x86_64. - Execute. Execute
docker run -d -p 9000:8080 my-lambda. O emulador escuta na porta 8080 dentro do contêiner. - Invoque. Execute
curl -XPOST localhost:9000/2015-03-31/functions/function/invocations -d '{}'. A resposta é o valor retornado pelo handler, edocker logsmostra a linha REPORT do Lambda com a duração.
Na nossa execução, a função respondeu {"statusCode": 200, "body": "hello from lambda on aarch64"}, e o log do contêiner mostrou a linha Lambda REPORT com duração de 19 ms. O emulador é da própria AWS: “um proxy para as APIs Runtime e Extensions do Lambda” que disponibiliza o endpoint /2015-03-31/functions/function/invocations.
APIs AWS com LocalStack
O LocalStack emula APIs AWS em um contêiner na porta 4566. No Oxcart, executamos a imagem 4.9 e exercitamos o S3 de ponta a ponta:
docker run -d --name localstack -p 4566:4566 localstack/localstack:4.9
curl -s localhost:4566/_localstack/health # s3, lambda, dynamodb… "available"
curl -X PUT localhost:4566/my-bucket # create a bucket
curl -X PUT --data-binary hello localhost:4566/my-bucket/hello.txt
curl localhost:4566/my-bucket/hello.txt # hello Conheça o licenciamento antes de adotar. Desde 23 de março de 2026, as versões mais recentes do LocalStack exigem uma conta LocalStack e um token de autenticação; sem LOCALSTACK_AUTH_TOKEN, a imagem mais recente encerra com “License activation failed”. O plano gratuito Hobby do LocalStack é para uso não comercial; ECS está disponível a partir do plano Base e EKS a partir do Ultimate.
Envie ao ECR e implante
aws ecr get-login-password --region us-east-1 \
| docker login --username AWS --password-stdin ACCOUNT.dkr.ecr.us-east-1.amazonaws.com
docker buildx build --platform linux/amd64 --load -t ACCOUNT.dkr.ecr.us-east-1.amazonaws.com/api:1.4.0 .
docker push ACCOUNT.dkr.ecr.us-east-1.amazonaws.com/api:1.4.0 O Oxcart mantém a senha do registro nas Chaves do macOS, não em ~/.docker/config.json. Enviar uma imagem multiplataforma pelo Oxcart não é suportado: envie uma tag por arquitetura ou publique manifestos multi-arquitetura pelo CI.
EKS a partir do Mac
aws eks update-kubeconfig --name my-cluster adiciona o cluster ao kubeconfig para você usar kubectl e k9s pelo macOS. Desenvolva e teste os serviços localmente com Oxcart e depois implante as mesmas imagens no EKS. Para testar manifestos e controllers localmente, o kwok fornece um servidor de API Kubernetes real com nós simulados. O guia Kubernetes no Mac explica como esses fluxos se complementam.
Por que vale a pena testar localmente
Cada alteração testada localmente evita um push, uma implantação e uma busca nos logs. O Oxcart encurta esse ciclo: 42 ms para docker run --rm, 0.69 s para criar e iniciar 20 contêineres e 77 ms para pará-los e removê-los, o mais rápido dos três ambientes testados. As conexões de saída dos contêineres são abertas pelo Mac, então uma VPN para sua rede AWS também se aplica a elas.
Perguntas
Como testo uma tarefa ECS ou Fargate localmente no Mac?
Execute os contêineres da tarefa com Docker Compose: um serviço por definição de contêiner, com a mesma imagem, ambiente, mapeamentos de portas, healthcheck e dependências. docker compose up -d --wait retorna quando todos os serviços com healthcheck estão saudáveis. O Oxcart executa a stack com dependências de healthcheck e portas publicadas, para testar os serviços juntos antes da implantação.
Posso executar imagens de contêiner AWS Lambda localmente no Apple silicon?
Sim. As imagens-base AWS Lambda incluem o Runtime Interface Emulator. No Oxcart, compilamos uma função Python 3.13 a partir de public.ecr.aws/lambda/python:3.13, executamos com -p 9000:8080 e invocamos com curl: ela respondeu HTTP 200 nativamente em arm64.
O LocalStack funciona no Oxcart?
Sim, como contêiner. Verificamos criação de bucket, put, get e list de S3 em localhost:4566 com a imagem LocalStack 4.9. As versões atuais precisam de conta LocalStack e token de autenticação em LOCALSTACK_AUTH_TOKEN; sem ele, a imagem mais recente encerra. O LocalStack documenta ECS a partir do plano Base e EKS a partir do Ultimate.
Como envio uma imagem ao Amazon ECR pelo Mac?
Entre com aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin ACCOUNT.dkr.ecr.REGION.amazonaws.com, depois adicione uma tag e use docker push. No Oxcart, docker login armazena a senha nas Chaves do macOS.
Devo compilar imagens amd64 ou arm64 para o Fargate?
Use a plataforma de execução da definição de tarefa. Se usa ARM64, compile imagens arm64 nativas no Mac; se usa X86_64, compile com --platform linux/amd64. O Oxcart executa imagens amd64 localmente pelo Rosetta, para testar exatamente a imagem que vai implantar.
Como desenvolvo para EKS no Mac?
Compile e teste seu app e suas dependências localmente com Oxcart, depois envie as imagens ao ECR. Use kubectl e k9s no Mac para trabalhar com seu cluster EKS e kwok no Oxcart para verificar manifestos em uma API Kubernetes local. Consulte o guia Kubernetes no Mac.
Fontes e método
- Exemplos testados com Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (Compose, imagem-base Lambda com emulador, S3 do LocalStack 4.9, Buildx).
- Autenticação do LocalStack: https://blog.localstack.cloud/localstack-single-image-next-steps/; planos: https://localstack.cloud/pricing/; ECS: https://docs.localstack.cloud/aws/services/ecs/; EKS: https://docs.localstack.cloud/aws/services/eks/.
- Lambda Runtime Interface Emulator: https://github.com/aws/aws-lambda-runtime-interface-emulator. AWS SAM CLI e Docker: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-docker.html. ECS Local Container Endpoints: https://github.com/awslabs/amazon-ecs-local-container-endpoints. Verificados em 2026-10-10.
- Velocidade dos contêineres: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPUs e 12 GiB, medianas de cinco amostras; os outros ambientes foram medidos mais cedo no mesmo dia, no mesmo Mac e com a mesma estrutura de testes, usando o cliente docker 29.4.