이번에는 AWS위에 구축한 간단한 서버리스(Serverless)에서의 팁 하나만 공유하려고합니다.
일단적으로 AWS 서버리스를 구축할 때 다른 것들을 추가하지만 기본적인 뼈대는 API Gateway <-> Lambda 의 구조입니다. 여기 앞 뒤로 Cloud Front, Route53, DynamoDB, Cognito(Firebase Auth) 등을 붙일 수 있죠.
Lambda 를 Api Gateway와 연동하는 과정은 다른 분들이 많이 올려두셨을 것이고요.
Api Gateway에 전달된 데이터는 AWS 에서 또 다른 처리과정을 거쳐서 람다로 전달됩니다. 이 때, 몇 가지 방법으로 데이터를 조절할 수 있습니다. 일반적으로 API Gateway와 람다를 연결할 때 특별한 처리를 해주지 않으면 body에 해당하는 데이터만 전달되게 됩니다.
추가로 전달을 위해서는 템플릿에 매핑하는 과정이 필요하죠.
매핑하는 위치는 Resources -> Method -> Integration Request -> Mapping templates 입니다.
다양한 기법들이 있긴한데, 가장 중요한 GET, POST 호출에 대해서만 아주 기본 템플릿을 공유합니다.
일반적인 application/json 형태로 데이터를 주고받는 경우에 해당합니다.
(1) GET API의 정보 전달하기
- http_method 로 실제 API Gateway에 들어온 요청이 GET 인지, POST 인지 , DELETE 인지 알 수 있습니다.
- queryStringParameters 로 호출주소에서 &로 구분하였던 쿼리 값들을 json 형태로 변경하여서 받을 수 있습니다.
- headers 로 header에 저장되어 있는 모든 정보들을 받을 수 있습니다.
#set($inputRoot = $input.path('$'))
{
"http_method": "$context.httpMethod",
"queryStringParameters": {
#foreach($key in $input.params().querystring.keySet())
#if($foreach.index > 0),
#end
"$key":"$input.params().querystring.get($key)"
#end
},
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))"
#if($foreach.hasNext),#end
#end
}
}
(2) POST API 의 정보 전달하기
POST 는 조금 더 간단합니다. GET 에서 사용했던 http_method, headers에 body만 json으로 받아주면 됩니다.
#set($inputRoot = $input.path('$'))
{
"http_method": "$context.httpMethod",
"body": $input.json('$'),
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))"
#if($foreach.hasNext),#end
#end
}
}
이런 방식으로 전달을 하고나면
실제로 람다에서 event에서 조회되는 데이터는 다음과 같습니다.
GET
{
"http_method":"GET",
"queryStringParameters":{
"pk":"basic",
"topic_id":"11014"
},
"headers":{
"Accept":"application/json",
"Accept-Encoding":"gzip, deflate, br",
"Accept-Language":"ko-KR,ko;q=0.9",
"content-type":"application/json",
"device-manufacturer":"Apple",
"device-model":"iPhone14,4",
"language":"ko-Kore-KR",
"platform":"ios",
"platform-version":"17.0.3",
"X-Forwarded-Port":"443",
"X-Forwarded-Proto":"https"
}
}
POST
{
"http_method":"POST",
"body":{
"type":"vocabulary",
"data":{
"base_word":"work",
"explanation":"과제는 학교에서 학생들에게 주어지는 공부나 연습을 의미합니다. 이 문장에서 'homework'은 학생이 도움을 청하는 과제를 의미합니다.",
"definitions":"[명사] 숙제"
},
"headers":{
"Accept":"application/json",
"Accept-Encoding":"gzip, deflate, br",
"Accept-Language":"ko-KR,ko;q=0.9",
"content-type":"application/json",
"device-manufacturer":"Apple",
"device-model":"iPhone14,4",
"language":"ko-Kore-KR",
"platform":"ios",
"platform-version":"17.0.3",
"X-Forwarded-Port":"443",
"X-Forwarded-Proto":"https"
}
}
이외에도 여러 데이터들을 mapping template 을 이용해서 변경해서 주고 받아볼 수 있습니다. 한 번 그런 템플릿들을 찾아서 적용해보면 어떨까요? 좀 더 여러 데이터들을 로깅하고 데이터 처리에 사용할 수 있을겁니다.
'Cloud > AWS' 카테고리의 다른 글
AWS 람다에서 python으로 구글 시트 데이터 쓰기 (0) | 2025.02.16 |
---|---|
AWS에서 서버리스로 배치 기능 사용하기 (with EventBridge) - 기초편 (0) | 2024.07.01 |
AWS 게이트웨이+람다에서 HTTPStatusCode 400을 설정해보기 (0) | 2023.11.05 |
dynamodb 파이썬으로 데이터 스캔하기 (1) | 2023.10.28 |
람다를 이용해서 S3의 csv 파일 데이터를 DynamoDB로 넣기 (0) | 2023.08.10 |
댓글