AWS Lambda无法解析S3事件获取文件key值的技术求助
问题
在S3对象创建触发的AWS Lambda调用中,我获取到的event是dict类型对象,想要打印映射到"key"的文件名,但无法解析event获取该值。尝试使用event['Records']['object']['key']无效,转换JSON时出现索引错误。以下是日志输出和测试代码,请求指导正确的解析方法:
日志输出
2023-08-16T23:14:08.661+05:00 <class 'dict'> 2023-08-16T23:14:08.661+05:00 { 2023-08-16T23:14:08.661+05:00 "Records": [ 2023-08-16T23:14:08.661+05:00 { 2023-08-16T23:14:08.661+05:00 "eventVersion": "2.1", 2023-08-16T23:14:08.661+05:00 "eventSource": "aws:s3", 2023-08-16T23:14:08.661+05:00 "awsRegion": "us-east-1", 2023-08-16T23:14:08.661+05:00 "eventTime": "2023-08-16T18:14:07.433Z", 2023-08-16T23:14:08.661+05:00 "eventName": "ObjectCreated:Put", 2023-08-16T23:14:08.661+05:00 "userIdentity": { 2023-08-16T23:14:08.661+05:00 "principalId": "AWS:AIDAXVFYRQT5SCZ52T3IA" 2023-08-16T23:14:08.661+05:00 }, 2023-08-16T23:14:08.661+05:00 "requestParameters": { 2023-08-16T23:14:08.661+05:00 "sourceIPAddress": "58.65.198.81" 2023-08-16T23:14:08.661+05:00 }, 2023-08-16T23:14:08.661+05:00 "responseElements": { 2023-08-16T23:14:08.661+05:00 "x-amz-request-id": "K1F5VBSS8ZZFVXZZ", 2023-08-16T23:14:08.661+05:00 "x-amz-id-2": "UQ4qg1t7b0cQKHH3xmhykrqz2Khi0ilIkhV+4rl2zID5U640uw8QHtqGevN/E8FwvW/Mz82C3uILFYeDaJdma8u866k+eIXT" 2023-08-16T23:14:08.661+05:00 }, 2023-08-16T23:14:08.661+05:00 "s3": { 2023-08-16T23:14:08.661+05:00 "s3SchemaVersion": "1.0", 2023-08-16T23:14:08.661+05:00 "configurationId": "4c0adbad-3f5a-4bae-b5d4-0d10bce6c058", 2023-08-16T23:14:08.661+05:00 "bucket": { 2023-08-16T23:14:08.661+05:00 "name": "os-lab-demo", 2023-08-16T23:14:08.661+05:00 "ownerIdentity": { 2023-08-16T23:14:08.661+05:00 "principalId": "A1EIYWRSGRMZ3E" 2023-08-16T23:14:08.661+05:00 }, 2023-08-16T23:14:08.661+05:00 "arn": "arn:aws:s3:::os-lab-demo" 2023-08-16T23:14:08.661+05:00 }, 2023-08-16T23:14:08.661+05:00 "object": { 2023-08-16T23:14:08.661+05:00 "key": "ertugul.jpg", 2023-08-16T23:14:08.661+05:00 "size": 88458, 2023-08-16T23:14:08.661+05:00 "eTag": "92efc540bb3abee495c43e65a3f39697", 2023-08-16T23:14:08.661+05:00 "versionId": "r6hdxaF.0QmuOdPXnIiJt9HP0R3GLnr2", 2023-08-16T23:14:08.661+05:00 "sequencer": "0064DD11EF5F32C4EC" 2023-08-16T23:14:08.661+05:00 } 2023-08-16T23:14:08.661+05:00 } 2023-08-16T23:14:08.661+05:00 } 2023-08-16T23:14:08.661+05:00 ] 2023-08-16T23:14:08.661+05:00 }
测试代码
import boto3 import json client = boto3.client('s3') def lambda_handler(event, context): print (type(event)) print (json.dumps(event, indent= 4)) print (event['key'])
正确解析方法
你之前的解析路径存在两个错误:
Records是列表类型,不能直接通过字典键访问,必须先通过索引[0]获取列表中的第一条事件记录(单文件上传场景下通常只有一条记录)。- 对象的
key字段嵌套在s3节点下,并非直接在事件记录的根节点。
修正后的代码如下:
import boto3 import json client = boto3.client('s3') def lambda_handler(event, context): print(type(event)) print(json.dumps(event, indent=4)) # 正确解析文件名的路径 file_key = event['Records'][0]['s3']['object']['key'] print(f"文件名:{file_key}")
如果是批量操作触发的Lambda,可能存在多条事件记录,建议遍历Records列表处理所有文件:
import boto3 import json client = boto3.client('s3') def lambda_handler(event, context): print(type(event)) print(json.dumps(event, indent=4)) # 遍历所有事件记录 for record in event['Records']: file_key = record['s3']['object']['key'] print(f"文件名:{file_key}")
内容的提问来源于stack exchange,提问作者adnan
相关产品推荐
相关产品推荐

