You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:25:16