Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

AWS Lambda를 이용해서 HTTP API 만들기 #1

AWS Lambda는 2014년에 Amazon에서 새롭게 내놓은 서비스이다. Lambda 사이트에 가면 서버에 대한 걱정 없이 코드 실행, 사용한 컴퓨팅 시간에 대해서만 비용 지불라고 나와 있는데 간단히 얘기하면 Lambda 서비스에 작성한 비즈니스 로직을 올려놓고 HTTP 요청이나 AWS 내의 이벤트가 발생하면 해당 코드가 실행되는 구조이다. 그래서 소스코드만 관리하면 EC2처럼 서버를 직접 관리하지 않아도 되므로 복잡하지 않은 처리에 사용하기에 최적화되어 있다. 가격은 월별 1백만 회, 400,000GB-초의 컴퓨팅 시간까지는 무료이다. 나는 AWS의 대부분 서비스에서 비슷하게 느끼지만, 가격을 보고 실제 사용하면 어느 정도 나올지는 거의 감이 안 오지만 큰 서비스 아니라면 무료로 사용할 수 있어 보인다.

AWS Lambda


AWS Lambda function 생성

AWS Lambda 콘솔

AWS Lambda 웹 콘솔에 들어가면 위와 같은 화면을 볼 수 있다. 여기서 "Create a Lambda function" 버튼을 누른다. Lambda는 이벤트 기반으로 이벤트가 발생했을 때 함수를 실행하기 때문에 단위당 하나의 Lambda function을 만들어야 한다.(Lambda function이라는 용어를 프로그래밍에서도 일반적으로 사용하지만, 이 글에서 언급하는 Lambda function은 AWS의 Lambda function을 의미한다.)

AWS Lambda 콘솔

Lambda function을 만들기 전에 블루프린트를 선택할 수 있는 화면이 나온다. 미리 만들어진 Lambda function을 템플릿처럼 선택해서 이를 바탕으로 수정할 수 있는데 여기서는 그냥 Skip을 한다.(검색해 보면 helloworld 블루프린트가 존재한다.)

AWS Lambda 콘솔

이제 Lambda function을 작성하는 화면이다.

  • Name에는 인식할 수 있는 함수의 이름을 작성하면 되는데 여기서는 HelloWorld라고 작성하겠다.
  • RuntimeNode.js, Java 8, Python 2.7 중에서 선택할 수 있다. 이 글에서는 Node.js를 사용하는데 Node.js는 v0.10.36이다.
  • Handler에는 이벤트가 발생했을 때 실행할 핸들러는 지정하는데 index.handler라고 지정하면 index.js 파일에서 exports로 지정된 handler라는 이름의 함수를 실행하게 된다.
  • Role에는 Lambda function에 필요한 Role을 설정한다. S3나 데이터베이스 등 AWS 내의 다른 리소스에 접근이 필요한 경우 IAM에서 Role을 만들어서 추가해야 한다.
  • 맨 하단에는 Lambda function을 실행할 때 필요한 메모리와 만료시간이 있는데 여기선 테스트이므로 기본값을 그대로 둔다. 나중에 실행하면 사용한 메모리와 시간을 알 수 있으므로 필요에 따라 조정하면 된다. 실행 만료시간은 최대 5분이다.

Lambda function code에 핸들러를 작성해서 원하는 비즈니스 로직을 넣으면 되는데 웹 콘솔에서 직접 작성하거나 만든 파일은 zip 파일로 업로드할 수도 있다. 핸들러는 다음과 같은 형식을 갖고 있다.

exports.myHandler = function(event, context) {}

myHandler는 원하는 이름을 작성하면 된다. 이 함수는 이벤트에서 핸들러에 전달한 객체를 담고 있는 event와 Lambda function의 실행정보를 담고 있는 context 파라미터를 받는다.

console.log('Loading function');

exports.handler = function(event, context) {
    console.log('event: ', JSON.stringify(event));
    var name = event.myname || 'Anonymous';
    context.succeed('Hello World, ' + name);
};

