Что где работает
| Сервис AWS | Локальный аналог | Локальный рабочий процесс |
|---|---|---|
| Задача ECS, задача Fargate | Docker Compose с образами задачи | Запускайте сервисы вместе с проверками состояния и опубликованными портами |
| Lambda (контейнерный образ) | Базовый образ Lambda с Runtime Interface Emulator | Вызывайте функцию по HTTP нативно на arm64 |
| S3 и другие API AWS | LocalStack | Разрабатывайте операции с бакетами и объектами S3 локально |
| EKS | kubectl и k9s для реального кластера; kwok для локального API | Собирайте и тестируйте локально, затем используйте kubectl и k9s с вашим кластером |
Задачи ECS и Fargate как проект Compose
Определение задачи ECS — список контейнеров с образами, окружением, сопоставлениями портов, проверками состояния и порядком запуска. Compose описывает то же самое, поэтому преобразование прямое: один сервис на определение контейнера.
| Определение задачи | compose.yaml |
|---|---|
image | image |
environment, secrets | environment, env_file (не храните настоящие секреты в файле) |
portMappings | ports |
healthCheck | healthcheck |
dependsOn с HEALTHY | depends_on с condition: service_healthy |
runtimePlatform.cpuArchitecture | platform: linux/amd64 или 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 Мы проверили этот подход в Oxcart с Postgres 17 и сервисом nginx, ожидающим service_healthy: up --wait завершился, когда оба сервиса были готовы, а опубликованный порт отвечал на localhost. Для образов amd64, собранных на Mac, указывайте ту же платформу при запуске; локально собранный образ только для amd64 находится лишь с --platform linux/amd64 (или platform: в Compose).
Запустите и вызовите контейнерный образ Lambda локально
- Напишите обработчик. Создайте
app.pyс функциейhandler(event, context), возвращающей словарь, например{"statusCode": 200, "body": "hello"}. - Напишите Dockerfile. Начните с базового образа AWS Lambda, включающего Runtime Interface Emulator:
FROM public.ecr.aws/lambda/python:3.13, затемCOPY app.py ${LAMBDA_TASK_ROOT}/иCMD ["app.handler"]. - Соберите образ. Выполните
docker build -t my-lambda .. Добавьте--platform linux/amd64, если функция настроена для x86_64. - Запустите. Выполните
docker run -d -p 9000:8080 my-lambda. Эмулятор слушает на порту 8080 внутри контейнера. - Вызовите. Выполните
curl -XPOST localhost:9000/2015-03-31/functions/function/invocations -d '{}'. Ответ — возвращаемое значение обработчика, аdocker logsпоказывает строку Lambda REPORT с длительностью.
В нашем запуске функция ответила {"statusCode": 200, "body": "hello from lambda on aarch64"}, а лог контейнера показал строку Lambda REPORT с длительностью 19 ms. Эмулятор выпускает сама AWS: «прокси для API Runtime и Extensions Lambda», который создаёт конечную точку /2015-03-31/functions/function/invocations.
API AWS через LocalStack
LocalStack эмулирует API AWS в одном контейнере на порту 4566. В Oxcart мы запустили образ 4.9 и проверили полный цикл работы с S3:
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 Изучите лицензию перед использованием. С 23 марта 2026 года последние версии LocalStack требуют аккаунт LocalStack и токен аутентификации; без LOCALSTACK_AUTH_TOKEN актуальный образ завершается с «License activation failed». Бесплатный план Hobby предназначен для некоммерческого использования; ECS доступен начиная с Base, EKS — с Ultimate.
Отправьте в ECR и разверните
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 хранит пароль реестра в Связке ключей macOS, а не в ~/.docker/config.json. Отправка мультиплатформенного образа из Oxcart не поддерживается: отправляйте тег для каждой архитектуры или публикуйте мультиархитектурные манифесты через CI.
EKS с вашего Mac
aws eks update-kubeconfig --name my-cluster добавляет кластер в kubeconfig для работы с kubectl и k9s из macOS. Разрабатывайте и тестируйте сервисы локально в Oxcart, затем развёртывайте те же образы в EKS. Для локальной проверки манифестов и контроллеров kwok предоставляет настоящий API-сервер Kubernetes с имитацией узлов. Руководство по Kubernetes на Mac объясняет, как эти процессы сочетаются.
Почему локальный цикл полезен
Каждое изменение, проверенное локально, избавляет от push, развёртывания и поиска по логам. Oxcart сокращает цикл: 42 ms для docker run --rm, 0.69 s на создание и запуск 20 контейнеров и 77 ms на их остановку и удаление — лучший результат из трёх протестированных сред. Исходящие соединения контейнеров открывает Mac, поэтому VPN в вашу сеть AWS действует и для них.
Вопросы
Как локально проверить задачу ECS или Fargate на Mac?
Запускайте контейнеры задачи через Docker Compose: один сервис на определение контейнера с тем же образом, окружением, портами, проверкой состояния и зависимостями. docker compose up -d --wait завершается после готовности всех сервисов с проверками состояния. Oxcart запускает стек с зависимостями от проверок и опубликованными портами, чтобы проверить сервисы вместе до развёртывания.
Можно ли запускать контейнерные образы AWS Lambda локально на Apple silicon?
Да. Базовые образы AWS Lambda включают Runtime Interface Emulator. В Oxcart мы собрали функцию Python 3.13 из public.ecr.aws/lambda/python:3.13, запустили с -p 9000:8080 и вызвали через curl: она ответила HTTP 200 нативно на arm64.
Работает ли LocalStack в Oxcart?
Да, как контейнер. Мы проверили создание бакета, put, get и list S3 на localhost:4566 с образом LocalStack 4.9. Актуальным версиям нужны аккаунт LocalStack и токен в LOCALSTACK_AUTH_TOKEN; без него последний образ завершается. Согласно документации LocalStack, ECS доступен с Base, EKS — с Ultimate.
Как отправить образ в Amazon ECR с Mac?
Войдите через aws ecr get-login-password --region REGION | docker login --username AWS --password-stdin ACCOUNT.dkr.ecr.REGION.amazonaws.com, затем назначьте тег и выполните docker push. В Oxcart docker login хранит пароль в Связке ключей macOS.
Какие образы собирать для Fargate: amd64 или arm64?
Ориентируйтесь на платформу в определении задачи. Для ARM64 собирайте нативные образы arm64 на Mac; для X86_64 — с --platform linux/amd64. Oxcart запускает образы amd64 локально через Rosetta, позволяя проверить именно тот образ, который будет развёрнут.
Как разрабатывать для EKS на Mac?
Собирайте и проверяйте приложение с зависимостями локально в Oxcart, затем отправляйте образы в ECR. Используйте kubectl и k9s на Mac для работы с кластером EKS, а kwok в Oxcart — для проверки манифестов на локальном Kubernetes API. См. руководство по Kubernetes на Mac.
Источники и методика
- Примеры проверены с Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (Compose, базовый образ Lambda с эмулятором, S3 LocalStack 4.9, Buildx).
- Аутентификация LocalStack: https://blog.localstack.cloud/localstack-single-image-next-steps/; планы: 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 и 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. Проверено 2026-10-10.
- Скорость контейнеров: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPU и 12 GiB, медианы пяти замеров; остальные среды измерены ранее в тот же день на том же Mac и тем же набором тестов с клиентом docker 29.4.