it-swarm.com.de

Übergeben von Abfragenzeichenfolgen oder Routenparametern an AWS Lambda von Amazon API Gateway

zum Beispiel, wenn wir verwenden wollen 

GET /user?name=bob

oder

GET /user/bob

Wie würden Sie beide Beispiele als Parameter an die Lambda-Funktion übergeben?

Ich habe in der Dokumentation etwas über das Festlegen eines "Abgebenen von" gesehen, aber diese Einstellung kann in der API-Gateway-Konsole nicht gefunden werden.

  • method.request.path.parameter-name für einen Pfadparameter mit dem Namen parameter-name, wie auf der Seite Method Request definiert.
  • method.request.querystring.parameter-name für einen Abfragezeichenfolgeparameter namens parameter-name, wie auf der Seite Method Request definiert.

Ich sehe keine dieser Optionen, obwohl ich eine Abfragezeichenfolge definiert habe.

251
MonkeyBonkey

Ab September 2017 müssen Sie keine Zuordnungen mehr für den Zugriff auf den Anforderungstext konfigurieren.

Alles, was Sie tun müssen, ist unter "Integrationsanforderung" unter "Ressource" zu überprüfen.

 enter image description here

Sie können dann auf Abfrageparameter, Pfadparameter und Kopfzeilen wie auf diese zugreifen

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

Um dies zu erreichen, sind folgende Schritte erforderlich:

Innerhalb der API Gateway Console ...

  1. gehe zu Resources -> Integration Request
  2. klicken Sie auf das Plus- oder Bearbeiten-Symbol neben dem Dropdown-Menü für Vorlagen (ungerade, da das Vorlagenfeld bereits geöffnet ist und der Button hier grau hinterlegt ist).
  3. Geben Sie application/json explizit in das Feld für den Inhaltstyp ein, obwohl ein Standardwert angezeigt wird (wenn Sie dies nicht tun, wird es nicht gespeichert und es wird keine Fehlermeldung angezeigt.)
  4. setzen Sie dies in das Eingabemapping { "name": "$input.params('name')" }

  5. klicken Sie auf das Kontrollkästchen neben der Dropdown-Liste der Vorlagen (ich gehe davon aus, dass dies das endgültige Speichern ist).

193
MonkeyBonkey

Ich habe diese Zuordnungsvorlage verwendet, um dem Lambda-Ereignis Body-, Header-, Methoden-, Pfad- und URL-Abfragezeichenfolgeparameter bereitzustellen. Ich habe einen Blogbeitrag geschrieben, in dem die Vorlage ausführlicher erläutert wird: http://kennbrodhagen.net/2015/12/06/wie- API-Gateway/

Hier ist die Zuordnungsvorlage, die Sie verwenden können:

{
  "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
  }  
}
118
kennbrodhagen

Heutzutage ist eine Dropdown-Vorlage in der API Gateway Console von AWS enthalten.

Klicken Sie für Ihre API auf den Ressourcennamen ... und dann auf GET

Erweitern Sie "Body Mapping-Vorlagen"

Eintippen 

anwendung/Json

für Inhaltstyp (muss explizit eingegeben werden) und klicken Sie auf das Häkchen

Es öffnet sich ein neues Fenster mit den Worten "Vorlage generieren" und einer Dropdown-Liste (siehe Bild).

Wählen 

Method Request Passthrough

 enter image description here

Klicken Sie dann auf Speichern

Um auf Variablen zuzugreifen, verwenden Sie einfach die folgende Syntax (Python) Z. URL:

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

Sie können Variablen wie folgt erhalten:

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'])

Daher müssen Sie nicht jede gewünschte Variable explizit benennen oder zuordnen.

32

Die akzeptierte Antwort funktionierte gut für mich, aber um gimenetes Antwort zu erweitern, wollte ich eine generische Vorlage, mit der ich alle Abfrage-/Pfad-/Header-Parameter (nur als Zeichenfolgen für den Moment) durchgehen konnte, und die folgende Vorlage kam dazu. Ich poste es hier, falls jemand es nützlich findet:

#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
}
24
BenV

Um Parameter an Ihre Lambda-Funktion zu übergeben, müssen Sie eine Zuordnung zwischen der API-Gateway-Anforderung und Ihrer Lambda-Funktion erstellen. Die Zuordnung erfolgt im Abschnitt Integration Request -> Mapping templates der ausgewählten API-Gateway-Ressource.

Erstellen Sie ein Mapping vom Typ application/json, und rechts bearbeiten Sie die Vorlage (klicken Sie auf den Stift).

Eine Zuordnungsvorlage ist eigentlich eine Geschwindigkeitsvorlage, in der Sie Ifs, Loops und natürlich Variablen verwenden können. Die Vorlage enthält diese Variablen , mit denen Sie auf Abfrageparameter, Anforderungsheader usw. einzeln zugreifen können. Mit dem folgenden Code können Sie die gesamte Querzeichenfolge neu erstellen:

{
    "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('$')
}

Hinweis: Klicken Sie auf das Häkchensymbol, um die Vorlage zu speichern. Sie können Ihre Änderungen mit der Schaltfläche "Test" in Ihrer Ressource testen. Um die Abfragezeichenfolgeparameter in der AWS-Konsole zu testen, müssen Sie die Parameternamen im Abschnitt Method Request Ihrer Ressource definieren.

Hinweis: Weitere Informationen zur Geschwindigkeitssprache finden Sie im Velocity-Benutzerhandbuch .

