행궁동 데이터 엔지니어

반응형

회사에서 TypeScript로 AWS Lambda를 배포해 여러 서비스를 운영하고 있습니다.
회사에는 시니어 분들이 만든 CDK 기반 배포 라이브러리와 템플릿 그리고 참고할 수 있는 여러 코드들이 있기에 Lambda를 배포하고 유지보수하는 것은 문제가 없었습니다.
하지만 TypeScript로 Lambda를 배포할 때 발생하는 컴파일, 번들링 과정 등에 대해서는 이해가 부족했던 것 같습니다.
이번에 Serverless Framework로 AWS Lambda를 배포하는 코드를 리뷰하며 컴파일, 번들링 과정에 대해 배울 수 있었습니다.

배포 프로세스 및 결과

배포 프로세스

graph TD
    A[Step 1: TypeScript Compilation] --> B[Step 2: ESBuild Bundling]
    B --> C[Step 3: Packaging into ZIP Files]
    C --> D[Step 4: Upload ZIP Files to S3]
    D --> E[Step 5: Generate CloudFormation Stack]
    E --> F[Step 6: Deploy AWS Resources]
    F --> G[Step 7: Service Deployed]

    subgraph Deployment Process
        A -->|Compile TS to JS| B
        B -->|Optimize, Minify| C
        C -->|ZIP each function| D
        D -->|Add to S3 & Refer in Template| E
        E -->|Create Lambda, API Gateway| F
    end

배포 결과

아래 코드를 클론해서 AWS에 직접 2개 Lambda함수와 API Gateway를 배포해볼 수 있습니다.
git clone https://github.com/menthamin/serverless-sample.git

CloudFormation 스택과 리소스
get-sum Lambda: lib/math.ts에 존재하던 ulid 패키지가 get-sum.js 파일에 번들링 되었습니다.

AWS Lambda 배포 단계별 상세 설명(TypeScript 프로젝트)

1. TypeScript 컴파일

  • 목적: TypeScript로 작성된 소스 코드를 JavaScript로 변환.
  • 작업 내용:
    1. tsconfig.json 설정에 따라 컴파일.
      • outDir 경로에 컴파일 결과 저장
    2. 컴파일로 생성된 JavaScript 파일이 번들링 대상이 됨.
  • 주요 요소:
    • TypeScript → JavaScript 변환.
    • 디버깅용 sourcemap 파일 생성 여부 (sourcemap: false 설정).

2. 번들링

  • 목적: ESBuild를 사용해 함수와 관련된 코드 및 의존성을 최적화하여 하나로 묶음.
  • 작업 내용:
    1. 각 함수(get-hello, get-sum)와 관련된 파일과 의존성을 묶음.
    2. 사용하지 않는 코드를 제거(Tree Shaking).
    3. 코드 최소화(minify: false): true로 지정하면 Javascript코드가 1행으로 표현이 되어 코드 용량은 최소화되지만 읽기가 불편해짐.
  • 주요 요소:
    • build.esbuild.bundle: true: 번들링 활성화 (serverless framework 4버전 이전에는 플러그인으로 제공되었는데 4버전 이후 부터는 내장으로 제공되고 기본 활성화라고 합니다)

3. 패키징

  • 목적: 각 Lambda 함수를 독립적인 ZIP 파일로 생성.
  • 작업 내용:
    1. 번들링된 파일과 관련 리소스를 ZIP으로 압축.
    2. 각 함수별로 독립적인 ZIP 파일 생성(package.individually: true).
    3. ZIP 파일은 .serverless/ 디렉터리에 저장.
  • 주요 요소:
    • ZIP 파일 이름 예시:
      • serverless-sample-dev-get-hello.zip
      • serverless-sample-dev-get-sum.zip

4. S3 업로드

  • 목적: 생성된 ZIP 파일을 AWS S3 버킷에 업로드.
  • 작업 내용:
    1. S3에 ZIP 파일 업로드.
    2. 업로드된 파일의 경로는 CloudFormation 템플릿에 저장.
  • 주요 요소:
    • S3 배포 버킷(자동 생성 또는 직접 설정).
    • ZIP 파일 경로.

5. CloudFormation 스택 생성

  • 목적: Serverless Framework가 AWS 리소스를 자동으로 생성.
  • 작업 내용:
    1. Lambda 함수와 API Gateway 설정.
    2. IAM 역할, 로그 그룹, CloudWatch 리소스 생성.
    3. 업로드된 ZIP 파일 경로를 참조하여 Lambda 함수 배포.
  • 주요 요소:
    • Lambda 함수 정의: get-hello, get-sum.
    • API Gateway 경로: /hello, /sum.

6. 배포 결과

  • 목적: 생성된 Lambda 함수와 API Gateway 호출 URL 제공.
  • 작업 내용:
    1. serverless deploy 명령 결과를 출력.
    2. API 호출 경로 제공.
  • 주요 요소:
    • API URL:
      • /hello: get-hello Lambda 함수 호출.
      • /sum: get-sum Lambda 함수 호출.
    • 배포 상태 및 로그.
Deploying "serverless-sample" to stage "dev" (ap-northeast-2)
Uploading CloudFormation file to S3
Uploading State file to S3
Uploading service serverless-sample-get-hello.zip file to S3 (890 B)
Uploading service serverless-sample-get-sum.zip file to S3 (3.19 kB)
  UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - serverless-sample-dev
  UPDATE_IN_PROGRESS - AWS::Lambda::Function - GetDashsumLambdaFunction
...
Removing old service artifacts from S3
✔ Service deployed to stack serverless-sample-dev (32s)
endpoints:
  GET - https://xxxxx.execute-api.ap-northeast-2.amazonaws.com/hello
  GET - https://xxxxx.execute-api.ap-northeast-2.amazonaws.com/sum
functions:
  get-hello: serverless-sample-dev-get-hello (890 B)
  get-sum: serverless-sample-dev-get-sum (3.2 kB)
Stack Outputs:
  GetDashsumLambdaFunctionQualifiedArn: arn:aws:lambda:ap-northeast-2:xxxxx:function:serverless-sample-dev-get-sum:19
  HttpApiId: xxxxx
  GetDashhelloLambdaFunctionQualifiedArn: arn:aws:lambda:ap-northeast-2:xxxxx:function:serverless-sample-dev-get-hello:19
  ServerlessDeploymentBucketName: serverless-framework-deployments-ap-northeast-2-8cebd6df-4256
  HttpApiUrl: https://xxxxx.execute-api.ap-northeast-2.amazonaws.com

배포 단계 요약

  1. TypeScript 컴파일: 소스 코드를 JavaScript로 변환 (outDir에 저장).
  2. 번들링: ESBuild를 사용하여 각 함수와 의존성을 최적화 및 묶음.
  3. 패키징: 각 함수별로 ZIP 파일 생성.
  4. S3 업로드: ZIP 파일을 S3에 업로드.
  5. CloudFormation 스택 생성: AWS 리소스 생성(Lambda, API Gateway 등).
  6. 배포 결과: API URL 제공 및 배포 결과 출력.

참고자료

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band