Bun+Honoで実装したAPIサーバをAWS Lambdaで動かす
実現したいこと
Section titled “実現したいこと”Bunランタイムで動かす(Node.jsやLLRTでは動かさない)
ソースコード
Section titled “ソースコード”https://github.com/mktbsh/bun-on-lambda
- Single File Executable(実行可能バイナリ)としてコンパイルする
- AWS Lambda Web Adapterを使って動かす
LWAは使わなくても動かせると思うが直近はLWAを触っていたこともあって、そちらの動作確認を優先した。
- Bun
- Hono
- AWS SAM
- AWS Lambda Web Adapter
ディレクトリ構成
Section titled “ディレクトリ構成”.├── 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-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
ローカル開発時はnpm-scriptsに記載したdevコマンドで起動。(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)/.
エントリーポイント
Section titled “エントリーポイント”特に難しいことはしていない。PORT番号を環境変数から受け取るだけ。
APIの実装(Honoの実装)はappディレクトリ配下に集約するようなイメージ
import { app } from './app'
export default { port: process.env.PORT, fetch: app.fetch,}
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.aws
CloudFrontと併用する場合
Section titled “CloudFrontと併用する場合”基本的には併用を推奨。
- Lambda Function URLのAuthTypeをIAM_AUTHに変更する
- CloudFrontでLambda Function URL用のOACを作成
- Lambdaのリソースベースのポリシーステートメントを更新する