[amazon-web-services] Amazon API Gateway에서 querystring 또는 route 매개 변수를 AWS Lambda로 전달하는 방법

예를 들어 우리가 사용하고 싶다면

GET /user?name=bob

또는

GET /user/bob

이 두 예제를 Lambda 함수의 매개 변수로 어떻게 전달 하시겠습니까?

설명서에서 “매핑 된”설정에 대한 내용을 보았지만 API Gateway 콘솔에서 해당 설정을 찾을 수 없습니다.

  • method.request.path.parameter-nameparameter-name메소드 요청 페이지에 정의 된대로 이름 지정된 경로 매개 변수
  • method.request.querystring.parameter-nameparameter-name메소드 요청 페이지에 정의 된대로 이름 지정된 조회 문자열 매개 변수의 경우

쿼리 문자열을 정의했지만 이러한 옵션 중 하나가 표시되지 않습니다.



답변

2017 년 9 월부터 더 이상 요청 본문에 액세스하기 위해 매핑을 구성 할 필요가 없습니다.

리소스 아래의 통합 요청에서 “Lamda 프록시 통합 사용”을 확인하기 만하면됩니다.

여기에 이미지 설명을 입력하십시오

그런 다음 쿼리 매개 변수, 경로 매개 변수 및 헤더에 액세스 할 수 있습니다.

event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']


답변

이 작업을 수행하는 단계는 다음과 같습니다.

API Gateway 콘솔 내에서 …

  1. 이동 Resources -> Integration Request
  2. 템플릿 드롭 다운 옆에있는 더하기 또는 편집 아이콘을 클릭합니다 (템플릿 필드가 이미 열려 있고 여기의 버튼이 회색으로 표시되어 있음을 알고 있음)
  3. application/json기본값을 표시하더라도 내용 유형 필드를 명시 적으로 입력 하십시오 (이를 수행하지 않으면 저장되지 않고 오류 메시지가 표시되지 않습니다).
  4. 이것을 입력 매핑에 넣으십시오. { "name": "$input.params('name')" }

  5. 템플릿 드롭 다운 옆에있는 확인란을 클릭합니다 (마지막으로 저장한다고 가정합니다).


답변

이 매핑 템플릿을 사용하여 본문, 헤더, 메서드, 경로 및 URL 쿼리 문자열 매개 변수를 Lambda 이벤트에 제공했습니다. 템플릿에 대해 자세히 설명하는 블로그 게시물을 작성했습니다 .http : //kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api- 게이트웨이 /

사용할 수있는 매핑 템플릿은 다음과 같습니다.

{
  "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
  },
  "queryParams": {
    #foreach($param in $input.params().querystring.keySet())
    "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end

    #end
  },
  "pathParams": {
    #foreach($param in $input.params().path.keySet())
    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end

    #end
  }
}


답변

요즘 드롭 다운 템플릿은 AWS의 API Gateway 콘솔에 포함되어 있습니다.

API의 경우 리소스 이름을 클릭 한 다음 GET

“본문 매핑 템플릿”확장

입력

응용 프로그램 / json

Content-Type (명시 적으로 입력해야 함)의 경우 체크 표시를 클릭하십시오.

“템플릿 생성”이라는 단어와 드롭 다운이있는 새 창이 열립니다 (이미지 참조).

고르다

메소드 요청 통과

여기에 이미지 설명을 입력하십시오

그런 다음 저장을 클릭하십시오

변수에 액세스하려면 다음 구문 (예 : Python)을 사용하십시오 (예 : URL).

https://yourURL.execute-api.us-west-2.amazonaws.com/prod/confirmReg?token=12345&uid=5

다음과 같이 변수를 얻을 수 있습니다.

from __future__ import print_function

import boto3
import json

print('Loading function')


def lambda_handler(event, context):
    print(event['params']['querystring']['token'])
    print(event['params']['querystring']['uid'])

따라서 원하는 각 변수를 명시 적으로 이름을 지정하거나 매핑 할 필요가 없습니다.


답변

람다 함수에 매개 변수를 전달하려면 API 게이트웨이 요청과 람다 함수 사이에 맵핑을 작성해야합니다. 맵핑은 선택된 API 게이트웨이 자원 의 Integration Request-> Mapping templates섹션 에서 수행됩니다 .

유형의 매핑을 application/json만든 다음 오른쪽에서 템플릿을 편집 (연필 클릭)합니다.

매핑 템플릿은 실제로 if, 루프 및 물론 인쇄 변수를 사용할 수있는 Velocity 템플릿입니다. 템플릿에는 쿼리 문자열 매개 변수, 요청 헤더 등에 개별적으로 액세스 할 수있는 이러한 변수가 삽입 되어 있습니다. 다음 코드를 사용하면 전체 쿼리 문자열을 다시 만들 수 있습니다.

{
    "querystring" : "#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0)&#end$util.urlEncode($key)=$util.urlEncode($input.params().querystring.get($key))#end",
    "body" : $input.json('$')
}

참고 : 템플릿을 저장하려면 확인 기호를 클릭하십시오. 리소스의 “테스트”버튼을 사용하여 변경 사항을 테스트 할 수 있습니다. 그러나 AWS 콘솔에서 쿼리 문자열 파라미터를 테스트하려면 Method Request리소스 섹션 에서 파라미터 이름을 정의 해야합니다.

참고 : Velocity templating language에 대한 자세한 내용은 Velocity User Guide 를 참조하십시오.

그런 다음 람다 템플릿에서 다음을 수행하여 쿼리 문자열을 구문 분석 할 수 있습니다.

var query = require('querystring').parse(event.querystring)
// access parameters with query['foo'] or query.foo


답변

수락 된 답변은 나에게 잘 작동했지만 gimenete의 답변을 확장하면서 모든 쿼리 / 경로 / 헤더 매개 변수 (현재 문자열과 동일)를 통과하는 데 사용할 수있는 일반 템플릿을 원했고 다음 템플릿을 찾았습니다. 누군가가 유용하다고 생각하는 경우 여기에 게시하고 있습니다.

#set($keys = [])
#foreach($key in $input.params().querystring.keySet())
  #set($success = $keys.add($key))
#end

#foreach($key in $input.params().headers.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

#foreach($key in $input.params().path.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

{
#foreach($key in $keys)
  "$key": "$util.escapeJavaScript($input.params($key))"#if($foreach.hasNext),#end
#end
}


답변

내 자신의 질문 중 하나에 답하려고 노력하면서 여기 하면서이 속임수를 발견했습니다.

API Gateway 맵핑 템플리트에서 다음을 사용하여 HTTP 클라이언트가 보낸 완전한 쿼리 문자열을 제공하십시오.

{
    "querystring": "$input.params().querystring"
}

장점은 쿼리 문자열에서 미리 정의 된 매핑 된 키 집합으로 제한 할 필요가 없다는 것입니다. 이제이 방법으로 처리하려는 경우 쿼리 문자열에 키-값 쌍을 사용할 수 있습니다.

참고 :에 따르면 단지 $input.params(x)변수가 VTL 템플릿 제공으로 표시됩니다. 내부가 변경되어 querystring더 이상 사용하지 못할 수 있습니다.