2017-01-22 4 views
0

Ich habe den Funktionscode folgende Lambda für einfach den Autor und Metadaten eines hochgeladen Falle eines S3-Bucket Ausdrucken:"KeyError: 'Records'" in AWS S3 - Lambda-Trigger

from __future__ import print_function 
import json 
import urllib 
import boto3 

print('Loading function') 

s3 = boto3.client('s3') 


def lambda_handler(event, context): 

    #print("Received event: " + json.dumps(event, indent=2)) 
    # bucket = event['Records'][0]['s3']['bucket']['name'] 

    for record in event['Records']: 
     bucket = record[0]['s3']['bucket']['name'] 
     key = record[0]['s3']['object']['key'] 
     response = s3.head_object(Bucket=bucket, Key=key) 

     logger.info('Response: {}'.format(response)) 

     print("Author : " + response['Metadata']['author']) 
     print("Description : " + response['Metadata']['description']) 

aber ich, ich erhalte die folgende Fehlermeldung während des Tests:

{ 
    "stackTrace": [ 
    [ 
     "/var/task/lambda_function.py", 
     17, 
     "lambda_handler", 
     "for record in event['Records']:" 
    ] 
    ], 
    "errorType": "KeyError", 
    "errorMessage": "'Records'" 
} 

bin ich falsch etwas zu tun, während der Eimer Namen und Schlüsselnamen des Objekts S3 zugreifen? Wenn nicht, was mache ich dann falsch?

+0

Welche Art von S3-Ereignis Trigger verwenden Sie? – franklinsijo

+0

@franklinsijo 'Ereignistyp: ObjectCreated' – Dawny33

+0

Und ist dies ein Test-Event oder ein tatsächliches Event? Können Sie das 'Ereignis' ausdrucken und prüfen, ob es' Records' enthält? – franklinsijo

Antwort

3

bisschen spät auf die Party. Aber hier ist mein erster Beitrag!

ERKLÄRUNG:

Wenn Sie in Lambda-Panel-Test -> def lambda_handler (Ereignis, Kontext) < - Ereignis direkt eingespritzt wird.

jedoch in AWS API seine notwendig zu Mapping Template oder auf andere Weise hinzufügen -> Ereignis < - leer ist, also in quizzing resultierende:

"errorType": "KeyError", "errorMessage": "'Records'"

diese Null-Zeiger ist. Datensätze existieren nicht, da -> Ereignis < - nicht existiert.

LÖSUNG:

Sie benötigen Integration anfordern innerhalb AWS API konfigurieren. Klicken Sie auf Body Mapping Vorlagen. Dann Add Mapping Template Set Inhaltstyp application/json Dann Mapping-Vorlage erzeugt bearbeiten:

{ 
 
    "body" : $input.json('$'), 
 
    "headers": { 
 
    #foreach($header in $input.params().header.keySet()) 
 
    "$header": "$util.escapeJavaScript($input.params().header.get($header))" #if($foreach.hasNext),#end 
 

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

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

 
    #end 
 
    } 
 
}

Und bearbeiten Lambda-Funktion:

ersetzen:

for record in event['Records']:

mit:

for record in event['query']['Records']

nicht wissen, ob Stapel Sie mit dieser Antwort ping wird - so nenne ich Sie @ Dawny33 @KevinOelen @franklinsijo

Was Erklärung, die ich gemustert es auf meinem eigenen . Jedoch kommt "Mapping-Vorlage" von https://medium.com/simple-thoughts-amplified/passing-variables-from-aws-api-gateway-to-lambda-3c5d8602081b