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 控制台提供的事件: