コンテンツにスキップ

Bun+Honoで実装したAPIサーバをAWS Lambdaで動かす

Bunランタイムで動かす(Node.jsやLLRTでは動かさない)

https://github.com/mktbsh/bun-on-lambda

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

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テンプレート(インフラ構成)

Section titled “SAMテンプレート(インフラ構成)”
  • AWS Lambda
  • AWS Lambda Function URL
  • AWS IAM(作りたくなければ FunctionのPropertiesでRoleを指定)
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

ローカル開発時はnpm-scriptsに記載したdevコマンドで起動。(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)/.

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

APIの実装(Honoの実装)はappディレクトリ配下に集約するようなイメージ

lambda.ts
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

基本的には併用を推奨。

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