본문 바로가기
Cloud/AWS

APIGateway 에서 람다로 데이터 전달하는 GET,POST 기본 템플릿

by 크라크라 2023. 10. 24.

이번에는 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 을 이용해서 변경해서 주고 받아볼 수 있습니다. 한 번 그런 템플릿들을 찾아서 적용해보면 어떨까요? 좀 더 여러 데이터들을 로깅하고 데이터 처리에 사용할 수 있을겁니다.

댓글