2017-01-22 66 views
0

我有以下lambda函數的代碼只需打印出的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']) 

然而,我在測試時出現以下錯誤:

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

這是一個測試事件還是實際事件?你能打印'event'並檢查它是否包含'Records'? – franklinsijo

回答

3

有點遲到派對。但這是我的第一篇文章!

說明:

當在拉姆達面板測試 - > DEF lambda_handler(事件,上下文)< - 事件被直接噴射。

然而,在AWS API其neccessary到添加映射模板或以其它方式 - >事件< - 是空的,因此導致quizzing:

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

這是空指針。記錄不存在,因爲 - >事件< - 不存在。

SOLUTION:

您需要配置合併請求 AWS API裏面。 點擊Body Mapping Templates。 然後ADD映射模板 集內容類型應用/ JSON 然後編輯生成的映射模板:

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

而且編輯lambda函數

取代:

for record in event['Records']:

有:

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

不知道堆棧是否將平你這個答案 - 所以我打電話給你@ Dawny33 @KevinOelen @franklinsijo

至於解釋,我想它在我自己。然而,「映射模板」來自https://medium.com/simple-thoughts-amplified/passing-variables-from-aws-api-gateway-to-lambda-3c5d8602081b