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를 사용한 동작 확인을 우선했다.

사용 기술

  • Hono
  • AWS SAM
  • AWS Lambda 웹 어댑터

디렉토리 구성

.
├── 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 환경에서도 살릴 수 있는 구성이다.