How to schedule AWS Lambda in the easiest way
EventBridge & Lambda w/ CDK in TS
이 조합은 정말 간단하면서도 쓰임새가 참 다양해서 자주 활용하는데, 가령..
- 매일 오후 3시에 체조를 독려하는 메시지를 발송한다든지 (우리는 사무실에서 매일 다 같이 체조함! 몸도 마음도 개운! 🤗)
- 매주 월요일 아침에 주간 회의 자료를 송부한다든지
- 특정 주기마다 특정 사이트 크롤링을 수행한다든지
- 기타 crontab 활용하는 모든 작업들
장점
- super easy. seriously.
- ridiculously cheap. practically it’s just free. 이런 단순하고 반복적인 task를 위해 24시간 돌아가는 서버(e.g.
bueno-bot-server
) 따위를 구성해 돌릴 필요 없는데, AWS 서비스 중에 Lambda 만큼 가성비 좋은 서비스도 또 없다. 가격은 여기에서. - IaC는 덤. 필요 없어져 부수게 될 때 깔끔하게 흔적도 없이 제거.
- 최소한 이렇게 scheduling해서 처리하는 job의 경우에는 대체로 cold start도 무시 가능하겠다.
단점
- 글 작성 기준 시점, Lambda는 최대 실행 시간이 15분이다. 그마저도 과거(2018년 10월 이전)에는 5분이었던 게 늘어난 것. 제한 시간 내 처리 가능한 임무만!
Why TypeScript?
먼저, AWS CDK project 자체가 TS로 쓰였다. 얘가 TS project이다.
그래서인지 신 기능 업데이트도 이 쪽이 제일 빠르고, 공식 문서도 기본적으로 모두 TypeScript로 작성되어 있어 TS로 가는 게 더할 나위 없이 편-안
CDK
설치
npm i aws-cdk
디렉터리 생성
mkdir cdk
cd cdk
cdk project 초기화
cdk init app --language typescript
env var
bin
디렉터리 안에 있는 파일에서 환경 변수 작업
const app = new cdk.App()
new CdkStack(app, 'CdkStack', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION
},
})
익숙한 OOP의 class constructor를 볼 수 있고, project 전반을 내가 희망하는 대로 자유롭게 scaffolding할 수 있겠다.
Stack and Constructs
여러 stacks로 구성할 수도 있겠는데, 필요한 AWS resource 만큼의 여러 constructs를 하나의 stack으로 구성하는 형태가 가장 기본적이겠다.
나는 lib
에 다음과 같이 event-construct.ts
, 그리고 lambda-construct.ts
를 두어 template으로 사용했다.
event-construct.ts
lambda-construct.ts
template으로 사용할 XXX-construct.ts
만 lib
하단에 두고, 실제 태스크를 수행할 lambda 코드들은 src
하단에 따로 두었다.
memory size나 vpc, subnet, security group 등 용도에 따라 변경될 수 있는 부분들은 lambda 생성 시점에 바깥(stack)에서 적절하게 주입해줄 수 있도록 dependencies로 구성
a.ts
그럼 이제 실제로 비즈니스 로직을 수행할 lambda 코드를 src
안에 만들어주고
Stack.ts
- 비즈니스 로직을 수행하는
a.ts
를 대상으로lambda-construct.ts
를 사용해 찍어낸 Lambda에 event-construct.ts
를 사용해 찍어낸 EventBridge를 invocation trigger로서 붙이는 거다. EventBridge에 사용하는 cron expression은 여기 참고.
편의 상 default environment를 구성하여 모든 lambda functions에 동일하게 주입해줘봤다.
결국엔 AWS CloudFormation template
이렇게 stack까지 다 구성했으면, 이제 다음 커맨드를 통해 AWS CloudFormation template을 만들어준다.
cdk synth
그렇다. 결국에 우리가 필요했던 것은 이 CloudFormation template인데, 이것을 CDK 도구 통해서 얻은 것뿐.
배포는 간단하고,
cdk deploy
새로 synth 뜬 template 과 직전 버전 간 차이도 간단하게 볼 수 있으며
cdk diff
이 모든 과정을 철회하기도 너무 간단하다.
cdk destroy
정말이지 요즘은 cli도 너-무 친절하게 하나 하나 콕 찝어 설명을 해주니 중간 중간에 에러가 나도 큰 무리 없이 진행할 수 있다.
CloudWatch — Log groups
이렇게 만든 lambda 로그는 CloudWatch에서 확인할 수 있는데, 용도, 그리고 호출 주기에 따라 적절한 수준으로 Retention을 조정해주는 게 낫겠다.