Hello AWS Lambda

AWS Lambda란?

“AWS Lambda는 이벤트에 응답하여 코드를 실행하고 자동으로 기본 컴퓨팅 리소스를 관리하는 서버 없는 컴퓨팅 서비스입니다.”
AWS Lambda 소개 페이지

사용자가 별도 서버를 관리할 필요 없이 코드만 올려놓으면, 임의로 설정한 트리거에 따라 해당 코드를 실행해주는 서비스다. (유사품으로 Google Cloud Functions가 있다) 여기에 다른 AWS 서비스와 함께 사용할 때 활용도가 극대화될 것 같다.

크롤링 스크립트 몇 개를 주기적으로 또는 특정 이벤트 발생 시 돌리고 싶은데, EC2 인스턴스를 하나 생성하는 것보다 Lambda를 활용하는 편이 좋지 않을까 싶어서 사용해보기로 했다.

사용 요금

AWS Lambda는 12개월 등의 기간 제한 없이 다음과 같은 프리 티어 혜택이 있다.

  • 월별 무료 요청 1,000,000번
  • 월별 최대 3백2십만 초의 컴퓨팅 시간

무료 사용량을 초과하면 컴퓨팅 비용 + 요청 수에 따라 요금이 부과된다.

자세한 요금은 AWS Lambda 요금 세부 정보에서 볼 수 있다.

기능 검토

AWS Lambda를 쓰기 위해 다음과 같은 요건이 충족됐으면 싶었다.

  1. 정해진 시간에 맞춰 실행돼야 한다.
  2. 사용 가능한 DB가 있어야 한다.
  3. 다른 서비스 또는 다른 스크립트를 실행시키는 이벤트를 발생시킬 수 있어야 한다.
  4. 코드를 자동으로 배포할 수 있어야 한다.

열심히 공식 문서들을 탐색해본 결과 1과 3은 AWS CloudWatch로, 2는 AWS DynamoDB를 사용하면 될 것 같았다.
4는..한 번에 너무 많은 것을 보고 지쳐서 나중에 다시 검토해보기로 했다.
(요즘 같은 세상에 뭐든 당연히 가능한 방법이 있겠지)

사용해보기

AWS Lambda function을 만들어보자.

아래 화면은 처음 function을 생성할 때 나오는 화면이다. 런타임에 따라 미리 준비된 샘플을 선택할 수 있다. 대충 훑어보니 좋은 기본 예제들이 있는 듯했다. 일단 처음엔 ‘Blank Function’을 선택했다.

hello-aws-lambda-1

다음으로 트리거 설정 화면이 나온다.
여기서 설정한 트리거가 발동 시 function이 실행된다.

hello-aws-lambda-2

비어있는 점선 사각형 아이콘을 클릭해보면 트리거로 설정 가능한 항목들이 나온다. AWS 초보인 나에겐 도통 모르는 서비스투성이 지만, ‘우와 이거저거 다 되는구나! 짱이다!!’하고 넘어가기로 했다.

이유 없이(제일 위에 있어서) 제일 만만해 보이는 API Gateway로 설정해보았다.
이름만 보고 짐작은 했는데, API Gateway를 트리거로 하면 특정 URL을 endpoint로 해서 이 Lambda function을 실행할 수 있다. 참고로 트리거 설정을 여기서 바로 않아도 Next버튼을 눌러 다음으로 넘어갈 수 있고 나중에 언제든지 재설정할 수 있다.

hello-aws-lambda-3

API Gateway를 선택하면 다음과 같은 설정 화면이 나온다. Security는 빠른 테스트를 위해 일단 ‘OPEN’으로 했다. ‘OPEN’으로 하면 누구나 이 API를 호출할 수 있으므로 테스트가 끝나면 삭제하거나 설정을 바꿔놓는 것이 좋다.

hello-aws-lambda-4

이제 function 설정 화면이 나온다. 이름, 설명, 실행환경, 코드, 환경변수 등을 설정할 수 있다.

hello-aws-lambda-5

런타임 설정에서는 사용 가능한 환경들을 볼 수 있다. Python 3.6을 선택해보았다.

hello-aws-lambda-6

코드는 직접 여기서 입력해도 되고, .ZIP 파일 업로드 또는 S3에 올려놓은 파일을 사용할 수도 있다.

hello-aws-lambda-7

Python을 선택했을 때의 기본 코드이다. 트리거 발동 시 트리거에 대한 정보 및 외부 정보가 event, context에 담겨 lambda_handler 함수를 호출하는 방식으로 실행되는 것을 짐작해볼 수 있다. 당연하게도 이 Lambda function을 실행하면 ‘Hello from lambda’를 반환할 것이다. 코드 설정 아래쪽에도 이런저런 설정들이 더 있지만 당장 핵심은 아닌듯해서(어려워 보여서) 기본값으로 설정하고 다음으로 넘어갔다. 마지막으로 최종 리뷰 화면을 거쳐서 새 Lambda function이 생성된다.

hello-aws-lambda-8

생성이 완료되면 방금 만든 function 화면이 나온다.
Qualifiers를 보면 버전이나 별칭을 선택할 수 있다. 버전 관리도 되는가 보다. 역시 대단!
바로 테스트 버튼을 눌러서 테스트를 진행할 수 있다. 처음 테스트를 실행하면 테스트 이벤트 설정 창이 나온다. 아마도 lambda_handler() 함수로 전달되는 event로 여기서 정의한 값이 전달되는 듯하다.

hello-aws-lambda-9

그냥 기본값으로 설정하고 진행하면 화면 상하 슬라이드로 나뉘며 아래 영역에 결과 화면이 나온다. 점선 박스 안에 ‘Hello from lambda’라는 결과를 확인할 수 있다. 그 외 이런저런 정보도 표시된다.

hello-aws-lambda-10

다음 트리거 탭을 보면 처음에 설정했던 API Gateway 트리거가 있다. 해당 API URL을 통해 접근하면 이 Lambda function이 반환하는 ‘Hello’가 출력될 것 같다. 이렇게 멋질 수가.

hello-aws-lambda-11

그런데 해당 URL로 접근해보면 예상과는 다른 결과가 나왔다. ‘Internal server error’라니!

hello-aws-lambda-12

뭔가 잘못했나 싶어 여기저기 살펴보다가 API Gateway 관리화면으로 가서 보니 Integration Response에만 불이 안 들어와 있다. 그리고 관련 메시지로 검색을 해보다가 API Gateway와 Lambda를 연동하려면 Lambda의 리턴값이 특정 형식을 갖춰야 한다는 가이드를 찾았다. [관련 내용 공식 가이드]

hello-aws-lambda-13

가이드를 참고해서 Lambda function code를 다음과 같이 수정했다.

hello-aws-lambda-14

수정 후 다시 API URL을 통해 접근해보니 의도한 대로 출력되었다. 감동(?)의 순간.

hello-aws-lambda-15

일단 헬로를 봤으니 이 글은 여기까지.