티스토리 뷰
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)
(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요청을 수행할 수 있는지
확인하실 수 있을 것 같습니다.