회사에서 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
tsconfig.json
설정에 따라 컴파일.outDir
경로에 컴파일 결과 저장sourcemap
파일 생성 여부 (sourcemap: false
설정).get-hello
, get-sum
)와 관련된 파일과 의존성을 묶음.minify: false
): true로 지정하면 Javascript코드가 1행으로 표현이 되어 코드 용량은 최소화되지만 읽기가 불편해짐.build.esbuild.bundle: true
: 번들링 활성화 (serverless framework 4버전 이전에는 플러그인으로 제공되었는데 4버전 이후 부터는 내장으로 제공되고 기본 활성화라고 합니다)package.individually: true
)..serverless/
디렉터리에 저장.serverless-sample-dev-get-hello.zip
serverless-sample-dev-get-sum.zip
get-hello
, get-sum
./hello
, /sum
.serverless deploy
명령 결과를 출력./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
outDir
에 저장).