Skip to content

AWS Lambda は、サーバーをプロビジョニングまたは管理せずにコードを実行できるサーバーレスコンピューティングサービスです。

このガイドでは、Dockerfile を使用して Bun HTTP サーバーを AWS Lambda にデプロイします。

NOTE

続行する前に、以下が準備されていることを確認してください。
  • デプロイ準備が整った Bun アプリケーション
  • AWS アカウント
  • インストールおよび設定済みの AWS CLI
  • インストール済みで PATH に追加された Docker

新しい Dockerfile を作成する

プロジェクトディレクトリにいることを確認し、プロジェクトのルートに新しい Dockerfile を作成します。このファイルには、コンテナの初期化、ローカルプロジェクトファイルのコピー、依存関係のインストール、アプリケーションの起動に関する指示が含まれています。

docker
# Lambda ランタイムを処理するために公式の AWS 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

スタートコマンドがアプリケーションのエントリポイントに対応していることを確認してください。`package.json` にスタートスクリプトがある場合は、`CMD ["bun", "run", "start"]` にすることもできます。

このイメージは依存関係をインストールし、コンテナ内で 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 リポジトリ を作成してイメージをプッシュする必要があります。

以下のコマンドを実行すると、以下のことを行います。

  • us-east-1 リージョンに bun-lambda-demo という名前の ECR リポジトリを作成
  • リポジトリ 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 をプロファイルで設定している場合は、AWS CLI コマンドに `--profile` フラグを追加する必要があります。

例えば、プロファイル名が my-sso-app の場合は、--profile my-sso-app を使用します。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 を含むディレクトリにいることを確認し、ECR リポジトリ URI で Docker イメージにタグを付けます。

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

次に、イメージを ECR リポジトリにプッシュします。

bash
docker push ${ECR_URI}:latest

AWS Lambda 関数を作成する

AWS コンソール > Lambda > 関数の作成 に移動し、コンテナイメージ を選択します。

関数の作成

関数に my-bun-function のような名前を付けます。

コンテナイメージを選択する

次に、コンテナイメージ URI セクションに移動し、イメージの参照 をクリックします。先ほど ECR リポジトリにプッシュしたイメージを選択します。

コンテナリポジトリの選択

次に、latest イメージを選択し、イメージの選択 をクリックします。

コンテナイメージの選択

関数を設定する

関数のパブリック URL を取得するには、追加の設定 > ネットワーキング > 関数 URL に移動します。

これを 有効 に設定し、認証タイプを NONE に設定します。

関数 URL の設定

関数を作成する

ページの下部にある 関数の作成 をクリックすると、関数が作成されます。

関数の作成

関数 URL を取得する

関数が作成されると、関数のページにリダイレクトされ、「関数 URL」 セクションに関数 URL が表示されます。

関数 URL

関数をテストする

🥳 アプリが稼働しました!関数をテストするには、テスト タブに移動するか、関数 URL を直接呼び出します。

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

Bun by www.bunjs.com.cn 編集