Dann können Sie in Ihrer Lambda-Vorlage Folgendes tun, um die Querzeichenfolge analysieren zu lassen:

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

Als ich versuchte, eine meiner eigenen Fragen zu beantworten hier , bin ich auf diesen Trick gestoßen.

Verwenden Sie in der API-Gateway-Zuordnungsvorlage Folgendes, um die vollständige Abfragezeichenfolge anzugeben, die vom HTTP-Client gesendet wird:

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

Der Vorteil ist, dass Sie sich nicht auf einen Satz vordefinierter zugeordneter Schlüssel in Ihrer Abfragezeichenfolge beschränken müssen. Jetzt können Sie beliebige Schlüssel-Wert-Paare in der Abfragezeichenfolge akzeptieren, wenn Sie dies so tun möchten. 

Hinweis: Gemäß this wird nur $input.params(x) als für die VTL-Vorlage zur Verfügung gestellte Variable aufgeführt. Möglicherweise ändern sich die Interna und querystring ist möglicherweise nicht mehr verfügbar.

15
user3526

Jetzt sollten Sie in der Lage sein, den neuen Proxy-Integrationstyp für Lambda zu verwenden, um automatisch die vollständige Anforderung in Standardform zu erhalten, anstatt Zuordnungen zu konfigurieren.

siehe: http://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda-proxy-integration- On-Proxy-Ressource

11
Jack Kohn - AWS

GET/user? Name = bob

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

GET/Benutzer/Bob

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

Viele Antworten sind großartig. Aber ich wollte etwas etwas einfacher ... Ich wollte etwas, das mit dem "Hello World" -Probe kostenlos funktioniert. Das bedeutet, ich wollte einen einfachen Anforderungshauptteil erzeugen, der mit der Abfragezeichenfolge übereinstimmt:

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

Ich denke, dass die beste Antwort etwas nützlicher ist, wenn man etwas Reales baut, aber um eine schnelle Hallo-Welt mit der Vorlage von AWS zum Laufen zu bringen, funktioniert das großartig.

4
KrisTC

Im folgenden Beispiel für die Parameterzuordnung werden alle Parameter, einschließlich Pfad, Abfragenzeichenfolge und Header, über eine JSON-Nutzlast an den Integrationsendpunkt übergeben

#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
  }
}

In der Tat gibt diese Zuordnungsvorlage alle Anforderungsparameter in der Nutzlast wie folgt aus:

{
  "parameters" : {
     "path" : {    
       "path_name" : "path_value", 
       ...
     }
     "header" : {  
       "header_name" : "header_value",
       ...
     }
     'querystring" : {
       "querystring_name" : "querystring_value",
       ...
     }
   }
}

Aus dem Amazon API Gateway Entwicklerhandbuch kopiert

4
matsev

Die Abfragezeichenfolge ist direkt in Javascript im Lambda zu analysieren 

für GET/user? name = bob

 var name = event.params.querystring.name;

Dies löst die GET-Benutzer/Bob-Frage jedoch nicht.

2
Michael Riecken

Die Lambda-Funktion erwartet eine JSON-Eingabe. Daher ist eine Analyse der Abfragezeichenfolge erforderlich. Die Lösung besteht darin, die Abfragezeichenfolge mithilfe der Zuordnungsvorlage in JSON zu ändern.
Ich habe es für C # .NET Core verwendet, daher sollte die erwartete Eingabe ein JSON mit dem Parameter "queryStringParameters" sein. 
Befolgen Sie diese 4 Schritte, um dies zu erreichen:

  1. Öffnen Sie die Zuordnungsvorlage Ihrer API Gateway-Ressource und fügen Sie den neuen application/json content-tyap hinzu:

 API Gateway mapping template

  1. Kopieren Sie die Vorlage unten, die die Abfragezeichenfolge in JSON analysiert, und fügen Sie sie in die Mappingvorlage ein:

    {
    "queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end}
    }
    
  2. Rufen Sie im API-Gateway Ihre Lambda-Funktion auf und fügen Sie die folgende Abfragezeichenfolge (für das Beispiel) hinzu: param1=111&param2=222&param3=333

  3. Die Zuordnungsvorlage sollte unten die JSON-Ausgabe erstellen, d. H eingang für Ihre Lambda-Funktion. 

    {
    "queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
    }
    
  4. Sie sind fertig. Ab diesem Punkt kann die Logik Ihrer Lambda-Funktion die Abfragezeichenfolgeparameter verwenden.
    Viel Glück!

1
Lior Kirshner

Als @ Jonathans Antwort, nach der Markierung Use Lambda Proxy integration in Integrationsanforderung , sollten Sie in Ihrem Quellcode das folgende Format verwenden, um pass by 502 Bad Gateway error.

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;
};

Vergessen Sie nicht, Ihre resource am API Gateway bereitzustellen, bevor Sie die API erneut ausführen Antwort JSON gibt nur den Satz zurück, der in body korrekt ist Sie könnten Pfad, Parameter erhalten , Header, Körperwert aus Ereignis

const {path, queryStringParameters, headers, body} = Ereignis;

0
Long Nguyen

Sie können Lambda als "Lambda-Proxy-Integration" verwenden, diesbezüglich [ https://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simpl proxy-for-lambda.html # api-gateway-proxy-integration-lambda-function-python] , Optionen, die für dieses Lambda verfügbar sind 

Für Nodejs Lambda 'Event.headers', 'event.pathParameters', 'event.body', 'event.stageVariables', Und 'event.requestContext'

Für Python Lambda Event ['headers'] ['parametername'] und so weiter

0
RajDev