AWS Lambda通过boto3读取S3文件时出现NoSuchKey错误求助
解决S3触发Lambda时的NoSuchKey错误
问题核心
你遇到的NoSuchKey错误,本质是S3事件传递的对象键(key)是URL编码后的格式。比如文件名含空格、中文或特殊字符时,会被转成%20这类编码值——你打印的是编码后的键,但直接用它调用get_object,S3找不到对应实际对象。
修复方案
1. 启用URL解码
取消代码中from urllib.parse import unquote_plus的注释,对获取到的filename做解码处理:
filename = unquote_plus(file_obj['s3']['object']['key'])
这一步会把编码后的键转成实际文件名(比如agent%20copy.json转成agent copy.json)。
2. 额外检查项
- 权限验证:确认Lambda执行角色拥有
s3:GetObject权限,且策略中资源路径正确(例如允许访问目标桶所有对象:arn:aws:s3:::your-bucket-name/*)。 - 大小写匹配:S3对象键区分大小写,解码后打印文件名,确认和桶内实际文件名完全一致。
修复后完整代码
import boto3 import json from urllib.parse import unquote_plus import time import csv from pprint import pprint s3 = boto3.client('s3') kinesis = boto3.client('kinesis') def lambda_handler(event, context): if event: file_obj = event["Records"][0] bucketname = file_obj['s3']['bucket']['name'] filename = unquote_plus(file_obj['s3']['object']['key']) print('bucket name is ' + str(bucketname) + ' file name is ' + str(filename)) fileObj = s3.get_object(Bucket=bucketname, Key=filename) file_content = fileObj["Body"].read().decode('utf-8') kinesis.put_record(Data=bytes(file_content, 'utf-8'), StreamName='LambdaSourceKinesisStream',PartitionKey='basam') return "thanks"
补充说明
S3触发Lambda时,对象键默认URL编码是AWS标准行为,用于兼容特殊字符场景。如果你的文件名无特殊字符,也可能是权限配置问题,但从“能打印文件名却找不到对象”的表现来看,编码问题是最常见诱因。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

