Programing

Amazon API Gateway에서 querystring 또는 route 매개 변수를 AWS Lambda로 전달하는 방법

lottogame 2020. 3. 14. 10:01
반응형

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 Console 내에서 ...

  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 (명시 적으로 입력해야 함)을 선택하고 체크 표시를 클릭하십시오.

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

고르다

메소드 요청 통과

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

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

변수에 액세스하려면 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에 새로운 프록시 통합 유형을 사용하여 매핑을 구성하지 않고 표준 형태로 전체 요청을 자동으로 가져올 수 있습니다.

참조 : http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration-on- 프록시 리소스


여기에 많은 답변이 훌륭합니다. 그러나 나는 조금 더 간단한 것을 원했습니다. "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 단계를 따르십시오.

  1. API Gateway 자원의 맵핑 템플리트를 열고 새 application/json컨텐츠 유형을 추가하십시오 .

API 게이트웨이 매핑 템플릿

  1. 아래의 템플릿을 복사하여 쿼리 문자열을 JSON으로 구문 분석하고 매핑 템플릿에 붙여 넣습니다.

    {
    "queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end}
    }
    
  2. API Gateway에서 Lambda 함수를 호출하고 다음 쿼리 문자열 (예 :)을 추가하십시오. param1=111&param2=222&param3=333

  3. 매핑 템플릿은 아래의 JSON 출력을 생성해야하며 이는 Lambda 함수 입력 입니다.

    {
    "queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
    }
    
  4. 끝났습니다. 이 시점에서 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']

참고 URL : https://stackoverflow.com/questions/31329958/how-to-pass-a-querystring-or-route-parameter-to-aws-lambda-from-amazon-api-gatew

반응형