Skip to content

AWS Lambda — это серверless-сервис вычислений, который позволяет запускать код без выделения или управления серверами.

В этом руководстве мы развернём HTTP-сервер Bun на AWS Lambda с использованием Dockerfile.

NOTE

Перед продолжением убедитесь, что у вас есть:
  • Приложение Bun, готовое к развёртыванию
  • Учётная запись AWS
  • Установлен и настроен AWS CLI
  • Установлен Docker и добавлен в PATH

Создание нового Dockerfile

Убедитесь, что вы находитесь в директории с вашим проектом, затем создайте новый Dockerfile в корне вашего проекта. Этот файл содержит инструкции для инициализации контейнера, копирования локальных файлов проекта, установки зависимостей и запуска приложения.

docker
# Используем официальный образ адаптера 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. Это делает ваши сборки быстрее и меньше:

docker
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# Любые другие файлы или директории, которые вы хотите исключить

Сборка образа Docker

Убедитесь, что вы находитесь в директории с вашим Dockerfile, затем соберите образ Docker. В этом случае мы назовём образ bun-lambda-demo и пометим его как latest.

bash
# 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 репозитория как переменную окружения. Это необязательно, но облегчит следующие шаги.
bash
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --query 'repository.repositoryUri' --output text)
echo $ECR_URI
txt
[id].dkr.ecr.us-east-1.amazonaws.com/bun-lambda-demo

NOTE

Если вы используете IAM Identity Center (SSO) или настроили AWS CLI с профилями, вам нужно добавить флаг `--profile` к вашим командам AWS CLI.

Например, если ваш профиль называется my-sso-app, используйте --profile my-sso-app. Проверьте конфигурацию AWS CLI с помощью aws configure list-profiles, чтобы увидеть доступные профили.

bash
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:

bash
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_URI
txt
Login Succeeded

NOTE

При использовании профиля используйте флаг `--profile`:
bash
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.

bash
docker tag bun-lambda-demo:latest ${ECR_URI}:latest

Затем отправьте образ в репозиторий ECR.

bash
docker push ${ECR_URI}:latest

Создание функции AWS Lambda

Перейдите в AWS Console > Lambda > Create Function > Выберите Container image

Create Function

Дайте функции имя, например my-bun-function.

Выбор образа контейнера

Затем перейдите в раздел Container image URI, нажмите Browse images. Выберите образ, который мы только что отправили в репозиторий ECR.

Select Container Repository

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

Select Container Image

Настройка функции

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

Установите Enable, с типом аутентификации NONE.

Set the Function URL

Создание функции

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

Create Function

Получение URL функции

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

Function URL

Тестирование функции

🥳 Ваше приложение теперь работает! Для тестирования функции вы можете либо перейти на вкладку Test, либо напрямую вызвать URL функции.

bash
curl -X GET https://[your-function-id].lambda-url.us-east-1.on.aws/
txt
Hello from Bun on Lambda!

Bun от www.bunjs.com.cn