KeyError: 'Records' while trying to read CSV file from S3 bucket - Lambda trigger
KeyError: 'Records' while trying to read CSV file from S3 bucket - Lambda trigger
我有以下 lambda 函数代码,用于简单地从 S3 存储桶中打印出 CSV 文件的列名。
import json
import boto3
import csv
s3_client = boto3.client('s3')
def lambda_handler(event, context):
# TODO implement
print(event)
bucket = event['Records'][0]['s3']['bucket']['name']
csv_file = event['Records'][0]['s3']['object']['key']
response = s3_client.get_object(Bucket=bucket, Key=csv_file)
lines = response['Body'].read().decode('utf-8').split()
results = []
for row in csv.DictReader(lines):
results.append(row.name())
print(results)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
但是,我在测试时遇到以下错误:
[ERROR] KeyError: 'Records'
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 10, in lambda_handler
bucket = event['Records'][0]['s3']['bucket']['name']
不确定我哪里错了!谁能告诉我如何解决这个问题?
手动更新“测试”事件后,出现此错误;
Test Event Name
TestEvent2
Response
{
"errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied",
"errorType": "ClientError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 13, in lambda_handler\n response = s3_client.get_object(Bucket=bucket, Key=csv_file)\n",
" File \"/var/runtime/botocore/client.py\", line 386, in _api_call\n return self._make_api_call(operation_name, kwargs)\n",
" File \"/var/runtime/botocore/client.py\", line 705, in _make_api_call\n raise error_class(parsed_response, operation_name)\n"
]
}
我可以完全访问我的 S3 存储桶。此外,在打印事件时它会显示正确的对象名称、s3 存储桶名称、记录 [] 等
错误发生是因为您在 AWS 控制台中使用 Test
。在那种情况下,提供了一些默认 event
。对于您的代码,您必须为您的用例提供有效的 S3 事件。 S3 事件结构已给出 here,因此您必须设置 Test
才能使用有效的 event
结构。
或者,您可以使用 AWS 控制台提供的事件:
我有以下 lambda 函数代码,用于简单地从 S3 存储桶中打印出 CSV 文件的列名。
import json
import boto3
import csv
s3_client = boto3.client('s3')
def lambda_handler(event, context):
# TODO implement
print(event)
bucket = event['Records'][0]['s3']['bucket']['name']
csv_file = event['Records'][0]['s3']['object']['key']
response = s3_client.get_object(Bucket=bucket, Key=csv_file)
lines = response['Body'].read().decode('utf-8').split()
results = []
for row in csv.DictReader(lines):
results.append(row.name())
print(results)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
但是,我在测试时遇到以下错误:
[ERROR] KeyError: 'Records'
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 10, in lambda_handler
bucket = event['Records'][0]['s3']['bucket']['name']
不确定我哪里错了!谁能告诉我如何解决这个问题?
手动更新“测试”事件后,出现此错误;
Test Event Name
TestEvent2
Response
{
"errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied",
"errorType": "ClientError",
"stackTrace": [
" File \"/var/task/lambda_function.py\", line 13, in lambda_handler\n response = s3_client.get_object(Bucket=bucket, Key=csv_file)\n",
" File \"/var/runtime/botocore/client.py\", line 386, in _api_call\n return self._make_api_call(operation_name, kwargs)\n",
" File \"/var/runtime/botocore/client.py\", line 705, in _make_api_call\n raise error_class(parsed_response, operation_name)\n"
]
}
我可以完全访问我的 S3 存储桶。此外,在打印事件时它会显示正确的对象名称、s3 存储桶名称、记录 [] 等
错误发生是因为您在 AWS 控制台中使用 Test
。在那种情况下,提供了一些默认 event
。对于您的代码,您必须为您的用例提供有效的 S3 事件。 S3 事件结构已给出 here,因此您必须设置 Test
才能使用有效的 event
结构。
或者,您可以使用 AWS 控制台提供的事件: