2017-01-22 67 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