Skip to content

AWS Lambda 는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스입니다.

이 가이드에서는 Dockerfile 을 사용하여 Bun HTTP 서버를 AWS Lambda 에 배포합니다.

NOTE

계속하기 전에 다음이 준비되어 있는지 확인하세요:
  • 배포할 준비가 된 Bun 애플리케이션
  • AWS 계정
  • 설치 및 설정이 완료된 AWS CLI
  • 설치되어 PATH 에 추가된 Docker

새 Dockerfile 만들기

프로젝트가 있는 디렉터리에 있는지 확인한 후 프로젝트 루트에 새 Dockerfile 을 만듭니다. 이 파일에는 컨테이너를 초기화하고 로컬 프로젝트 파일을 복사하고 종속성을 설치하고 애플리케이션을 시작하는 지침이 포함되어 있습니다.

docker
# Lambda 런타임을 처리하기 위해 공식 AWS Lambda 어댑터 이미지 사용
FROM public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 AS aws-lambda-adapter

# 애플리케이션 실행을 위한 공식 Bun 이미지 사용
FROM oven/bun:debian AS bun_latest

# 컨테이너에 Lambda 어댑터 복사
COPY --from=aws-lambda-adapter /lambda-adapter /opt/extensions/lambda-adapter

# 포트를 8080 으로 설정합니다. 이는 AWS Lambda 어댑터에 필요합니다.
ENV PORT=8080

# 작업 디렉터리를 `/var/task` 로 설정합니다. 이는 Lambda 의 기본 작업 디렉터리입니다.
WORKDIR "/var/task"

# package.json 과 bun.lock 을 컨테이너에 복사
COPY package.json bun.lock ./

# 종속성 설치
RUN bun install --production --frozen-lockfile

# 나머지 애플리케이션을 컨테이너에 복사
COPY . /var/task

# 애플리케이션 실행
CMD ["bun", "index.ts"]

NOTE

시작 명령이 애플리케이션의 진입점에 해당하는지 확인하세요. `package.json` 에 시작 스크립트가 있는 경우 `CMD ["bun", "run", "start"]` 를 사용할 수도 있습니다.

이 이미지는 종속성을 설치하고 컨테이너 내에서 Bun 으로 앱을 실행합니다. 앱에 종속성이 없는 경우 RUN bun install --production --frozen-lockfile 라인을 생략할 수 있습니다.

프로젝트 루트에 새 .dockerignore 파일을 만듭니다. 이 파일에는 node_modules 와 같이 컨테이너 이미지에서 제외 해야 하는 파일과 디렉터리가 포함되어 있습니다. 이렇게 하면 빌드가 더 빠르고 작아집니다:

docker
node_modules
Dockerfile*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
.env
# 제외하려는 기타 파일 또는 디렉터리

Docker 이미지 빌드하기

Dockerfile 이 있는 디렉터리에 있는지 확인한 후 Docker 이미지를 빌드합니다. 이 경우 이미지를 bun-lambda-demo 라고 하고 latest 로 태그를 지정합니다.

bash
# cd /path/to/your/app
docker build --provenance=false --platform linux/amd64 -t bun-lambda-demo:latest .

ECR 리포지토리 생성하기

이미지를 AWS Lambda 에 푸시하려면 먼저 이미지를 푸시할 ECR 리포지토리 를 생성해야 합니다.

다음 명령을 실행하면:

  • us-east-1 리전에 bun-lambda-demo 라는 ECR 리포지토리를 생성합니다
  • 리포지토리 URI 를 가져와서 환경 변수로 내보냅니다. 이는 선택 사항이지만 다음 단계를 더 쉽게 만듭니다.
bash
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --query 'repository.repositoryUri' --output text)
echo $ECR_URI
txt
[id].dkr.ecr.us-east-1.amazonaws.com/bun-lambda-demo

NOTE

IAM Identity Center(SSO) 를 사용하거나 AWS CLI 를 프로필과 함께 구성한 경우 AWS CLI 명령에 `--profile` 플래그를 추가해야 합니다.

예를 들어 프로필 이름이 my-sso-app 인 경우 --profile my-sso-app 를 사용합니다. 사용 가능한 프로필을 확인하려면 aws configure list-profiles 로 AWS CLI 구성을 확인하세요.

bash
export ECR_URI=$(aws ecr create-repository --repository-name bun-lambda-demo --region us-east-1 --profile my-sso-app --query 'repository.repositoryUri' --output text)
echo $ECR_URI

ECR 리포지토리로 인증하기

ECR 리포지토리에 로그인합니다:

bash
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_URI
txt
Login Succeeded

NOTE

프로필을 사용하는 경우 `--profile` 플래그를 사용합니다:
bash
aws ecr get-login-password --region us-east-1 --profile my-sso-app | docker login --username AWS --password-stdin $ECR_URI

Docker 이미지를 ECR 리포지토리에 태그하고 푸시하기

Dockerfile 이 있는 디렉터리에 있는지 확인한 후 ECR 리포지토리 URI 로 Docker 이미지에 태그를 지정합니다.

bash
docker tag bun-lambda-demo:latest ${ECR_URI}:latest

그런 다음 이미지를 ECR 리포지토리에 푸시합니다.

bash
docker push ${ECR_URI}:latest

AWS Lambda 함수 생성하기

AWS Console > Lambda > Create Function 으로 이동하여 Container image 를 선택합니다.

Create Function

my-bun-function 과 같이 함수에 이름을 지정합니다.

컨테이너 이미지 선택하기

그런 다음 Container image URI 섹션으로 이동하여 Browse images 를 클릭합니다. 방금 ECR 리포지토리에 푸시한 이미지를 선택합니다.

Select Container Repository

그런 다음 latest 이미지를 선택하고 Select image 를 클릭합니다.

Select Container Image

함수 구성하기

함수에 대한 공개 URL 을 얻으려면 Additional configurations > Networking > Function URL 로 이동해야 합니다.

이것을 Enable 로 설정하고 Auth Type 을 NONE 으로 설정합니다.

Set the Function URL

함수 생성하기

페이지 하단의 Create function 을 클릭하면 함수가 생성됩니다.

Create Function

함수 URL 가져오기

함수가 생성되면 함수 페이지로 리디렉션되며 Function URL 섹션에서 함수 URL 을 확인할 수 있습니다.

Function URL

함수 테스트하기

🥳 앱이 이제 실행되었습니다! 함수를 테스트하려면 Test 탭으로 이동하거나 함수 URL 을 직접 호출할 수 있습니다.

bash
curl -X GET https://[your-function-id].lambda-url.us-east-1.on.aws/
txt
Hello from Bun on Lambda!

Bun by www.bunjs.com.cn 편집