Was ist das "Ereignis" einer AWS-Lambda-Funktion und wie sende ich eine über das API-Gateway?

7

Eine AWS-Lambda-Funktion hat ein "Ereignis" und einen "Kontext" wie in Parametern. Das "Ereignis" ist ein JSON-Objekt.

Ich versuche, eine API (Manager über das AWS API Gateway) mit meiner Lambda-Funktion zu verbinden und sende den JSON des Ereignisses als Hauptteil eines http-POST. Dies schlägt kläglich fehl, und ich habe nur einen Hinweis darauf, dass möglicherweise ein leeres Ereignis an die Lambda-Funktion gesendet wurde.

Wie soll ich das "Ereignis" über die API senden?

Dies ist der Code meiner Lambda-Funktion:

from __future__ import print_function

import boto3
import json
import time

print('Loading function')

def lambda_handler(event, context):
    print("Received event: ")
    print(type(event))
    print(""+json.dumps(event, indent=2))

    id = event['Id']
    dynamo = boto3.resource('dynamodb').Table('Table1')
    dynamo.put_item( 
        Item = {
        'Button' : int(id),
        'Time' : int(time.time()),
    })
    return {
        'statusCode' : '400',
        'body' : null,
        'headers' : { 'Content-Type': 'application/json', },
    }

Wenn Sie einen Test für die Lambda-Funktion ausführen, erhalten Sie das folgende Protokoll:

START RequestId: x Version: $LATEST
Received event: 
<type 'dict'>
{
  "Id": "1"
}
END RequestId: x

und die Antwort

{
   "body": null,
   "headers": {
     "Content-Type": "application/json"
  },
  "statusCode": "400"
}

aber das Ausführen über die API-Gateway-Testfunktion ergibt

Tue May 16 15:54:27 UTC 2017 : Endpoint response body before transformations: 
  {"stackTrace": [["/var/task/lambda_function.py", 12, "lambda_handler", 
   "id = event['Id']"]], "errorType": "KeyError", "errorMessage": "'Id'"}
Tue May 16 15:54:27 UTC 2017 : Endpoint response headers: 
  {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=x, 
   Connection=keep-alive, Content-Length=153,
   X-Amz-Function-Error=Unhandled, Date=Tue, 16 May 2017 15:54:27 GMT, 
   X-Amzn-Trace-Id=root=x;sampled=0, Content-Type=application/json}
Tue May 16 15:54:27 UTC 2017 : Execution failed due to configuration 
   error: Malformed Lambda proxy response
Tue May 16 15:54:27 UTC 2017 : Method completed with status: 502
Bex
quelle
2
Ein besserer Ort, um dies zu fragen, wäre die Stackoverflow-Site.
Bravokeyl
1
Wie rufen Sie die Lambda-Funktion auf? Aktivieren Sie Cloudwatch-Protokolle für die API und überprüfen Sie die Protokolle auf Lambda-Funktion, um eine Vorstellung davon zu erhalten, was falsch ist.
Bravokeyl
Sie sagen, dass Ihr Codierungsaufwand nicht das gewünschte Ergebnis liefert. Bitte zeigen Sie den Code.
Mico
@Bex KeyError bedeutet, dass der Schlüssel 'Id' im Ereignisparameter fehlt. Was meinen Sie damit, dass Sie es genau über das API-Gateway ausführen? Sie machen den Fehler in diesem Teil.
Mico
Zeigen Sie auch in diesem Bereich Ihre Bemühungen.
Mico

Antworten: