예를 들어 우리가 사용하고 싶다면
GET /user?name=bob
또는
GET /user/bob
이 두 예제를 Lambda 함수의 매개 변수로 어떻게 전달 하시겠습니까?
설명서에서 “매핑 된”설정에 대한 내용을 보았지만 API Gateway 콘솔에서 해당 설정을 찾을 수 없습니다.
method.request.path.parameter-name
parameter-name
메소드 요청 페이지에 정의 된대로 이름 지정된 경로 매개 변수method.request.querystring.parameter-name
parameter-name
메소드 요청 페이지에 정의 된대로 이름 지정된 조회 문자열 매개 변수의 경우
쿼리 문자열을 정의했지만 이러한 옵션 중 하나가 표시되지 않습니다.
답변
2017 년 9 월부터 더 이상 요청 본문에 액세스하기 위해 매핑을 구성 할 필요가 없습니다.
리소스 아래의 통합 요청에서 “Lamda 프록시 통합 사용”을 확인하기 만하면됩니다.
그런 다음 쿼리 매개 변수, 경로 매개 변수 및 헤더에 액세스 할 수 있습니다.
event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
답변
이 작업을 수행하는 단계는 다음과 같습니다.
API Gateway 콘솔 내에서 …
- 이동
Resources -> Integration Request
- 템플릿 드롭 다운 옆에있는 더하기 또는 편집 아이콘을 클릭합니다 (템플릿 필드가 이미 열려 있고 여기의 버튼이 회색으로 표시되어 있음을 알고 있음)
application/json
기본값을 표시하더라도 내용 유형 필드를 명시 적으로 입력 하십시오 (이를 수행하지 않으면 저장되지 않고 오류 메시지가 표시되지 않습니다).-
이것을 입력 매핑에 넣으십시오.
{ "name": "$input.params('name')" }
-
템플릿 드롭 다운 옆에있는 확인란을 클릭합니다 (마지막으로 저장한다고 가정합니다).
답변
이 매핑 템플릿을 사용하여 본문, 헤더, 메서드, 경로 및 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
더 이상 사용하지 못할 수 있습니다.