[AWS] Lamda + API Gateway 시작하기 | GET, Query String 전달, json.dumps 한글 깨짐 해결
람다 간단하대서 써볼려했더니.. 엄청 삽질했네요;;
Lamda + API Gateway를 활용하여 간단한 API를 개발해보겠습니다.
1. API 규격
이번에 만들 api 는 GET/test 입니다.
GET /test
- queryString으로 first_name과 last_name이 있을 경우 :
body에 hello {first_name} {last_name} 반환
- queryString이 비어있을 경우 :
body에 hello anonymous 반환
2. Lambda 함수 생성
AWS Lambda > 함수생성 > 새로작성
test라는 이름의 함수를 하나 만들어 주었습니다.
새로 생성한 함수로 들어가서
코드 탭에서 코드를 원하는대로 편집합니다.
람다에서는, event 인자를 통해 request인자들이 들어옵니다.
queryString의 first_name과 last_name에 따라 분기 및 응답값 설정이 이루어지도록 아래와 같이 람다함수를 작성해줍니다.
import json
def lambda_handler(event, context):
message = 'hello anonymous'
if event['queryStringParameters'] and 'first_name' in event['queryStringParameters'] and 'last_name' in event['queryStringParameters']:
message = 'Hello {} {}!'.format(event['queryStringParameters']['first_name'], event['queryStringParameters']['last_name'])
return {
'statusCode': 200,
'body': json.dumps(message, ensure_ascii=False)
}
참고) json.dumps 한글 깨짐 수정 반영
응답값에 한글이 포함되면 응답이 깨져서 보이는데,
json.dumps(result, ensure_ascii=False)
옵션을 넣어주면 이를 해결할 수 있습니다.
3. API Gateway에서 Lamda 트리거
람다함수를 외부에서 호출하려면 API게이트웨이를 연결해주어야 합니다.
구성 > 트리거 추가
추가 트리거 구성은 아래와 같이 했습니다.
API 게이트웨이 트리거가 생성되었네요.
API 엔드포인트라고 되어 있는 url을 클릭하면 새로운 탭에서 람다함수가 호출된 모습을 볼 수 있습니다.
4. API Gateway에서 Query String 전달
api gateway에서 전달받은 인자들을 lambda에 넘겨주도록 설정해보겠습니다.
구성에서 API 게이트의 세부 화면으로 들어갑니다 (위 화면 기준 API 게이트웨이 : test-API 클릭 )
통합 요청 클릭
메소드 설정에서 Lambda 프록시 통합 사용에 체크박스를 활성화시켜줍니다.
참고) event와 queryStringParameters
람다 내의 테스트 패널과 실제 api 호출 시 전달되는 패러미터가 조금 달라 헷갈리는 부분이 있습니다.
api call에서 쿼리패러미터는 event 패러미터 안에 queryStringParameters = {'key1' : 'value1', 'key2': 'value' .. } 형태로 전달됩니다.
import json
def lambda_handler(event, context):
print("event1", event)
if 'queryStringParameters' in event and event['queryStringParameters']:
message = 'hello queryStringParameters'
if 'first_name' in event['queryStringParameters'] and 'last_name' in event['queryStringParameters']:
message = 'Hello {} {}!'.format(event['queryStringParameters']['first_name'], event['queryStringParameters']['last_name'])
return {
'statusCode': 200,
'body': json.dumps(message, ensure_ascii=False)
}