How to schedule AWS Lambda in the easiest way

Song Yongseok
6 min readJun 8, 2022

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이다.

written in TS

그래서인지 신 기능 업데이트도 이 쪽이 제일 빠르고, 공식 문서도 기본적으로 모두 TypeScript로 작성되어 있어 TS로 가는 게 더할 나위 없이 편-안

CDK

설치

npm i aws-cdk

디렉터리 생성

mkdir cdk
cd cdk

cdk project 초기화

cdk init app --language typescript
요즘엔 cli도 너무 잘 되어 있다

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.tslib 하단에 두고, 실제 태스크를 수행할 lambda 코드들은 src 하단에 따로 두었다.

memory size나 vpc, subnet, security group 등 용도에 따라 변경될 수 있는 부분들은 lambda 생성 시점에 바깥(stack)에서 적절하게 주입해줄 수 있도록 dependencies로 구성

a.ts

그럼 이제 실제로 비즈니스 로직을 수행할 lambda 코드를 src 안에 만들어주고

Stack.ts

  1. 비즈니스 로직을 수행하는 a.ts 를 대상으로 lambda-construct.ts 를 사용해 찍어낸 Lambda에
  2. 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을 조정해주는 게 낫겠다.

lambdas

--

--

Song Yongseok

학력(學歷) 말고 학력(學力) | Product Engineer | Family man