2017-01-22 29 views
0

私は単にS3バケットのアップロードされたイベントの著者およびメタデータをプリントアウトするため、次のラムダ関数のコードを持っている:「KeyError例外: 『レコード』」AWS S3で - ラムダトリガ

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

しかし、I

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

S3オブジェクトのバケット名とキー名にアクセスする際に何か問題がありますか?そうでなければ、私はここで間違って何をしていますか?

+0

どのようなタイプのS3イベントトリガーを使用していますか? – franklinsijo

+0

@franklinsijo 'イベントの種類:ObjectCreated' – Dawny33

+0

これはテストイベントか実際のイベントですか?あなたは 'イベント'を印刷し、 'レコード'が含まれているかどうか確認できますか? – franklinsijo

答えて

3

ビット遅れています。しかし、ここに私の最初の投稿です!

説明:

あなたはラムダパネルでテスト - > DEF lambda_handler(イベント、コンテキスト)< - イベントが直接注入されます。

しかしAWS APIでに対するneccessaryマッピングテンプレートまたはその他の追加 - >イベント<は - こうしてクイズその結果、空である:

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

これがヌルポインタです。 →イベント<が存在しないため、レコードが存在しません。

SOLUTION:

あなたはAWSのAPI内統合要求を設定する必要があります。 ボディマッピングテンプレートをクリックしてください。

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

そして編集ラムダ関数

置き換えるアプリケーション/ JSON へ その後 マッピングテンプレートを追加設定し、コンテンツの種類次に生成されたマッピングテンプレートを編集します。

for record in event['Records']:

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

は、スタックはこの答えをあなたにpingを実行するかどうか分からない - ので、私は自分自身でそれを考え出し説明については

を@franklinsijo Dawny33 @KevinOelen @あなたを呼び出します。ただし、「マッピングテンプレート」はhttps://medium.com/simple-thoughts-amplified/passing-variables-from-aws-api-gateway-to-lambda-3c5d8602081bから

関連する問題