Qué se ejecuta y dónde
| Servicio AWS | Equivalente local | Tu flujo de trabajo local |
|---|---|---|
| Tarea ECS, tarea Fargate | Docker Compose con las imágenes de la tarea | Ejecutar tus servicios juntos con comprobaciones de salud y puertos publicados |
| Lambda (imagen de contenedor) | Imagen base de Lambda con Runtime Interface Emulator | Invocar tu función por HTTP en arm64 nativo |
| S3 y otras API de AWS | LocalStack | Desarrollar en local operaciones con buckets y objetos S3 |
| EKS | kubectl y k9s contra el clúster real; kwok para una API local | Compilar y probar en local, después usar kubectl y k9s con tu clúster |
Tareas ECS y Fargate como un proyecto Compose
Una definición de tarea ECS es una lista de contenedores con imágenes, entorno, asignaciones de puertos, comprobaciones de salud y orden de arranque. Compose describe lo mismo, así que la correspondencia es directa: un servicio por definición de contenedor.
| Definición de tarea | compose.yaml |
|---|---|
image | image |
environment, secrets | environment, env_file (mantén los secretos reales fuera del archivo) |
portMappings | ports |
healthCheck | healthcheck |
dependsOn with HEALTHY | depends_on with condition: service_healthy |
runtimePlatform.cpuArchitecture | platform: linux/amd64 or 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 este patrón en Oxcart con Postgres 17 y un servicio nginx condicionado por service_healthy: up --wait terminó con ambos saludables y el puerto publicado respondiendo en localhost. Para imágenes amd64 compiladas en tu Mac, pasa la misma plataforma al ejecutarlas; una imagen local solo para amd64 únicamente se encuentra cuando se establece --platform linux/amd64 (o platform: en Compose).
Ejecutar e invocar una imagen de contenedor Lambda en local
- Escribe el handler. Crea
app.pycon una funciónhandler(event, context)que devuelva un dict, por ejemplo{"statusCode": 200, "body": "hello"}. - Escribe el Dockerfile. Parte de una imagen base de AWS Lambda, que incluye el Runtime Interface Emulator:
FROM public.ecr.aws/lambda/python:3.13, despuésCOPY app.py ${LAMBDA_TASK_ROOT}/yCMD ["app.handler"]. - Compila la imagen. Ejecuta
docker build -t my-lambda .. Añade--platform linux/amd64si tu función está configurada para x86_64. - Ejecútala. Ejecuta
docker run -d -p 9000:8080 my-lambda. El emulador escucha en el puerto 8080 dentro del contenedor. - Invócala. Ejecuta
curl -XPOST localhost:9000/2015-03-31/functions/function/invocations -d '{}'. La respuesta es el valor que devuelve tu handler, ydocker logsmuestra la línea REPORT de Lambda con la duración.
En nuestra ejecución, la función respondió {"statusCode": 200, "body": "hello from lambda on aarch64"}, y el registro del contenedor mostró la línea REPORT de Lambda con una duración de 19 ms. El emulador es el de AWS: «un proxy para las API Runtime y Extensions de Lambda» que expone el endpoint /2015-03-31/functions/function/invocations.
API de AWS con LocalStack
LocalStack emula las API de AWS en un contenedor en el puerto 4566. En Oxcart ejecutamos la imagen 4.9 y probamos S3 de principio a fin:
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 Conoce la licencia antes de basar tu trabajo en ella. Desde el 23 de marzo de 2026, las últimas versiones de LocalStack requieren una cuenta LocalStack y un token de autenticación; sin LOCALSTACK_AUTH_TOKEN, la imagen más reciente termina con «License activation failed». El plan gratuito Hobby de LocalStack es para uso no comercial; ECS está disponible desde el plan Base y EKS desde Ultimate.
Enviar a ECR y desplegar
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 Oxcart guarda la contraseña del registro en el Llavero de macOS, no en ~/.docker/config.json. No se admite enviar una imagen multiplataforma desde Oxcart: envía una etiqueta por arquitectura o publica manifiestos multi-arquitectura desde la CI.
EKS desde tu Mac
aws eks update-kubeconfig --name my-cluster añade el clúster a tu kubeconfig para que puedas usar kubectl y k9s desde macOS. Desarrolla y prueba tus servicios en local con Oxcart y después despliega las mismas imágenes en EKS. Para probar manifiestos y controladores en local, kwok proporciona un servidor de API Kubernetes real con nodos simulados. La guía de Kubernetes en Mac explica cómo encajan estos flujos de trabajo.
Por qué merece la pena el ciclo local
Cada cambio que pruebas en local evita un envío, un despliegue y una búsqueda en los registros. Oxcart acorta ese ciclo: 42 ms para docker run --rm, 0.69 s para crear e iniciar 20 contenedores y 77 ms para detenerlos y eliminarlos, los mejores resultados de los tres entornos que probamos. Tu Mac abre las conexiones salientes de los contenedores, así que una VPN hacia tu red AWS también se aplica a ellas.
Preguntas
¿Cómo pruebo una tarea ECS o Fargate en local desde un Mac?
Ejecuta los contenedores de la tarea con Docker Compose: un servicio por definición de contenedor, con la misma imagen, entorno, asignaciones de puertos, comprobación de salud y dependencias. docker compose up -d --wait termina cuando todos los servicios con comprobación de salud están saludables. Oxcart ejecuta los servicios con dependencias de comprobaciones de salud y puertos publicados, para que puedas probarlos juntos antes del despliegue.
¿Puedo ejecutar imágenes de contenedor AWS Lambda en local en equipos con chip de Apple?
Sí. Las imágenes base de AWS Lambda incluyen el Runtime Interface Emulator. En Oxcart compilamos una función Python 3.13 a partir de public.ecr.aws/lambda/python:3.13, la ejecutamos con -p 9000:8080 y la invocamos con curl: respondió HTTP 200 de forma nativa en arm64.
¿LocalStack funciona en Oxcart?
Sí, como contenedor. Verificamos la creación de buckets S3 y las operaciones put, get y list contra localhost:4566 con la imagen LocalStack 4.9. Las versiones actuales de LocalStack necesitan una cuenta LocalStack y un token de autenticación establecido como LOCALSTACK_AUTH_TOKEN; sin él, la imagen más reciente termina. LocalStack documenta ECS desde el plan Base y EKS desde Ultimate.
¿Cómo envío una imagen a Amazon ECR desde un Mac?
Inicia sesión con aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin ACCOUNT.dkr.ecr.REGION.amazonaws.com, después añade una etiqueta y ejecuta docker push. En Oxcart, docker login guarda la contraseña en el Llavero de macOS.
¿Debo compilar imágenes amd64 o arm64 para Fargate?
Haz que coincidan con la plataforma de ejecución de la definición de tarea. Si usa ARM64, compila imágenes arm64 nativas en tu Mac; si usa X86_64, compila con --platform linux/amd64. Oxcart ejecuta imágenes amd64 en local mediante Rosetta para que puedas probar exactamente la imagen que despliegas.
¿Cómo desarrollo para EKS en mi Mac?
Compila y prueba tu app y sus dependencias en local con Oxcart y después envía las imágenes a ECR. Usa kubectl y k9s en el Mac para trabajar con tu clúster EKS, y kwok en Oxcart para comprobar manifiestos contra una API Kubernetes local. Consulta la guía de Kubernetes en Mac.
Fuentes y método
- Ejemplos probados con Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (Compose, imagen base de Lambda con el emulador, S3 de LocalStack 4.9 y Buildx).
- Autenticación de LocalStack: https://blog.localstack.cloud/localstack-single-image-next-steps/; planes: 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 y 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. Comprobado el 2026-10-10.
- Velocidad de los contenedores: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPU y 12 GiB, medianas de cinco muestras; los otros entornos se midieron antes ese mismo día en el mismo Mac, con el mismo sistema de medición y el cliente docker 29.4.