위는 예시로 작성한 간단한 핸들러이다. 이벤트가 호출되면 받은 이벤트를 로그로 출력하고 입력받은 이름으로 Hello World,를 출력하고 받은 이름이 없으면 Anonymous를 출력한다. 기존에 Node.js를 사용할 줄 알고 있다면 쉽게 작성할 수 있다. 이 코드에서 context 객체에서 succeed() 메서드를 사용했는데 Lambda에서 제공하는 context 객체는 몇가지 메서드를 제공하고 있다.

context.succeed(result)는 Lambda function이 정상적으로 모두 완료되었을 때 실행하는 함수로 선택적 파라미터인 resultJSON.stringify가 가능해야 한다. 이 함수는 2가지로 동작하는데 Lambda function이 비동기 방식인 Event방식으로 호출된 경우에는 202 응답을 반환하고 동기방식인 RequestResponse 방식으로 호출된 경우에는 200으로 응답하면서 result의 문자열을 응답으로 보낸다. 이 외에 Lambda function에서 오류가 발생했을 때 사용하는 context.fail(error)와 Lambda function을 종료하는 context.done(error, result)도 있다. context.fail()context.done()의 오류도 CloudWatch의 로그로 남게 된다.

정보를 다 입력한 후 Next를 누르면 다음과 같이 지정한 정보가 맞는지 확인하는 리뷰 화면이 나온다.

AWS Lambda 콘솔

이상이 없으면 "Create function"을 누르면 Lambda function이 생성된다.

Lambda function 테스트

AWS Lambda 콘솔

Lambda function을 만들고 나면 위와 같은 화면을 볼 수 있다. 예시는 아주 간단한 코드이지만 실제 Lambda function을 작성한다면 여기서 테스트를 해보면서 코드를 수정하면 된다.

상단의 "Test"버튼을 누르거나 "Actions - Configure test event"를 누르면 이벤트로 전송할 테스트 데이터를 수정할 수 있다.

AWS Lambda 콘솔

앞에서 작성한 핸들러에서 event 객체의 myname값을 사용했으므로 테스트 데이터에 이름을 입력했다.

AWS Lambda 콘솔

테스트를 실행하면 입력데이터로 실행한 결과를 하단에서 볼 수 있다. 의도한 대로 테스트 결과가 의도대로 잘 나왔고 로그 부분에서 console로 출력한 내용을 볼 수 있다. 테스트한 결과는 편하게 하단에 바로 보여주지만, Lambda function에서 남긴 로그는 CloudWatch에 로그로 남게 되므로 CloudWatch에서 볼 수 있다.

Lambda function의 이벤트 소스와 API 엔드포인트

Lambda function을 다 만들었으면 실행시키기 위한 어떤 이벤트가 필요하다. 이벤트를 발생시키기 위해 이벤트 소스 혹은 API 엔드 포인트를 만들어야 한다.

AWS Lambda 콘솔

이벤트 소스는 AWS 서비스 내에서 Lambda function에 이벤트를 보낼 소스를 의미한다. 위 화면에서 보듯이 AWS IoT, CloudWatch, DynamoDB, Kinesis, S3, SNS 등이 있다. 즉, AWS의 다른 이벤트에서 어떤 조건의 이벤트가 발생했을 때 Lambda function을 실행하도록 연결할 수 있다는 의미이다. 예를 들어 나는 현재 프로젝트에서 CloudWatch에 설정한 가격 알림을 Lambda function에 연결해서 Slack으로 알림을 주도록 작성해서 사용하고 있다.

AWS Lambda 콘솔

API 엔드포인트는 URL을 정의해서 해당 URL로 HTTP 요청을 보내면 이벤트가 발생하는 방식이다. AWS 내의 서비스를 이벤트 소스로 연결하는 방식이 아니라면 대부분 이 방식을 이용할 것이고 HTTP 요청을 이용하므로 필요한대로 외부 서비스나 애플리케이션과 연동해서 사용할 수 있다. 처음 Lambda가 나왔을 때는 Lambda 내에서 API URL을 생성해 줬던 것으로 기억하는데 지금은 Amazon API Gateway만으로 API 엔드포인트를 지정하게 되어 있다. 이벤트 소스는 서비스마다 형식이 다르고 그냥 연결하면 되므로 여기서는 API 엔드포인트를 연결하는 방식으로 설명하려고 한다.



이 글은 AWS Lambda를 이용해서 HTTP API 만들기 #2로 이어진다.

2016/03/27 02:56 2016/03/27 02:56