[AWS] AWS Lambda 로 Cron Job 돌리기
Cultrip 개발 중 (깨알 홍보) 매일 1시에 SMS 를 발송할 필요가 생겨서 고민하던 중에이번 AWS Summit 2016 — AWS KRUG 세미나에서 김승연(Acuros)님이 강연해주신 “AWS Lambda를 통한 API Gateway를 이용한 초경량 REST 서비스 만들기”의 내용에서 도움을 받아 Lambda 를 이용해 작업해보았다.
(사실 Rails 에서 cron job 돌리는게 자신 없어서…)
현재 Lambda 에서는 여러가지 event source 중 CloudWatch Events-Schedule 도 지원하여 주기적인 작업을 쉽게 만들어 돌릴 수 있다.
월 1백만건의 요청까지 무료이기 때문에 돈 부담도 없다.
(참조: https://aws.amazon.com/ko/lambda/pricing/)
결론부터 말하고 시작하자면 정말 쉽다.
AWS Lambda function 생성
먼저 AWS 에 로그인 하고 Lambda 서비스에 들어간다.
[Get Started Now] 를 누르면 새 Lambda function 을 만들 수 있다.
Step1: Select blueprint
이 단계에서는 여러가지 blueprint(sample 이라고 생각하시면 됩니다)를 가져다 쓸 수 있다.
하지만 지금은 간단한 기능만 수행할 것이므로 아래의 [Skip] 을 눌러 넘어간다.
Step 2: Configure function
여기서부터 실제 Lambda function 을 작성하고 여러가지 설정을 하게 된다.
- Name
Lambda function 의 이름.
여기서는 간단히 “Test” 라고 하겠다. - Runtime
Lambda function 에 사용될 언어 또는 플랫폼.
현재 Java 8, Node.js 0.10, Node.js 4.3, Python 2.7 을 지원한다.
여기서는 Python 2.7 을 선택하겠다. - Code entry type
코드를 어떻게 작성할지 인데, 여기서는 [Edit code inline] 을 선택해서 아래 코드 에디터에서 바로 코드를 작성해보겠다.
기본적으로 제공되는 라이브러리는 바로 import 해서 사용 가능하다.
print 를 한 내용은 나중에 log 에서 확인할 수 있기 때문에 여기서는 response.status, response.read() 를 출력하였다.
* 외부 라이브러리를 사용하기 위해서는 코드와 라이브러리를 패키징해서 [Upload a .ZIP file] 또는 [Upload a file from Amazon S3] 를 선택해 올려야 한다.
# reference: http://blog.awskr.org/step-by-step-api-gateway.htmlimport httplib
import urllibdef lambda_handler(event, context):
connection = httplib.HTTPSConnection(‘API_HOST’)
connection.request(
‘API_METHOD’,
‘API_PATH’,
urllib.urlencode({}), #params
{} #header
)
response = connection.getresponse()
print response.status
print response.read()
connection.close()
- Handler
Lambda function 에서 호출될 {모듈이름.함수이름}.
Python 2.7 에서는 “lambda_function.lambda_handler” 로 설정되어있다.
그래서 위의 코드에서 함수 이름을 lambda_handler 로 했던 것이다. - Role
Lambda function 의 AWS Role.
“Create new role”-“* Basic execution role” 을 선택하면 IAM Management 페이지로 연결되어 새로운 role 을 만들 수 있다. (기존에 만들어 놓은 role 이 있다면 아래에서 선택할 수 있다)
다른 AWS 서비스를 사용하지 않으므로 기본값으로 만들 것이다.
“Show Policy Document” 를 눌러보면 기본적인 log 관련 Action 들만 들어있는 것을 확인할 수 있다.
[Allow] 를 누르면 Role 이 생성되고 다시 Lambda 페이지로 돌아온다.
[Advanced Settings] 에서는 고급 설정들을 할 수 있다.
- Memory
128 MB-1.5 GB 까지 64 MB 단위로 설정할 수 있다.
Memory 크기에 비례해서 CPU, Network 의 성능도 결정되고 따라서 가격도 바뀌기 때문에 용도에 맞춰서 잘 설정해야한다.
여기서는 성능이 중요한 작업이 아니니 최소인 128 MB 로 설정. - Timeout
말그대로 Lambda function 의 timeout.
Lambda 는 사용한 시간(100 ms 단위)에 비례하여 과금이 된다.
Timeout 을 3 sec 으로 설정했다고 해서 100 ms 만에 끝난 함수를 3 sec 동안 사용한 것 처럼 과금하지는 않기 때문에, 안전벨트를 착용하는 것이라고 생각하고 여유있게 설정하면 된다. - VPC
AWS 의 보안관련 설정. 여기서는 스킵.
Step 3: Review
위에서 설정한 것들을 간단히 리뷰하고 [Create function] 을 누르면 Lambda function 이 생성된다.
Lambda function 생성 완료
Lambda function 이 만들어지면 아래와 같은 화면으로 연결되고 여기서 테스트, 수정, Event source 설정, API endpoint 설정, 모니터링 등의 작업이 가능하다.
[Test] 를 눌러서 작성한 코드가 잘 동작하는지 확인하고 넘어가도록 하자.
CloudWatch Events-Schedule 연결
위에서 만든 Lambda function 에 CloudWatch Events-Schedule 을 연결해보겠다.
[Event sources] 를 누르면 Lambda function 에 event source 를 추가하고 관리할 수 있다.
[Add event source] 를 눌러 새 event source 를 추가해보자.
- Event source type
여러가지 event source type 을 지원하는데, 그 중 “CloudWatch Events-schedule”을 선택하자. - Rule name
Event source 의 이름.
여기서는 매일 오후 1시를 나타내기 위해 “everyday_1pm_kst” 라고 하겠다. - Schedule expression
여기에 rate 나 cron 으로 원하는 주기를 설정하면 된다.
매일 한국 시간 오후 1시에 해당 event 를 실행시키기 위해 아래와 같이 설정하겠다.
# schedule expression 의 시간 기준은 UTC 이므로 9시간을 빼주었다.
# 자세한 사용법은 http://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html 참조cron(0 4 * * ? *)
[Submit] 을 눌러서 event source 추가를 마치자.
작동 체크하기
Lambda function 페이지에서 [Monitoring] 을 누르면 현재 Lambda function 의 작동 상태를 알 수 있다.
- Invocations
Lambda function 이 실행된 횟수. (Throttle 된 것은 포함하지 않음) - Duration
Lambda function 이 실행되는 동안 소요된 시간. - Error
429 를 제외한 모든 4xx 에러 횟수. - Throttles
429 에러 횟수. 이 경우에는 자동으로 다시 Lambda function 을 실행한다.
AWS CloudWatch 서비스로 이동해서 [Logs] 에 들어가면 만들어진 Lambda function 에 대한 log 들도 확인할 수 있다.
Lambda function 에서 print 로 출력했던 결과도 볼 수 있고 Duration, Memory used 등의 정보도 확인할 수 있다.