AWS Lambda python函数从S3解析json并存储在DynamoDB中

问题描述 投票:1回答:1

我正在尝试编写一个lambda函数,该函数会在将json文件上传到s3存储桶时触发。该功能应该解析文件并将其立即存储在DynamoDB中。我创建了一个名为“数据”的表,并将主键设置为“日期”。到目前为止,这是我需要的功能:

import boto3
import json
s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context): 
   bucket = event['Records'][0]['s3']['bucket']['name']
   json_file_name = event['Records'][0]['s3']['object']['key']
   json_object = s3.Bucket(bucket).Object(json_file_name)
   jsonFileReader = json_object['Body'].read()
   jsonDict = json.loads(jsonFileReader)
   table = dynamodb.Table('data')
   table.put_item(Item = jsonDict)

这是我尝试使用的json文件的示例:

{
 "date": "2020-06-07 21:00:34.284421",
 "ConfirmedCases": 7062067,
 "ActiveCases": 3206573,
 "RecoveredCases": 3450965,
 "Deaths": 404529
}

不幸的是,每当我测试代码时,它都会引发此错误:

[[ERROR] TypeError: string indices must be integers
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 7, in lambda_handler
    bucket = event'Records'][0]['s3']['bucket']['name']]

有人知道如何解决此问题吗?我已经浪费了很多时间试图解决这个问题,但我仍然无法:/

python amazon-web-services aws-lambda amazon-dynamodb
1个回答
1
投票

您的错误来自上述两行。

bucket = event['Records'][0]['s3']['bucket']['name']
json_file_name = event['Records'][0]['s3']['object']['key']

但是,它们是正确。这是S3通知生成的事件中的访问桶名称和对象密钥的有效访问方式

在我看来,还有其他事情触发了您的功能。您要么在控制台中使用Test选项并提供了不正确的event对象,要么存在其他一些事件触发非S3事件的lambda。

作为快速解决方案,您可以执行以下操作。如果event对象不包含Records,则下面的代码将完成:

def lambda_handler(event, context): 

    if 'Records' not in event:
        print(event) # good to check what event you get  
        return

    # and the rest of code  

© www.soinside.com 2019 - 2024. All rights reserved.