logo hsb.horse
← ブログ一覧に戻る

ブログ

Bun+HonoでビルドしたAPIサーバをAWS Lambdaで動かす方法

BunランタイムでHono APIサーバをAWS Lambda上で動作させる手順。Single File Executableとしてコンパイルし、Lambda Web Adapterで動かす構成を解説。

公開日:

BunランタイムでHonoを使ったAPIサーバを、AWS Lambda上で動かす構成をまとめる。

Node.jsやLLRTではなく、Bunランタイムで動かすのが目的だ。

ソースコード

mktbsh/bun-on-lambda

実現方法

  1. Single File Executable(実行可能バイナリ)としてコンパイルする
  2. AWS Lambda Web Adapter(LWA)を使って動かす

LWAを使わなくても動かせると思うが、今回はLWAを使った動作確認を優先した。

使用技術

  • Bun
  • Hono
  • AWS SAM
  • AWS Lambda Web Adapter

ディレクトリ構成

.
├── Makefile
├── README.md
├── app
│ └── index.ts
├── bun.lockb
├── lambda.ts
├── localhost.ts
├── package.json
├── samconfig.toml
├── template.yaml
└── tsconfig.json

SAMテンプレート(インフラ構成)

AWS Lambda、Lambda Function URL、IAMロールを定義する。

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: >
bun compiled sfe binary on Lambda demo
Globals:
Function:
Timeout: 10
Resources:
BunAppFunction:
DeletionPolicy: Delete
Type: AWS::Serverless::Function
Properties:
CodeUri: .
MemorySize: 256
Handler: bootstrap
Runtime: provided.al2023
Architectures:
- x86_64
Environment:
Variables:
PORT: "8000"
Layers:
- !Sub arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:22
FunctionUrlConfig:
AuthType: NONE
Metadata:
BuildMethod: makefile
Outputs:
FunctionUrl:
Value: !GetAtt BunAppFunctionUrl.FunctionUrl

ビルド設定

ローカル開発時はbun --hot localhost.tsで起動。

sam build時はMakefileのBuildタスクが実行される。ここが今回の肝だ。

Terminal window
bun build --compile --minify --sourcemap --target=bun-linux-x64 ./lambda.ts --outfile bootstrap
cp ./bootstrap $(ARTIFACTS_DIR)/.

Bunの--compileオプションで実行可能バイナリを生成し、bootstrapという名前で出力する。

エントリーポイント

特に難しいことはしていない。PORT番号を環境変数から受け取るだけ。

APIの実装(Honoの実装)はappディレクトリ配下に集約する。

import { app } from "./app";
export default {
port: process.env.PORT,
fetch: app.fetch,
};

デプロイ

samconfig.tomlを設定する。

version = 0.1
[default.deploy.parameters]
stack_name = "<your_stack_name>"
resolve_s3 = true
s3_prefix = "<your_stack_name>"
region = "<region>"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"

デプロイコマンド:

Terminal window
sam deploy

成功すると下記のようなURLが発行される。

https://<random-string>.lambda-url.<region>.on.aws

CloudFrontと併用する場合

基本的には併用を推奨。

  • Lambda Function URLのAuthTypeをIAM_AUTHに変更する
  • CloudFrontでLambda Function URL用のOACを作成
  • Lambdaのリソースベースのポリシーステートメントを更新する

まとめ

BunのSingle File Executableとして compiled し、Lambda Web Adapterを使うことで、BunランタイムでHono APIサーバをLambda上で動かせる。

ローカル開発とデプロイの差分が小さく、Bunの高速性をLambda環境でも活かせる構成だ。