AWS Lambda — это серверless-сервис вычислений, который позволяет запускать код без выделения или управления серверами.
В этом руководстве мы развернём HTTP-сервер Bun на AWS Lambda с использованием Dockerfile.
NOTE
Перед продолжением убедитесь, что у вас есть:Создание нового Dockerfile
Убедитесь, что вы находитесь в директории с вашим проектом, затем создайте новый Dockerfile в корне вашего проекта. Этот файл содержит инструкции для инициализации контейнера, копирования локальных файлов проекта, установки зависимостей и запуска приложения.
# Используем официальный образ адаптера AWS Lambda для обработки среды выполнения Lambda
FROM public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 AS aws-lambda-adapter
# Используем официальный образ Bun для запуска приложения
FROM oven/bun:debian AS bun_latest
# Копируем адаптер Lambda в контейнер
COPY --from=aws-lambda-adapter /lambda-adapter /opt/extensions/lambda-adapter
# Устанавливаем порт 8080. Это требуется для адаптера AWS Lambda.
ENV PORT=8080
# Устанавливаем рабочую директорию `/var/task`. Это рабочая директория по умолчанию для Lambda.
WORKDIR "/var/task"
# Копируем package.json и bun.lock в контейнер
COPY package.json bun.lock ./
# Устанавливаем зависимости
RUN bun install --production --frozen-lockfile
# Копируем остальную часть приложения в контейнер
COPY . /var/task
# Запускаем приложение.
CMD ["bun", "index.ts"]NOTE
Убедитесь, что команда запуска соответствует точке входа вашего приложения. Это также может быть `CMD ["bun", "run", "start"]`, если у вас есть скрипт start в `package.json`.Этот образ устанавливает зависимости и запускает ваше приложение с Bun внутри контейнера. Если у вашего приложения нет зависимостей, вы можете опустить строку RUN bun install --production --frozen-lockfile.
Создайте новый файл .dockerignore в корне вашего проекта. Этот файл содержит файлы и директории, которые должны быть исключены из образа контейнера, такие как node_modules. Это делает ваши сборки быстрее и меньше:
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Любые другие файлы или директории, которые вы хотите исключитьСборка образа Docker
Убедитесь, что вы находитесь в директории с вашим Dockerfile, затем соберите образ Docker. В этом случае мы назовём образ bun-lambda-demo и пометим его как latest.
# cd /path/to/your/app
docker build --provenance=false --platform linux/amd64 -t bun-lambda-demo:latest .Создание репозитория ECR
Чтобы отправить образ в AWS Lambda, сначала нужно создать репозиторий ECR для отправки образа.
Выполнив следующую команду, мы:
- Создадим репозиторий ECR с именем
bun-lambda-demoв регионеus-east-1 - Получим URI репозитория и экспортируем URI репозитория как переменную окружения. Это необязательно, но облегчит следующие шаги.
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --query 'repository.repositoryUri' --output text)
echo $ECR_URI[id].dkr.ecr.us-east-1.amazonaws.com/bun-lambda-demoNOTE
Если вы используете IAM Identity Center (SSO) или настроили AWS CLI с профилями, вам нужно добавить флаг `--profile` к вашим командам AWS CLI.Например, если ваш профиль называется my-sso-app, используйте --profile my-sso-app. Проверьте конфигурацию AWS CLI с помощью aws configure list-profiles, чтобы увидеть доступные профили.
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --profile my-sso-app --query 'repository.repositoryUri' --output text)
echo $ECR_URIАутентификация в репозитории ECR
Войдите в репозиторий ECR:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_URILogin SucceededNOTE
При использовании профиля используйте флаг `--profile`:aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URIТегирование и отправка образа Docker в репозиторий ECR
Убедитесь, что вы находитесь в директории с вашим Dockerfile, затем пометьте образ Docker URI репозитория ECR.
docker tag bun-lambda-demo:latest ${ECR_URI}:latestЗатем отправьте образ в репозиторий ECR.
docker push ${ECR_URI}:latestСоздание функции AWS Lambda
Перейдите в AWS Console > Lambda > Create Function > Выберите Container image

Дайте функции имя, например my-bun-function.
Выбор образа контейнера
Затем перейдите в раздел Container image URI, нажмите Browse images. Выберите образ, который мы только что отправили в репозиторий ECR.

Затем выберите образ latest и нажмите Select image.

Настройка функции
Чтобы получить публичный URL для функции, нужно перейти в Additional configurations > Networking > Function URL.
Установите Enable, с типом аутентификации NONE.

Создание функции
Нажмите Create function внизу страницы, это создаст функцию.

Получение URL функции
После создания функции вы будете перенаправлены на страницу функции, где сможете увидеть URL функции в разделе "Function URL".

Тестирование функции
🥳 Ваше приложение теперь работает! Для тестирования функции вы можете либо перейти на вкладку Test, либо напрямую вызвать URL функции.
curl -X GET https://[your-function-id].lambda-url.us-east-1.on.aws/Hello from Bun on Lambda!