AWS Lambda调用S3 getObject报No such key问题排查求助
检查事件payload的对象键编码问题
从Lambda日志里扒出事件里的s3.object.key值——这个值是URL编码后的,比如空格会变成%20,特殊字符也会被转码。如果直接把编码后的字符串传给getObject,肯定找不到对象。解决办法是解码:Python用urllib.parse.unquote(key),Node.js用decodeURIComponent(key),其他语言找对应的URL解码方法。核对对象键的大小写
S3的对象键是大小写敏感的,比如事件里给的是Video-File.mp4,但实际S3里是video-file.mp4,就会报找不到。直接去S3控制台找到目标对象,复制它的完整键,和你代码里用的对比,确保完全一致。检查路径的开头斜杠
S3对象的键是没有开头斜杠的,比如正确的键是prefix/parent-folder/sub-folders/video-File.mp4,如果你的代码里误加了开头的/,传给getObject就会出错。确认你用的键没有多余的开头斜杠。用控制台生成的命令测试
去S3控制台找到那个对象,点「操作」→「下载」→「复制CLI命令」,把这个aws s3api get-object命令拿到本地或Lambda测试环境跑。如果能成功下载,对比命令里的--key值和你代码里的键,找差异点。确认Lambda和S3的区域匹配
确保Lambda函数部署的区域和S3桶的区域一致。跨区域调用偶尔会有延迟或解析问题,导致找不到对象,尽量让两者在同一个区域。加个重试逻辑排除写入延迟
有时候S3的对象创建事件触发时,对象还没完全写入S3。可以在Lambda代码里加个简单的重试:比如调用getObject失败后,间隔1秒再试1-2次,排除这种临时问题。
内容的提问来源于stack exchange,提问作者1raf

