Amazon API Gateway에서 querystring 또는 route 매개 변수를 AWS Lambda로 전달하는 방법
예를 들어 우리가 사용하고 싶다면
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 Console 내에서 ...
- 이동
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 (명시 적으로 입력해야 함)을 선택하고 체크 표시를 클릭하십시오.
"템플릿 생성"이라는 단어와 드롭 다운이있는 새 창이 열립니다 (이미지 참조).
고르다
메소드 요청 통과
그런 다음 저장을 클릭하십시오
변수에 액세스하려면 URL과 같은 다음 구문 (Python)을 사용하십시오.
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'])
따라서 원하는 각 변수를 명시 적으로 이름을 지정하거나 매핑 할 필요가 없습니다.
받아 들인 대답은 잘 작동했지만 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 요청과 람다 함수 사이에 맵핑을 작성해야합니다. 맵핑은 선택된 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
여기 내 자신의 질문 중 하나에 답하려고 노력 하면서이 속임수를 발견했습니다.
API Gateway 맵핑 템플리트에서 다음을 사용하여 HTTP 클라이언트가 보낸 완전한 쿼리 문자열을 제공하십시오.
{
"querystring": "$input.params().querystring"
}
장점은 쿼리 문자열에서 미리 정의 된 매핑 된 키 집합으로 제한 할 필요가 없다는 것입니다. 이 방법으로 처리하려는 경우 쿼리 문자열에 키-값 쌍을 사용할 수 있습니다.
참고 :에 따르면 이 단지 $input.params(x)
변수가 VTL 템플릿 제공으로 표시됩니다. 내부가 변경되어 querystring
더 이상 사용하지 못할 수 있습니다.
이제 Lambda에 새로운 프록시 통합 유형을 사용하여 매핑을 구성하지 않고 표준 형태로 전체 요청을 자동으로 가져올 수 있습니다.
여기에 많은 답변이 훌륭합니다. 그러나 나는 조금 더 간단한 것을 원했습니다. "Hello World"샘플과 함께 작동하는 것을 무료로 원했습니다. 이것은 쿼리 문자열과 일치하는 간단한 요청 본문을 원한다는 것을 의미합니다.
{
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
}
나는 최고의 답변이 실제 무언가를 만들 때 더 유용한 것을 생성한다고 생각하지만 AWS의 템플릿을 사용하여 빠른 hello world 실행을 위해서는 이것이 효과적입니다.
/ user? name = bob을 얻습니다.
{
"name": "$input.params().querystring.get('name')"
}
/ user / bob을 얻습니다
{
"name": "$input.params('name')"
}
다음 매개 변수 매핑 예제는 경로, 쿼리 문자열 및 헤더를 포함한 모든 매개 변수를 JSON 페이로드를 통해 통합 엔드 포인트로 전달합니다.
#set($allParams = $input.params())
{
"params" : {
#foreach($type in $allParams.keySet())
#set($params = $allParams.get($type))
"$type" : {
#foreach($paramName in $params.keySet())
"$paramName" : "$util.escapeJavaScript($params.get($paramName))"
#if($foreach.hasNext),#end
#end
}
#if($foreach.hasNext),#end
#end
}
}
실제로이 맵핑 템플리트는 다음과 같이 페이로드의 모든 요청 매개 변수를 출력합니다.
{
"parameters" : {
"path" : {
"path_name" : "path_value",
...
}
"header" : {
"header_name" : "header_value",
...
}
'querystring" : {
"querystring_name" : "querystring_value",
...
}
}
}
Amazon API Gateway 개발자 안내서 에서 복사
람다에서 자바 스크립트로 구문 분석하기 위해 쿼리 문자열이 간단합니다.
GET / user? name = bob
var name = event.params.querystring.name;
그래도 GET 사용자 / 밥 문제는 해결되지 않습니다.
Lambda 함수는 JSON 입력을 예상하므로 쿼리 문자열을 구문 분석해야합니다. 해결 방법은 매핑 템플릿을 사용하여 쿼리 문자열을 JSON으로 변경하는 것입니다.
C # .NET Core에 사용 했으므로 예상되는 입력은 "queryStringParameters"매개 변수가있는 JSON이어야합니다.
이를 달성하려면 아래의 4 단계를 따르십시오.
- API Gateway 자원의 맵핑 템플리트를 열고 새
application/json
컨텐츠 유형을 추가하십시오 .
아래의 템플릿을 복사하여 쿼리 문자열을 JSON으로 구문 분석하고 매핑 템플릿에 붙여 넣습니다.
{ "queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end} }
API Gateway에서 Lambda 함수를 호출하고 다음 쿼리 문자열 (예 :)을 추가하십시오.
param1=111¶m2=222¶m3=333
매핑 템플릿은 아래의 JSON 출력을 생성해야하며 이는 Lambda 함수 의 입력 입니다.
{ "queryStringParameters": {"param3":"333","param1":"111","param2":"222"} }
끝났습니다. 이 시점에서 Lambda 함수의 논리는 쿼리 문자열 매개 변수를 사용할 수 있습니다.
행운을 빕니다!
Lambda를 "Lambda Proxy Integration" 으로 사용할 수 있습니다 ( https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda 참조). html # api-gateway-proxy-integration-lambda-function-python] ,이 람다에 사용할 수있는 옵션은 다음과 같습니다.
Nodejs Lambda 'event.headers', 'event.pathParameters', 'event.body', 'event.stageVariables'및 'event.requestContext'
Python Lambda 이벤트 [ 'headers'] [ 'parametername'] 등의 경우
@Jonathan의 답변 으로 Integration Request 에서 Lambda 프록시 통합 사용 표시 후 소스 코드에서 502 Bad Gateway 오류를 전달하려면 아래 형식으로 구현해야 합니다.
NodeJS 8.10 :
exports.handler = async (event, context, callback) => {
// TODO: You could get path, parameter, headers, body value from this
const { path, queryStringParameters, headers, body } = event;
const response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify({
path,
query: queryStringParameters,
headers,
body: JSON.parse(body)
}),
"isBase64Encoded": false
};
return response;
};
API를 다시 실행하기 전에 API Gateway에 리소스 를 배포하는 것을 잊지 마십시오 . 응답 JSON은 본문의 올바른 세트를 반환 합니다. 따라서 이벤트에서 경로, 매개 변수, 헤더, 본문 값을 얻을 수 있습니다
const {path, queryStringParameters, headers, body} = 이벤트;
이 답변 중 몇 가지를 읽은 후 2018 년 8 월에 몇 가지 조합을 사용하여 python 3.6에 대한 람다를 통해 쿼리 문자열 매개 변수를 검색했습니다.
먼저 API Gateway-> 내 API-> 리소스 (왼쪽)-> 통합 요청으로 이동했습니다. 맨 아래에서 맵핑 템플리트를 선택한 후 컨텐츠 유형으로을 입력하십시오 application/json
.
그런 다음 Amazon에서 제공하는 Method Request Passthrough 템플릿을 선택하고 API 저장 및 배포를 선택합니다.
그런 다음 람다 event['params']
는 모든 매개 변수에 액세스하는 방법입니다. 쿼리 문자열의 경우 :event['params']['querystring']
'Programing' 카테고리의 다른 글
텍스트가 한 줄 이상을 차지하지 못하게하는 방법은 무엇입니까? (0) | 2020.03.14 |
---|---|
HTML에서 파일 입력에 값을 설정하는 방법은 무엇입니까? (0) | 2020.03.14 |
PHP 짧은 태그를 활성화하는 방법은 무엇입니까? (0) | 2020.03.14 |
Python Image Library가 "디코더 JPEG를 사용할 수 없음"메시지와 함께 실패 함 (0) | 2020.03.13 |
파이썬에서 스케줄러와 같은 Cron을 얻으려면 어떻게해야합니까? (0) | 2020.03.13 |