본문으로 바로가기

AWS Lambda + API Gateway로 API 만드는 방법

category Coding/DevOps 2019. 1. 21. 17:07
반응형

AWS Lambda란 Amazon Web Service에서 제공하는 서버리스(Serverless) 기능이다.

한마디로 서버가 없고 코드만 존재한다는 뜻이다.

예를 들어서 크롤링을 진행하여 데이터베이스에 적재하는 코드의 경우 24시간 떠있을 필요가 없이

Crontab등을 통해 주기적으로 실행하면 된다.

이러한 경우 EC2를 사용하는것은 리소스 낭비이므로 lambda를 사용하는것이 적절하다.

또한 100만건의 요청까지는 무료로 제공되므로 EC2보다 비용면에서도 이득이라고 볼 수 있다.

먼저 AWS Lambda 콘솔로 - 함수로 들어간다.


새로 작성을 선택하고 이름과 런타임을 지정한다.

나는 파이썬으로 작업할 예정이므로 Python 3.6을 선택했다.

또한 역할을 선택할 수 있는데, RDS와 통신해야하므로 RDS에 접근할 수 있는 정책을 연결시켜놓은

역할을 지정했다.


코드를 작성할 수 있는 방법은 총 3가지가 있다.


1. 인라인 작성

2. zip파일 업로드

3. Amazon S3에서 업로드


일단은 1번 인라인 작성으로 간단하게 작성해보고, 나중에 zip파일 업로드를 이용하여 작업할 예정이다.

처음 함수를 생성하고 코드부분을 확인해보면 위처럼 lambda_handler()라는 함수가 하나 존재한다.

람다가 실행되면 해당 함수가 실행된다.

따라서 파이썬에서 if __name__ == '__main__' 과 동일한 역할을 한다고 생각하면 된다.

원하는 코드를 작성하고 저장한 후 테스트를 눌러보면 테스트 이벤트 구성이 나온다.


이 부분은 현재 사용하지 않을 예정이므로 원하는 이벤트 이름을 적고 생성을 누른다.

그리고 테스트를 눌러보면,


위처럼 정상적으로 실행되는 모습을 볼 수 있다.

이제 우리가 작성한 람다함수를 API Gateway와 연결시켜보자.

API Gateway콘솔로 들어가서 API작성을 누른다.


원하는 이름을 적고 엔드 포인트 유형은 최적화된 에지를 선택한다.

프라이빗으로 설정하면 외부에서 접근할 수 없다.

API생성 버튼을 누른다.


이제 특정 주소로 들어오는 부분을 설정하기 위해 리소스를 생성해줘야 한다.

작업 버튼을 눌러서 리소스 생성을 선택한다.


원하는 주소를 입력하고 리소스 생성을 누른다.


이제 생성한 리소스에서 메소드를 설정해줘야 한다.

먼저 GET 메소드를 생성해본다.

메서드 생성을 선택한다.


GET을 선택한다.


오른쪽에 있는 체크 버튼을 눌러야 생성이 완료된다.


통합 유형에서 Lambda 함수를 선택하고 아래쪽에서 우리가 위에서 생성한 람다 함수의 이름을 적어준다.

저장을 누른다.


권한을 부여해줘야 한다. 확인을 누른다.


이제 우리가 작업한 API를 배포해야한다.

작업 - API배포를 누른다.


원하는 이름을 적고 배포를 누른다.


배포를 하고나면 호출 URL이 보인다.

위 URL에서 우리는 /test라는 리소스를 생성했으니 들어가보면 정상적으로 접속이 되는것을 확인할 수 있다.

추가적으로 Third party 라이브러리를 사용하는 방법에 대해 설명한다.

예를 들어 웹 요청을 하는 requests와 같은 라이브러리는 람다에 기본적으로 설치가 되어있다.

물론 경로가 조금 다르다. 단순히 import requests가 아니라


from botocore.vendored import requests

위처럼 임포트 시켜줘야한다.

하지만 모든 라이브러리가 설치되어있지 않으므로 직접 설치하여 업로드 해줘야 한다.

이때 위에서 설명한 코드 작성방법 중 2번인 zip파일 업로드 기능을 사용한다.

먼저 원하는 폴더를 하나 생성한다. (test라고 가정)


그리고 다음과 같은 명령어로 설치한다.


pip3 install -t . 라이브러리 이름


전역적으로 설치하는것이 아닌 현재의 폴더에 라이브러리를 설치하는 방법이다.

추가적으로 알아둬야할게, 위처럼 압축파일을 업로드하는 방식은 파이썬 코드 파일명을 

무조건 lambda_function.py로 해줘야 한다.

만약 원하는 이름의 원하는 함수명으로 해주고 싶다면,


람다 함수로 들어가서 원하는파일명.원하는함수명 형태로 수정해줘야 한다.

(여기서는 수정하지 않는다는 가정하에 진행한다)

이제 폴더를 압축한다.

압축할 때 주의할점이 하나 있는데, 폴더 자체를 압축하면 안되고 폴더안에 들어가서 안에 들어있는 파일들만 압축해야한다.

압축을 완료했으면 zip파일로 업로드한다.


업로드를 하면 위처럼 압축했던 모든 파일이 업로드된 모습을 확인할 수 있다.

위와 같은 방식으로 써드파티 라이브러리를 우리의 코드에 포함시킬 수 있다.


추가적으로 POST등의 메소드를 사용할 때 HTTP Body를 통해 파라미터를 입력받는다.

이렇게 입력받은 값들은 event에 담겨진다.

(먼저 API Gateway에서 GET메소드를 추가한것과 동일하게 POST메소드를 추가해준다)


람다 함수를 살펴보면 evnet, context두개를 인자로 받고있는데

여기서 event를 통해 입력받은 파라미터에 접근할 수 있다.

예를 들어서 param이라는 인자의 값을 사용하고 싶다면,

event['param']을 통해 접근할 수 있다는 말이다.


마지막으로 람다는 기본적으로 3초라는 timeout을 가지고 있다.

3초가 지나면 자동으로 실패하는데, 크롤링의 경우 시간이 조금 더 오래걸릴때도 존재한다.

따라서 기본 제한시간을 조금 늘려줄 필요가 있다.


람다 함수로 들어가서 조금 내려보면 위처럼 제한시간이 존재하는데

여기서 원하는 시간으로 바꿔주면 된다.

반응형