2017-05-11 5 views
2

Wie kann ich ein JSON-Objekt zu AWS Lambda-Funktion über AWS API Gateway buchen?POST JSON-Objekt zu AWS Lambda

p.s.- Mein Ziel ist es, die Lambda-Funktion in Python zu schreiben und dann auf aws SQS zu posten.

Vielen Dank im Voraus.

Antwort

4

Ich fand es heraus. Jetzt habe ich einen API Gateway acceptiong Client veröffentlicht JSON-Daten eines bestimmten Formats und dann an eine AWS-Lambda-Funktion übergeben, die die Daten in eine AWS-SQS ablegt. Die Schritte werden im Folgenden erläutert in Details-

STEP 1-

in allen unterstützten Sprachen eine Lambda-Funktion erstellen (ich verwendet habe Python 3.6). Hier ist ein Beispielcode.

import boto3 
import json 

def lambda_handler(event, context): 

    sqs = boto3.resource('sqs') 

    queue = sqs.get_queue_by_name(QueueName='userData') 

    response = queue.send_message(MessageBody=json.dumps(event)) 

    return { 
       "status":"0", 
       "message":"", 
       "pubId":event["ClientID"], 
       "routetitle":event["routeTitle"] 
      } 

Anmerkung: Ich habe sowohl json und boto3 Bibliothek importiert, die in aws Kontext verfügbar sind, brauchen Sie nicht mehr Datei hinzuzufügen. Sehen Sie auch, dass ich für den SQS keine anderen Angaben als den Namen angegeben habe, da sich sowohl meine Lambda-Funktion als auch SQS in derselben AWS-Region befinden. Ich lasse die ganze Variable "event" an SQS ablegen, da diese nur die geposteten JSON-Daten enthält.

STEP 2-

nun in der AWS-Konsole goto "API Gateway" und dann einen neuen API-Gateway erstellen und dann eine "POST" action unter Ressourcen erstellen.

Please check the screenshot

Jetzt, unter der Post Aktion, klicken Sie auf "Integrationsanforderung". Jetzt eine Körpervorlage, um es wie das unten-

{ 
    "userMobile" : "$input.params('userMobile')", 
    "ClientID" : "$input.params('ClientID')", 
    "routeTitle" : "$input.params('routeTitle')" 
} 

Auch gegebene Beispiel hinzufügen, stellen Sie sicher, dass Sie die „Integration Type“ Ihre API als „Lambda“ und die Lambda-Funktion haben wir in STEP-1 erstellt ist Verbunden mit der API.

Jetzt sind wir fast fertig. Jetzt müssen wir lediglich eine Phase für die von uns erstellte API erstellen und die API implementieren. ***

Bitte beachten Sie die HTTP-URL der API nach der Bereitstellung.

STEP 3-

Nun gehen Sie auf die "Simple Queuing Service (SQS)" und dann eine einfache SQS erstellen mit all den Standardparametern zu halten. Stellen Sie sicher, dass der Name der Warteschlange mit dem übereinstimmt, den Sie in Ihrer Lambda-Funktion angegeben haben. Sowohl Ihre Lambda-Funktion als auch Ihr SQS befinden sich in derselben AWS-Region.

Jetzt können Sie JSON-Daten im selben Format an Ihre API senden, und Ihre Lambda-Funktion speichert sie in der SQS-Warteschlange, in der Sie die Daten anzeigen können.

Sie können die API auch mit Tools wie Fidler testen.

*** Stellen Sie sicher, dass Sie die API für jedes Mal erneut bereitstellen, wenn Sie Änderungen daran vornehmen.

+0

Danke für die ausführliche Antwort! Können Sie diese Frage mit dieser Frage markieren? –

+0

Hallo, @AbhignaNagaraja danke für deine Anerkennung. Ich habe diese Frage damit beantwortet. – Sudip

+0

Ich kann nicht sehen, wie Sie das 'response' Objekt verwenden, nachdem Sie es erstellt haben? – CpILL

0

Ja, Sie können,

Wenn Sie die Lambda-Funktion von API-Gateway unter Verwendung des Lambda-Proxy-Integration auslösen wird die Anforderung die Funktion mit einer Nutzlast aufrufen, die unten so aussieht. Wie Sie sehen können, müssen Sie nur das JSON-Körperattribut analysieren.

{ 
    "resource": /path", 
    "path": "/path", 
    "httpMethod": "PUT", 
    "headers": { 
     "Accept": "*/*", 
     "Accept-Encoding": "gzip, deflate, sdch, br", 
     "Accept-Language": "en-US,en;q=0.8,pl;q=0.6,en-GB;q=0.4", 
     "Cache-Control": "no-cache", 
     "CloudFront-Forwarded-Proto": "https", 
     "CloudFront-Is-Desktop-Viewer": "true", 
     "CloudFront-Is-Mobile-Viewer": "false", 
     "CloudFront-Is-SmartTV-Viewer": "false", 
     "CloudFront-Is-Tablet-Viewer": "false", 
     "CloudFront-Viewer-Country": "PL", 
     "Content-Type": "application/json", 
     "DNT": "1", 
     "Host": "api.stockflare.com", 
     "Origin": "http://localhost:3000", 
     "Pragma": "no-cache", 
     "Referer": "http://localhost:3000/databank", 
     "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", 
     "Via": "1.1 XXXXX.cloudfront.net (CloudFront)", 
     "X-Amz-Cf-Id": "XXXXXX==", 
     "X-Amzn-Trace-Id": "Root=XXXXXX", 
     "X-Forwarded-For": "XXXXX", 
     "X-Forwarded-Port": "443", 
     "X-Forwarded-Proto": "https" 
    }, 
    "queryStringParameters": null, 
    "pathParameters": null, 
    "stageVariables": null, 
    "requestContext": { 
     "path": "/path", 
     "accountId": "XXXXX", 
     "resourceId": "p0flbp", 
     "stage": "v1", 
     "requestId": "XXXXX", 
     "identity": { 
     "cognitoIdentityPoolId": null, 
     "accountId": null, 
     "cognitoIdentityId": null, 
     "caller": null, 
     "apiKey": "", 
     "sourceIp": "XXXXXX", 
     "accessKey": null, 
     "cognitoAuthenticationType": null, 
     "cognitoAuthenticationProvider": null, 
     "userArn": null, 
     "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", 
     "user": null 
     }, 
     "resourcePath": "/path", 
     "httpMethod": "PUT", 
     "apiId": "XXXXXX" 
    }, 
    "body": "{\"fields\":[\"forecast_pe\"],\"countries\":[\"_all\",\"amer\",\"apac\",\"emea\"],\"sectors\":[\"50\",\"51\"]}", 
    "isBase64Encoded": false 
    } 
+0

Dank @Mark. Ich habe es tatsächlich anders gemacht. Ich habe ein JSON-Schemamodell im API-Gateway erstellt und in der API-Körpervorlage verwendet. Dann holte ich alle Daten von der geraden Variable des angeschlossenen Lambda und warf sie dann in eine AWS SQS. Es funktioniert ziemlich gut für mich. Ich werde eine separate Antwort für diese Frage schreiben, die dasselbe erklärt. – Sudip