问题描述
在使用 AWS S3 存储桶时,遇到一个问题:存储桶显示总大小为 30 TB,但当尝试获取各个文件夹的总大小时,发现总大小不超过 2 TB。用户尝试了以下命令:
aws s3 ls --summarize --human-readable --recursive s3://BUCKETNAME
并且在 AWS 控制台中使用了计算总大小的选项。用户猜测这可能与版本相关的文件大小和对象数量有关。用户希望能找到一种查询或命令,以便获取正确的文件大小,特别是那些占用大空间的对象和版本。
解决方案
请注意以下操作可能存在版本差异及风险,务必做好备份。
方案1 – 检查未完成的分块上传
一个可能的原因是存储桶中存在未完成的分块上传,这些未完成的分块上传在 AWS 控制台中不会显示出来。这可能导致计算总大小时出现偏差。以下是如何检查并清理未完成的分块上传的步骤:
- 登录 AWS 控制台并进入 S3 管理界面。
- 选择您要检查的存储桶(BUCKETNAME)。
- 在左侧导航栏中,选择 “管理”。
- 在 “跟踪” 下,选择 “未完成的 multipart 上载”。
- 查看是否存在未完成的 multipart 上载任务。
- 如果存在未完成的任务,您可以根据需要进行清理或终止。请谨慎操作,确保不影响正在进行的合法任务。
您可以参考 这篇指南 来了解如何检查和清理未完成的分块上传,以降低存储成本。
如果您没有设置生命周期策略来终止未完成的分块上传,请考虑设置一个生命周期策略以自动终止这些未完成的上传任务。
方案2 – 使用其他工具来获取文件大小
如果您需要更精确地获取各个文件的大小,可以考虑使用一些第三方工具。AWS S3 本身提供了一些限制,导致在某些情况下无法准确计算单个文件的大小,特别是涉及多个版本的情况。以下是一个示例脚本,使用 AWS CLI 和 jq(一个 JSON 解析工具)来获取指定存储桶中所有文件的大小:
#!/bin/bash
# 获取指定存储桶中所有对象的大小
BUCKET_NAME="your-bucket-name"
TOTAL_SIZE=0
# 使用 AWS CLI 列出存储桶中的所有对象
aws s3api list-objects --bucket $BUCKET_NAME --output json | jq -r '.Contents[] | .Key' | while read object_key; do
# 使用 AWS CLI 获取对象的元数据(包括大小)
object_metadata=$(aws s3api head-object --bucket $BUCKET_NAME --key "$object_key")
object_size=$(echo $object_metadata | jq -r '.ContentLength')
# 累加对象的大小到总大小
TOTAL_SIZE=$((TOTAL_SIZE + object_size))
done
# 打印总大小
echo "Total size of all objects in $BUCKET_NAME: $TOTAL_SIZE bytes"
在上面的示例中,我们使用了 aws s3api list-objects
命令来列出存储桶中的所有对象,并使用 jq
解析 JSON 格式的输出。然后,我们针对每个对象使用 aws s3api head-object
命令来获取对象的元数据,包括大小。最终,我们累加所有对象的大小,得到存储桶中所有对象的总大小。
请注意,此脚本可能需要 jq 工具的支持,您可以使用适当的方式安装 jq。同时,脚本中的 “your-bucket-name” 部分需要替换为您实际的存储桶名称。
总结
通过检查未完成的分块上传和使用其他工具来获取文件大小,您可以更准确地了解存储桶中对象的总大小以及占用大空间的对象和版本。请根据您的实际情况选择适合您的方法,以满足对存储桶内容大小的需求。
注:以上方案是基于2021年的AWS服务和AWS CLI版本。如果有新版本发布或相关策略变更,请参考官方文档或相关资源以获取最新信息。