Ce qui tourne où
| Service AWS | Équivalent local | Votre workflow local |
|---|---|---|
| Tâche ECS, tâche Fargate | Docker Compose avec les images de la tâche | Exécuter vos services ensemble avec des contrôles de santé et des ports publiés |
| Lambda (image de conteneur) | Image de base Lambda avec Runtime Interface Emulator | Invoquer votre fonction en HTTP sur arm64 natif |
| S3 et autres API AWS | LocalStack | Développer localement les opérations sur les buckets et objets S3 |
| EKS | kubectl et k9s avec le vrai cluster ; kwok pour une API locale | Construire et tester en local, puis utiliser kubectl et k9s avec votre cluster |
Les tâches ECS et Fargate sous forme de projet Compose
Une définition de tâche ECS est une liste de conteneurs avec images, environnement, correspondances de ports, contrôles de santé et ordre de démarrage. Compose décrit les mêmes éléments : la transposition est donc directe, avec un service par définition de conteneur.
| Définition de tâche | compose.yaml |
|---|---|
image | image |
environment, secrets | environment, env_file (gardez les vrais secrets hors du fichier) |
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 Nous avons vérifié ce modèle sur Oxcart avec Postgres 17 et un service nginx conditionné par service_healthy : up --wait s'est terminé avec les deux services sains et le port publié répondant sur localhost. Pour les images amd64 construites sur votre Mac, passez la même plateforme à l'exécution ; une image exclusivement amd64 construite localement n'est trouvée que si --platform linux/amd64 (ou platform: dans Compose) est défini.
Exécuter et invoquer une image de conteneur Lambda en local
- Écrivez le handler. Créez
app.pyavec une fonctionhandler(event, context)qui renvoie un dict, par exemple{"statusCode": 200, "body": "hello"}. - Écrivez le Dockerfile. Partez d'une image de base AWS Lambda, qui inclut le Runtime Interface Emulator :
FROM public.ecr.aws/lambda/python:3.13, puisCOPY app.py ${LAMBDA_TASK_ROOT}/etCMD ["app.handler"]. - Construisez l'image. Exécutez
docker build -t my-lambda .. Ajoutez--platform linux/amd64si votre fonction est configurée pour x86_64. - Exécutez-la. Exécutez
docker run -d -p 9000:8080 my-lambda. L'émulateur écoute sur le port 8080 dans le conteneur. - Invoquez-la. Exécutez
curl -XPOST localhost:9000/2015-03-31/functions/function/invocations -d '{}'. La réponse est la valeur renvoyée par votre handler, etdocker logsaffiche la ligne REPORT de Lambda avec la durée.
Dans notre exécution, la fonction a répondu {"statusCode": 200, "body": "hello from lambda on aarch64"}, et le journal du conteneur a affiché la ligne Lambda REPORT avec une durée de 19 ms. L'émulateur est celui d'AWS : « un proxy pour les API Runtime et Extensions de Lambda », qui expose le point d'accès /2015-03-31/functions/function/invocations.
Les API AWS avec LocalStack
LocalStack émule les API AWS dans un conteneur sur le port 4566. Sur Oxcart, nous avons exécuté l'image 4.9 et testé S3 de bout en bout :
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 Prenez connaissance de la licence avant de vous appuyer dessus. Depuis le 23 mars 2026, les dernières versions de LocalStack nécessitent un compte LocalStack et un jeton d'authentification ; sans LOCALSTACK_AUTH_TOKEN, la dernière image s'arrête avec « License activation failed ». L'offre gratuite Hobby de LocalStack est réservée à un usage non commercial ; ECS est disponible à partir de l'offre Base et EKS à partir de l'offre Ultimate.
Envoyer vers ECR et déployer
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 conserve le mot de passe du registre dans le Trousseau macOS, et non dans ~/.docker/config.json. L'envoi d'une image multiplateforme depuis Oxcart n'est pas pris en charge : envoyez un tag par architecture ou publiez les manifestes multiarchitectures depuis la CI.
EKS depuis votre Mac
aws eks update-kubeconfig --name my-cluster ajoute le cluster à votre kubeconfig pour utiliser kubectl et k9s depuis macOS. Développez et testez vos services localement avec Oxcart, puis déployez les mêmes images sur EKS. Pour tester localement les manifestes et contrôleurs, kwok fournit un vrai serveur API Kubernetes avec des nœuds simulés. Le guide Kubernetes sur Mac explique comment ces workflows s'articulent.
Pourquoi le cycle local en vaut la peine
Chaque modification testée localement évite un envoi, un déploiement et une recherche dans les journaux. Oxcart raccourcit ce cycle : 42 ms pour docker run --rm, 0.69 s pour créer et démarrer 20 conteneurs, et 77 ms pour les arrêter et les supprimer, les meilleurs résultats des trois environnements testés. Les connexions sortantes des conteneurs sont ouvertes par votre Mac : un VPN vers votre réseau AWS s'y applique donc aussi.
Questions
Comment tester une tâche ECS ou Fargate localement sur Mac ?
Exécutez les conteneurs de la tâche avec Docker Compose : un service par définition de conteneur, avec les mêmes image, environnement, correspondances de ports, contrôle de santé et dépendances. docker compose up -d --wait se termine lorsque chaque service doté d'un contrôle de santé est sain. Oxcart exécute la stack avec des dépendances basées sur les contrôles de santé et des ports publiés, pour tester les services ensemble avant le déploiement.
Puis-je exécuter localement des images de conteneurs AWS Lambda sur puce Apple ?
Oui. Les images de base AWS Lambda incluent le Runtime Interface Emulator. Sur Oxcart, nous avons construit une fonction Python 3.13 depuis public.ecr.aws/lambda/python:3.13, l'avons exécutée avec -p 9000:8080, puis invoquée avec curl : elle a répondu HTTP 200 nativement sur arm64.
LocalStack fonctionne-t-il sur Oxcart ?
Oui, sous forme de conteneur. Nous avons vérifié la création de buckets S3 et les opérations put, get et list sur localhost:4566 avec l'image LocalStack 4.9. Les versions actuelles de LocalStack nécessitent un compte LocalStack et un jeton d'authentification défini dans LOCALSTACK_AUTH_TOKEN ; sans lui, la dernière image s'arrête. LocalStack documente ECS à partir de l'offre Base et EKS à partir de l'offre Ultimate.
Comment envoyer une image vers Amazon ECR depuis un Mac ?
Connectez-vous avec aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin ACCOUNT.dkr.ecr.REGION.amazonaws.com, puis ajoutez un tag et exécutez docker push. Sur Oxcart, docker login stocke le mot de passe dans le Trousseau macOS.
Dois-je construire des images amd64 ou arm64 pour Fargate ?
Alignez-vous sur la plateforme d'exécution de la définition de tâche. Si elle utilise ARM64, construisez des images arm64 natives sur votre Mac ; si elle utilise X86_64, construisez avec --platform linux/amd64. Oxcart exécute les images amd64 localement via Rosetta, pour tester exactement l'image que vous déployez.
Comment développer pour EKS sur mon Mac ?
Construisez et testez votre application et ses dépendances localement avec Oxcart, puis envoyez les images vers ECR. Utilisez kubectl et k9s sur le Mac pour travailler avec votre cluster EKS, et kwok sur Oxcart pour vérifier les manifestes avec une API Kubernetes locale. Voir le guide Kubernetes sur Mac.
Sources et méthode
- Exemples testés avec Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (Compose, image de base Lambda avec l'émulateur, S3 de LocalStack 4.9, Buildx).
- Authentification LocalStack : https://blog.localstack.cloud/localstack-single-image-next-steps/ ; offres : 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 et 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. Vérifié le 2026-10-10.
- Vitesse des conteneurs : Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPU et 12 GiB, médianes de cinq échantillons ; les autres environnements ont été mesurés plus tôt le même jour sur le même Mac et avec le même dispositif de mesure, avec le client docker 29.4.