Was wo läuft
| AWS-Dienst | Lokale Entsprechung | Dein lokaler Workflow |
|---|---|---|
| ECS-Task, Fargate-Task | Docker Compose mit den Images des Tasks | Services gemeinsam mit Healthchecks und veröffentlichten Ports ausführen |
| Lambda (Containerimage) | Lambda-Basisimage mit Runtime Interface Emulator | Deine Funktion über HTTP auf nativem arm64 aufrufen |
| S3 und andere AWS-APIs | LocalStack | S3-Bucket- und Objektoperationen lokal entwickeln |
| EKS | kubectl und k9s mit dem echten Cluster; kwok für eine lokale API | Lokal bauen und testen, dann kubectl und k9s mit deinem Cluster verwenden |
ECS- und Fargate-Tasks als Compose-Projekt
Eine ECS-Taskdefinition ist eine Liste von Containern mit Images, Umgebung, Portzuordnungen, Healthchecks und Startreihenfolge. Compose beschreibt dieselben Dinge. Die Übertragung ist daher direkt: ein Service pro Containerdefinition.
| Taskdefinition | compose.yaml |
|---|---|
image | image |
environment, secrets | environment, env_file (echte Geheimnisse nicht in der Datei speichern) |
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 Wir haben dieses Muster auf Oxcart mit Postgres 17 und einem nginx-Service geprüft, der auf service_healthy wartet: up --wait kehrte zurück, als beide gesund waren und der veröffentlichte Port auf localhost antwortete. Übergib bei amd64-Images, die du auf deinem Mac baust, dieselbe Plattform auch beim Ausführen. Ein lokal gebautes, nur für amd64 verfügbares Image wird nur gefunden, wenn --platform linux/amd64 (oder platform: in Compose) gesetzt ist.
Ein Lambda-Containerimage lokal ausführen und aufrufen
- Schreibe den Handler. Erstelle
app.pymit einer Funktionhandler(event, context), die ein dict zurückgibt, zum Beispiel{"statusCode": 200, "body": "hello"}. - Schreibe das Dockerfile. Beginne mit einem AWS-Lambda-Basisimage, das den Runtime Interface Emulator enthält:
FROM public.ecr.aws/lambda/python:3.13, dannCOPY app.py ${LAMBDA_TASK_ROOT}/undCMD ["app.handler"]. - Baue das Image. Führe
docker build -t my-lambda .aus. Füge--platform linux/amd64hinzu, wenn deine Funktion für x86_64 konfiguriert ist. - Führe es aus. Führe
docker run -d -p 9000:8080 my-lambdaaus. Der Emulator lauscht auf Port 8080 im Container. - Rufe die Funktion auf. Führe
curl -XPOST localhost:9000/2015-03-31/functions/function/invocations -d '{}'aus. Die Antwort ist der Rückgabewert deines Handlers, unddocker logszeigt die Lambda-REPORT-Zeile mit der Dauer.
In unserem Durchlauf antwortete die Funktion mit {"statusCode": 200, "body": "hello from lambda on aarch64"}, und das Containerlog zeigte die Lambda-Zeile REPORT mit einer Dauer von 19 ms. Der Emulator stammt von AWS: „ein Proxy für die Runtime- und Extensions-APIs von Lambda“, der den Endpunkt /2015-03-31/functions/function/invocations bereitstellt.
AWS-APIs mit LocalStack
LocalStack emuliert AWS-APIs in einem Container auf Port 4566. Auf Oxcart haben wir das Image 4.9 ausgeführt und S3 durchgängig geprüft:
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 Kenne die Lizenzbedingungen, bevor du darauf aufbaust. Seit dem 23. März 2026 benötigen die neuesten LocalStack-Versionen ein LocalStack-Konto und ein Authentifizierungstoken. Ohne LOCALSTACK_AUTH_TOKEN beendet sich das neueste Image mit „License activation failed“. LocalStacks kostenloser Hobby-Tarif ist für nicht kommerzielle Nutzung bestimmt, ECS ist ab dem Base-Tarif verfügbar und EKS ab dem Ultimate-Tarif.
Nach ECR pushen und bereitstellen
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 speichert das Registry-Passwort im macOS-Schlüsselbund, nicht in ~/.docker/config.json. Das Pushen eines Images für mehrere Plattformen aus Oxcart wird nicht unterstützt: Pushe einen Tag pro Architektur oder veröffentliche Manifeste für mehrere Architekturen aus CI.
EKS von deinem Mac aus
aws eks update-kubeconfig --name my-cluster fügt den Cluster deiner kubeconfig hinzu, damit du kubectl und k9s von macOS aus verwenden kannst. Entwickle und teste deine Services lokal mit Oxcart und stelle dann dieselben Images auf EKS bereit. Für lokale Manifest- und Controller-Tests bietet kwok einen echten Kubernetes-API-Server mit simulierten Nodes. Die Anleitung zu Kubernetes auf dem Mac erklärt, wie diese Workflows zusammenpassen.
Warum sich der lokale Entwicklungszyklus lohnt
Jede lokal getestete Änderung spart einen Push, ein Deployment und die Suche in Logs. Oxcart hält diesen Zyklus kurz: 42 ms für docker run --rm, 0.69 s zum Erstellen und Starten von 20 Containern und 77 ms zum Stoppen und Entfernen, am schnellsten unter den drei getesteten Laufzeitumgebungen. Ausgehende Verbindungen von Containern werden von deinem Mac geöffnet. Ein VPN in dein AWS-Netzwerk gilt daher auch für sie.
Fragen
Wie teste ich einen ECS- oder Fargate-Task lokal auf dem Mac?
Führe die Container des Tasks mit Docker Compose aus: ein Service pro Containerdefinition mit demselben Image, derselben Umgebung, denselben Portzuordnungen, Healthchecks und Abhängigkeiten. docker compose up -d --wait kehrt zurück, wenn jeder Service mit Healthcheck gesund ist. Oxcart führt den Stack mit Healthcheck-Abhängigkeiten und veröffentlichten Ports aus, damit du die Services vor dem Deployment gemeinsam testen kannst.
Kann ich AWS-Lambda-Containerimages lokal auf Apple-Chips ausführen?
Ja. AWS-Lambda-Basisimages enthalten den Runtime Interface Emulator. Auf Oxcart haben wir eine Python-3.13-Funktion auf Basis von public.ecr.aws/lambda/python:3.13 gebaut, mit -p 9000:8080 ausgeführt und mit curl aufgerufen: Sie antwortete nativ auf arm64 mit HTTP 200.
Funktioniert LocalStack auf Oxcart?
Ja, als Container. Wir haben mit dem LocalStack-Image 4.9 das Erstellen von S3-Buckets sowie put, get und list gegen localhost:4566 geprüft. Aktuelle LocalStack-Versionen benötigen ein LocalStack-Konto und ein Authentifizierungstoken, gesetzt als LOCALSTACK_AUTH_TOKEN; ohne dieses beendet sich das neueste Image. LocalStack dokumentiert ECS ab dem Base-Tarif und EKS ab dem Ultimate-Tarif.
Wie pushe ich ein Image vom Mac nach Amazon ECR?
Melde dich mit aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin ACCOUNT.dkr.ecr.REGION.amazonaws.com an, vergib dann einen Tag und führe docker push aus. Auf Oxcart speichert docker login das Passwort im macOS-Schlüsselbund.
Sollte ich amd64- oder arm64-Images für Fargate bauen?
Richte dich nach der Laufzeitplattform der Taskdefinition. Bei ARM64 baust du native arm64-Images auf deinem Mac; bei X86_64 baust du mit --platform linux/amd64. Oxcart führt amd64-Images lokal über Rosetta aus, damit du genau das Image testen kannst, das du bereitstellst.
Wie entwickle ich auf meinem Mac für EKS?
Baue und teste deine App und ihre Abhängigkeiten lokal mit Oxcart und pushe die Images dann nach ECR. Arbeite mit kubectl und k9s auf dem Mac mit deinem EKS-Cluster und nutze kwok auf Oxcart, um Manifeste gegen eine lokale Kubernetes-API zu prüfen. Siehe die Anleitung zu Kubernetes auf dem Mac.
Quellen und Methode
- Beispiele getestet mit Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (Compose, Lambda-Basisimage mit Emulator, LocalStack 4.9 S3, Buildx).
- LocalStack-Authentifizierung: https://blog.localstack.cloud/localstack-single-image-next-steps/; Tarife: 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 und 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. Geprüft am 2026-10-10.
- Containergeschwindigkeit: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPUs und 12 GiB, Mediane aus fünf Messungen; die anderen Laufzeitumgebungen wurden früher am selben Tag auf demselben Mac mit demselben Messaufbau und dem docker-Client 29.4 gemessen.