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


348

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

GET /user?name=bob

또는

GET /user/bob

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

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

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

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

답변:


299

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

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

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

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

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

23
이것은 좋은 팁입니다. 그러나 Lambda 프록시 통합을 켜면 "잘못된 Lambda 프록시 응답"오류가 발생할 수 있습니다. 해결 방법은 다음과 같습니다. stackoverflow.com/questions/43708017/…
AaronBaker

6
구현이 RequestHandler제공 하는 투명 deserialization을 유지하면서 Java 에서이 작업을 수행하는 방법이 있습니까?
구두

2
이 설정은 어디에 있습니까?
red888

2
@MattWestlake user라는 리소스를 만들고 그 아래에 API Gateway에서 {name}이라는 리소스를 만듭니다.
Jonathan

3
이 변경 후 Amazon API Gateway-> Actions-> Deploy API로 이동하여 라이브 환경에 다시 배포해야한다고 언급하고 싶습니다.
victorvartan

221

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

API Gateway 콘솔 내에서 ...

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

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


9
경로가 / user / {username} 인 / user / bob과 같은 URL에서 URL 매개 변수를 통해 전송하도록 했습니까? 나는 모든 종류의 순열을 시도했지만 그것을 해결할 수 없었습니다.
Lucas

5
공식 문서가 있는지 아는 사람이 있습니까? 빈 문자열보다 모든 쿼리 매개 변수를 통과하거나 선택적 값을보다 우아하게 처리하는 것이 좋습니다.
AxelTheGerman

6
iOS 개발자를위한 팁 : API Gateway는 각 변수를 쿼리 문자열로 정의하고 ( 'Method Request'아래) API를 배포 할 때까지 쿼리 데이터를 전달하지 않습니다. 배포 전까지는 콘솔 테스트에서 작동하지만 앱의 쿼리는 줄입니다.
AlexeyVMP


6
루카스, 나는 / user / {username} 패턴을 사용하여 작동시켰다. 당신의 GET 자원 경로 4 단계 같은 입력 매핑 외모에, / 사용자 / {사용자 이름} 인 경우 그냥 기억 { "이름": "$ input.params ( '이름')"}
제라드

134

이 매핑 템플릿을 사용하여 본문, 헤더, 메서드, 경로 및 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
  }  
}

놀랄 만한! 나는 일반적으로 처리기에 물건을 전달하는 데 어려움을 겪고있었습니다. 가장 좋은 답변은 여기입니다.
Venkat D.

나는 이것을했지만 아직 아무것도 얻지 못했습니다. 정의되지 않음을 표시합니다. URL에서 매개 변수를 어떻게 보내야합니까? 일반적인 GET URL 시나리오와 같이 URL에 변수 이름을 지정해야합니까? 이것 좀 도와주세요.
Parthapratim Neog

8
결과를 얻지 마라. 문제는 매핑을 추가하고 방금 저장 deploy했으며 API를 다시 한 번 만들지 않았다는 것입니다. 새로운 매핑으로 API를 배포하면 정상적으로 작동합니다. 정말 감사합니다.
Parthapratim Neog

@ shashu10 내 답변보기
matsev

1
블로그가 얼마나 유용한 지 알려 드릴 수 없습니다. "eturn-html-from-aws-api-gateway"게시물을 먼저 찾은 다음 정확히 필요했기 때문에 따라갔습니다. 이제 함수에 일부 매개 변수를 전달하고 그에 따라 html을 수정해야합니다. 다시 한번 실제 가이드가있는 유일한 사람입니다! 내가 찾은 다른 모든 가이드는 요점을 놓친 것 같습니다.
user3685427

41

요즘 드롭 다운 템플릿은 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'])

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


우수한! 기능은 서비스에 있지만 놓쳤습니다!
hnvasa 2016 년

25

람다 함수에 매개 변수를 전달하려면 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

9
이것이 가장 좋은 해결책입니다. 그때를 기억하십시오 Actions>Deploy API(나는 이것을 잊고 내 시간을 낭비했습니다 ...). 연결된 람다는 배치 후 즉시 변경을 수행합니다. 에서 확인할 수 있습니다 Stages > #stage (like: prod) > Deployment History.
loretoparisi

24

수락 된 답변은 나에게 잘 작동했지만 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
}

1
Fab, POST (JSON 본문 포함) 요청과 쿼리 문자열이있는 GET 모두에 동일한 기능을 사용할 수 있기를 원했습니다. 꿈을 꾼다. 감사!
Matt Fletcher

@benv는 이것이 전체 템플릿입니까?
nxmohamad

17

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

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

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

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

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


1
이것은 여전히 ​​2017 년 5 월 현재 작동하지만 실제 쿼리 문자열 대신 API Gateway가 생성하는 JS 객체를 반환합니다. 반복되는 매개 변수를 배열로 변환하기 위해 쿼리 문자열을 구문 분석하려고하기 때문에 이것은 성가신 일입니다.
Tom Saleeba

11

이제 Lambda에 새로운 프록시 통합 유형을 사용하여 매핑을 구성하지 않고 표준 형태로 전체 요청을 자동으로 가져올 수 있습니다.

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


1
왜 그런지 잘 모르겠지만 프록시 통합이 일반적으로 작동하지 않습니다. 내가 만든 최신 API에서 제거해야했습니다.
Gustavo Straube

^ 더 나아가 API 게이트웨이에 CORS 문제가 있습니다. AWS 문서와 함께 CORS를 작동시킬 수 없었습니다. 그러나 나는 2015 년 중반부터 CORS를 수동으로 설정하는 방법이있는 오래된 중간 기사를 찾았습니다.
Stephen Tetreault

7

/ user? name = bob을 얻습니다.

{
    "name": "$input.params().querystring.get('name')"
}

/ user / bob을 얻습니다

{
    "name": "$input.params('name')"
}

5

여기에 많은 답변이 훌륭합니다. 그러나 나는 조금 더 간단한 것을 원했습니다. "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 실행을 위해서는 이것이 효과적입니다.


4

다음 매개 변수 맵핑 예제는 경로, 쿼리 문자열 및 헤더를 포함한 모든 매개 변수를 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 개발자 안내서 에서 복사


2

쿼리 문자열은 람다에서 자바 스크립트로 구문 분석하기가 쉽습니다.

GET / user? name = bob

 var name = event.params.querystring.name;

그래도 GET 사용자 / 밥 문제는 해결되지 않습니다.


its event.queryStringParameters.name
Neo

나는해야했다event.queryStringParameters.name
Anders Kitson

2

@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} = 이벤트;


1

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 함수의 논리는 쿼리 문자열 매개 변수를 사용할 수 있습니다.
    행운을 빕니다!


0

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'] 등의 경우



-1

이 답변 중 몇 가지를 읽은 후 2018 년 8 월에 몇 가지 조합을 사용하여 python 3.6에 대한 람다를 통해 쿼리 문자열 매개 변수를 검색했습니다.

먼저 API Gateway-> 내 API-> 리소스 (왼쪽)-> 통합 요청으로 이동했습니다. 맨 아래에서 맵핑 템플리트를 선택한 후 컨텐츠 유형으로을 입력하십시오 application/json.

그런 다음 Amazon에서 제공하는 Method Request Passthrough 템플릿을 선택하고 API 저장 및 배포를 선택하십시오.

그런 다음 람다 event['params']는 모든 매개 변수에 액세스하는 방법입니다. 쿼리 문자열의 경우 :event['params']['querystring']

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.