
在使用 AWS S3 存储时,上传大文件或遇到网络问题时,经常会遇到文件上传中断的情况。特别是当你使用 S3 的分块上传(Multipart Upload)时,未完全上传的文件块是否会留存,或者上传失败后如何清理这些未完成的上传,都是很多开发者关注的问题。本文将深入分析这个问题,探讨如何通过合适的配置避免存储空间的浪费,以及生命周期规则在解决这一问题中的作用。
1. AWS S3 分块上传的工作原理
在标准的 S3 上传过程中,大文件会被切分为多个小块(Part),每个块的大小通常可以自定义(AWS S3 默认最大 5GB/块),这些小块会并行上传。当所有的小块上传完毕,S3 会将它们组合成一个完整的对象。如果上传过程中某些块因为网络问题或其他原因没有完全上传,S3 会保留这些块直到上传操作被明确完成或取消。
- 正常上传过程:当所有块上传成功后,S3 会合并这些块,形成最终的对象,并最终确认上传操作的成功。
- 上传失败或中断:如果上传过程中断,S3 并不会立即删除上传的部分文件,而是保留上传过程中已上传的部分块,直到上传的操作超时或被主动终止。
2. 网络问题与上传中断后的存储行为
当你遇到网络问题导致上传中断时,S3 会暂时保留这些上传的部分文件。特别是在进行分块上传时,S3 会在后台保存每个上传成功的块,并等待其他部分上传完毕。上传过程中中断或失败时,这些已上传的部分文件块会存在于 S3 存储桶中。
此时,最关键的问题是:这些未完成的文件块是否会占用存储空间,且在上传失败后是否会被自动删除?
3. 生命周期规则的作用:Delete Expired Object Delete Markers 和 Incomplete Multipart Uploads
AWS S3 提供了一种生命周期管理机制,允许你根据对象的创建时间、修改时间等条件自动进行存储清理操作。对于上传过程中未完成的分块文件,生命周期规则的设置至关重要。你提到已经配置了一些生命周期规则,但不确定是否管用,特别是针对上传中断的文件块。
其中,最为关键的规则是:
- Delete expired object delete markers:此规则处理在 S3 中启用版本控制时,删除过期的删除标记对象。这与上传中断的文件块无关,但对于存储桶中的冗余删除标记(例如,删除对象时生成的标记)很有用。
- Incomplete multipart upload cleanup:这是处理分块上传未完成时非常重要的规则。该规则会删除那些在一定时间内未完成上传的分块文件。在上传中断后,未完成的上传会被标记为“未完成的分块上传”,这些分块会在设定的时间内自动清除。
设置示例:
假设你希望在上传失败或中断后,确保 7 天内未完成的分块上传自动删除。你可以配置一个生命周期规则,确保 S3 清理未完成的分块上传。
{
"Rules": [
{
"ID": "CleanUpIncompleteUploads",
"Status": "Enabled",
"Filter": {
"Prefix": ""
},
"MultipartUpload": {
"AbortIncompleteMultipartUpload": {
"DaysAfterInitiation": 7
}
}
}
]
}
在上述配置中,`AbortIncompleteMultipartUpload` 规则指定了如果上传未完成,且上传过程已开始超过 7 天,则自动清理这些未完成的分块。该规则的作用非常关键,因为它能确保即便你未能手动取消上传,AWS S3 也会清理这些占用空间的“残留”块。
4. 如何验证上传是否已完全清理?
一旦你配置了生命周期规则,AWS S3 将自动处理上传失败时未完成的分块上传,但你也可以通过以下方法验证这些操作是否生效:
查看未完成的上传:你可以使用 AWS CLI 或 S3 控制台查看当前是否存在未完成的分块上传。
aws s3api list-multipart-uploads --bucket your-bucket-name
该命令会列出所有当前正在进行的 multipart 上传。如果返回了上传标记(uploads),则表示仍有未完成的上传操作。
- 查看存储桶的存储使用情况:如果你发现 S3 存储桶的存储空间没有减少,那么可能是因为有未完成的上传未被及时清理。
5. 上传失败后的补救措施
如果你发现上传失败的文件依然占用存储空间,你可以执行以下补救措施:
手动中止未完成的分块上传:在某些情况下,上传过程的中断可能会导致 S3 没有及时识别上传失败。你可以通过以下命令手动中止未完成的分块上传。
aws s3api abort-multipart-upload --bucket your-bucket-name --key your-file-key --upload-id your-upload-id
这将结束指定上传的所有相关操作,并释放占用的存储空间。
清理旧的上传文件:如果你忘记配置生命周期规则,或者规则未生效,可以通过定期检查和手动清理未完成的上传,来避免不必要的存储费用。
为避免未来出现类似的上传中断问题,以下是一些最佳实践:
- 使用分块上传(Multipart Upload):对于大文件,分块上传是避免上传中断时数据丢失的有效方式。分块上传能够确保即使某个文件块上传失败,也可以仅重试失败的部分,而非重新上传整个文件。
- 启用生命周期规则:确保你为存储桶配置了合适的生命周期规则,特别是设置“Abort incomplete multipart uploads”来自动清理未完成的上传。
- 监控上传状态:使用 AWS CloudWatch 和 AWS Lambda 可以对未完成的上传进行监控,并在一定时间内自动执行清理操作。
- 优化网络与重试机制:为减少上传中断的概率,可以采用更稳定的网络连接,并在上传过程中加入合理的重试机制。
在 AWS S3 中,未完全上传的文件在上传失败或中断时确实会占用存储空间。通过设置合适的生命周期规则,特别是 `AbortIncompleteMultipartUpload`,你可以确保这些未完成的分块上传在一段时间后被自动清理,从而释放存储空间。合理使用这些生命周期规则,结合手动检查和监控手段,将大大减少存储空间浪费,并确保你的 S3 存储桶始终保持干净和高效。











