AWS CLI上传文件至Cloudian S3后显示0字节问题求助
0字节上传问题排查与修复方案
按优先级从高到低排查以下问题:
- 首先修正命令写法错误:你贴出的执行命令里
--body参数和实际文件路径/tmp/test.zip被拆成了两行,如果实际执行时也是这种断行写法,AWS CLI会将--body后的空值作为请求体上传,后续的文件路径会被识别为无效参数直接忽略,这是该问题最高发的诱因。同时注意对象键不要带前导/,Cloudian对带前导斜杠的键值存在元数据解析兼容问题,修正后的命令参考:
./aws s3api put-object --bucket customer-backup-test --key "database/export/test.zip" --body /tmp/test.zip --endpoint-url=https://test.prod.com --ca-bundle ~/cert/ca.crt
- 校验本地文件读取权限:先执行
ls -l /tmp/test.zip确认运行AWS CLI的用户对目标zip文件有读权限,若文件被其他进程加独占锁、当前用户无读权限,部分旧版本AWS CLI不会抛出文件读取错误,会直接发送空请求体生成0字节对象。可以先传一个普通文本文件做基线测试:
echo "test123" > /tmp/verify.txt ./aws s3api put-object --bucket customer-backup-test --key "verify.txt" --body /tmp/verify.txt --endpoint-url=https://test.prod.com --ca-bundle ~/cert/ca.crt
如果文本文件上传后大小正常,说明链路和权限配置无问题,重点排查zip文件本身的读取状态即可。
- 处理Cloudian的API兼容bug:Cloudian 7.2.x之前的版本对AWS CLI v2默认开启的分块传输编码支持存在缺陷,会出现只写入对象元数据、不存储实际内容的情况。可以在上传时强制指定
Content-Length头关闭分块传输,命令如下:
# 读取本地文件实际字节数 file_size=$(stat -c%s "/tmp/test.zip") ./aws s3api put-object --bucket customer-backup-test --key "database/export/test.zip" --body /tmp/test.zip --content-length $file_size --endpoint-url=https://test.prod.com --ca-bundle ~/cert/ca.crt
如果上述命令仍不生效,可以换用s3 cp子命令替代s3api put-object,s3 cp的传输逻辑对S3兼容存储的适配性更好:
./aws s3 cp /tmp/test.zip s3://customer-backup-test/database/export/test.zip --endpoint-url=https://test.prod.com --ca-bundle ~/cert/ca.crt
- 链路与存储端排查:如果以上操作都无效,执行上传命令时追加
--debug参数查看请求日志,确认日志中记录的请求体Content-Length值和本地文件大小是否一致:- 如果日志里显示发送的请求体长度为0,说明本地CLI读取文件环节存在异常,可尝试升级/重装AWS CLI后重试
- 如果日志里发送的请求体长度和本地文件一致,但存储端对象仍为0字节,说明是Cloudian端写入异常,需要联系存储管理员检查节点写入日志,确认是否是存储桶WORM策略、大小阈值拦截、节点磁盘故障等问题导致内容未持久化,仅创建了空对象元数据。
内容的提问来源于stack exchange,提问作者explorer
相关产品推荐
相关产品推荐

