我正在尝试编写一个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']]
有人知道如何解决此问题吗?我已经浪费了很多时间试图解决这个问题,但我仍然无法:/
您的错误来自上述两行。
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