티스토리 뷰

밥대생

AWS Lambda로 간단한 Proxy 만들기

joonyoung.yi 2017.04.09 03:41

AWS Lambda와 AWS Api Gateway를 통해 

serverless한 api를 운영할 수 있습니다. 

AWS Lambda가 무엇인지, AWS Api Gateway가 무엇인지에 대해서는 

아래 글에서 자세히 설명하고 있습니다.


[AWS]서버없이 Lambda와 API Gateway로 서버API 만들기


그리고 같은 블로그에서, 

AWS Lambda와 AWS API Gateway를 설정하는 방식에 대해서 잘 설명하고 있습니다.


[AWS]Lambda의 시작 - 'Hello World' 출력하기

[AWS]API Gateway - RESTful API만들기


오늘 포스팅은 이 블로그들에서 설명되지 않은 부분들에 대한 

보완적 느낌의 포스팅이라고 봐주시면 좋을 것 같습니다.


많은 AWS Lambda에 대한 포스트들이 Python 2.7이 아닌 Node.js를 기준해서 작성되어 있습니다.

저처럼 Python이 더 편한 분들은 Python 2.7을 사용하고 싶으실 텐데, 

해당 내용에 대한 포스팅이 다소 부족했던 것 같습니다.


밥대생 팀에서도 Python 2.7로 Lambda를 사용하고 있기 때문에 

Python 2.7 기준으로 설명드리고자 합니다. 


처음 Python 2.7로 Lambda를 만들면 다음과 유사한 기본 코드를 확인하실 수 있습니다.


def lambda_handler(event, context):

return "hello world"


하지만, 이런 Lambda 함수를 API Gateway와 연결하면

500 Internal Server error가 납니다.


왜 일까요?


어떻게 보면 당연합니다. 

AWS Lambda는 API Gateway와 연결할 것을 전제로 설계된 것이 아닙니다.

따라서, API Gateway가 이해할 수 있는 return value를 작성해야 합니다.


몇몇 예제 코드를 확인하시면, 다음과 같이 작성해야 함을 확인하실 수 있습니다.


def respond(msg, status=200):

    return {

        'statusCode': str(status),

        'body': msg,

        'headers': {},

    }



def lambda_handler(event, context):        

    return respond("hello world", status=200)


그럼 정상적으로 hello world가 출력되는 것을 확인하실 수 있습니다

.

AWS Lambda에서 Trigger를 누르시면, 위 네모박스와 같은 링크를 확인하실 수 있습니다.
해당 네모박스의 링크를 클릭하시면, 실제 API가 동작함을 확인하실 수 있습니다.

(API Gateway의 허용 methods에 GET이 체크되어있거나, ANY로 설정되어 있는지는 미리 확인해주세요.)


이제 Proxy를 구현하는 코드입니다. 


import json

import urllib2


def respond(msg, status=200):

    return {

        'statusCode': str(status),

        'body': msg,

        'headers': {},

    }


def lambda_handler(event, context):

msg = ''

    

    try:

        url = event['queryStringParameters']['url']


    except:

        return respond(msg, status=400)

        

    try:

        response = urllib2.urlopen(url)

        msg = response.read()

        response.close()


return respond(msg)


    except:

        return respond(msg, status=500)

        


어떻게 AWS Lambda의 Python 2.7에서 url을 파라미터로 GET요청을 수행할 수 있는지

확인하실 수 있을 것 같습니다. 

댓글
댓글쓰기 폼
공지사항
Total
35,384
Today
0
Yesterday
16
링크
«   2019/05   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
글 보관함