BunランタイムでHonoを使ったAPIサーバを、AWS Lambda上で動かす構成をまとめる。
Node.jsやLLRTではなく、Bunランタイムで動かすのが目的だ。
ソースコード
実現方法
- Single File Executable(実行可能バイナリ)としてコンパイルする
- 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.jsonSAMテンプレート(インフラ構成)
AWS Lambda、Lambda Function URL、IAMロールを定義する。
AWSTemplateFormatVersion: "2010-09-09"Transform: AWS::Serverless-2016-10-31Description: > 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タスクが実行される。ここが今回の肝だ。
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 = trues3_prefix = "<your_stack_name>"region = "<region>"confirm_changeset = truecapabilities = "CAPABILITY_IAM"デプロイコマンド:
sam deploy成功すると下記のようなURLが発行される。
https://<random-string>.lambda-url.<region>.on.awsCloudFrontと併用する場合
基本的には併用を推奨。
- 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環境でも活かせる構成だ。
hsb.horse