不同用户S3图片上传后出现串档问题的技术排查求助
各位技术同行们,我最近碰到了一个完全颠覆常规认知的诡异问题,折腾了好久都找不到头绪,想请教下有没有人遇到过类似情况,或者能给点排查思路!
先给大家梳理下整个流程和背景:
我们的网站前端JS会处理图片上传,流程是先生成基于图片文件名的S3预签名URL,不同用户的S3存储Key是完全唯一的,比如:
- 用户1对应的S3 Key:
uploads/02512088.png - 用户2对应的S3 Key:
uploads/evil-art-1.15.png
前端上传的核心代码是这样的:
const uploadResponse = await fetch(body.signedUrl, { method: 'PUT', headers: { 'Content-Type': current_image_file.type }, body: current_image_file });
重点是,这两个用户是完全独立的——用的不同电脑、不同浏览器标签页,各自的JS运行环境完全隔离。按照我对代码执行、计算机系统的理解,根本不可能出现用户1的图片“串”到用户2的浏览器里,再通过用户2的电脑上传到他专属的S3 Key这种情况啊!
但诡异的事情发生了:到了后续业务流程,当我们需要从用户2的S3 Key下载图片时,居然下载到了用户1的图片!
给大家看一下Lambda函数里的下载日志:
2025-06-23T22:39:56.840Z 2f0282b8-31e8-44f1-be4d-57216c059ca8 INFO Downloading image from S3 bucket: mybucket123 with key: uploads/evil-art-1.14.png
2025-06-23T22:39:56.936Z 2f0282b8-31e8-44f1-be4d-57216c059ca8 INFO Image downloaded successfully!
2025-06-23T22:39:56.937Z 2f0282b8-31e8-44f1-be4d-57216c059ca8 INFO ORIGINAL IMAGE SIZE: 267 66
我们已经确认下错了文件:这个下载到的图片尺寸和用户1的图片完全匹配,和用户2自己上传的图片尺寸完全不符;而且后续用户2的业务流程最终输出的也是用户1的图片,实锤串档了。
更离谱的是,下载操作是在Lambda函数里执行的——每个用户的请求对应独立的Lambda执行环境,代码里明确指定了用户2的S3 Key,怎么会下载到用户1的图片?
从代码逻辑、系统隔离性、执行环境的设计来看,这事儿从技术上应该“完全不可能发生”,但它确实实实在在出现了。有没有人碰到过类似的S3串档问题?或者有什么我没考虑到的排查方向?
内容来源于stack exchange

