寻求AWS临时文件存储方案:实现类WeTransfer的10小时自动过期功能
AWS 10小时临时文件存储解决方案
针对你需要的「用户上传文件、10小时后自动删除、支持预链接下载」的需求,以下是几个可行的AWS原生方案,避开S3生命周期规则仅支持天级过期的限制:
方案1:S3 + Lambda + EventBridge(推荐,精确到分钟)
这是最贴合需求的托管式方案,无需维护服务器:
- 上传流程:
- 用户上传文件到S3桶,触发S3上传事件,调用第一个Lambda函数。
- Lambda计算文件的过期时间(当前时间+10小时),给S3对象添加自定义元数据(比如
x-amz-meta-expire-time)记录该时间。 - 用EventBridge创建一次性定时规则,设置在过期时间触发,目标为负责删除文件的第二个Lambda,规则中传递S3对象的桶名和键作为参数。
- 删除流程:
定时规则触发后,删除Lambda根据参数定位S3对象并删除,同时可清理对应的EventBridge规则避免冗余。 - 下载实现:
生成S3预签名URL时,设置ExpiresIn为文件剩余的有效秒数(比如10小时减去已过去的时间),确保链接在文件过期时同步失效。 - 优势:完全托管,时间精度高(支持分钟级),和S3原生集成;无需担心服务器维护。
- 注意事项:
- 配置Lambda权限:允许读取S3元数据、创建EventBridge规则、删除S3对象。
- 注意EventBridge的规则配额,一般场景下足够覆盖需求。
方案2:S3 + DynamoDB TTL + 定时Lambda扫描
适合文件数量极大的场景,批量处理过期文件:
- 上传流程:
- 文件上传到S3后,将对象键、桶名、过期时间(当前时间+10小时)存入DynamoDB表,把过期时间设为DynamoDB的TTL字段(自动删除过期条目)。
- 可选:给S3对象添加元数据关联DynamoDB条目ID。
- 删除流程:
用EventBridge每小时触发一次Lambda,扫描DynamoDB中已过期的条目(或直接查询TTL已过期的记录),批量删除对应的S3对象。 - 下载实现:
生成预签名URL前,先查询DynamoDB确认文件未过期,再生成对应有效期的链接。 - 优势:无需为每个文件创建单独的EventBridge规则,批量处理成本更低;DynamoDB自动清理过期记录,减少维护。
- 注意事项:
- 给DynamoDB表创建GSI按过期时间排序,避免全表扫描影响性能。
- 批量删除S3文件时,处理好报错重试逻辑。
方案3:EFS + 定时清理脚本(适合需文件系统语义的场景)
如果你需要文件系统级的读写操作,可以用EFS:
- 上传流程:
将EFS挂载到EC2实例或支持EFS的Lambda,用户上传文件到指定目录,可在文件名中嵌入过期时间戳,或用数据库记录文件路径和过期时间。 - 删除流程:
在EC2上配置Cron任务,或用EventBridge触发Lambda,定期扫描目录,删除创建时间超过10小时的文件。 - 下载实现:
通过API网关+Lambda提供下载接口,验证文件未过期后返回文件内容,或生成临时访问链接。 - 优势:支持文件系统语义,适合需要直接操作文件的场景。
- 注意事项:
- 需要维护EC2实例(或配置Lambda的EFS访问权限),运维成本略高。
- EFS的存储和IO成本比S3高,需评估预算。
通用优化建议
- 预签名URL生成时,严格限制有效期不超过文件剩余的10小时窗口,避免过期后链接仍可访问。
- 上传时可对文件大小、类型做校验,避免恶意上传大文件占用存储。
- 记录上传和下载日志,方便排查问题。
内容的提问来源于stack exchange,提问作者ElMoto
相关产品推荐
相关产品推荐

