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