AWS Glacier分段上传未超分片限制却触发InvalidParameterValueException
AWS Glacier分片上传报错:分片编号超过10000限制的解决办法
问题根源
你遇到的错误完全是因为手动指定的--range参数计算错误。AWS Glacier不是按你上传的顺序分配分片编号,而是通过你提供的range起始字节自动计算:
分片编号 = 起始字节 ÷ 1MB(1048576字节)
你上传第16个文件时用的range起始值是17592186044416,计算后得到的分片编号是16777216,远远超过了Glacier允许的10000分片上限,因此触发报错。
再看你之前上传的15个分片,每个分片的range都不连续(比如第一个分片结束于1048575999,第二个却从1073741824开始,中间空了25MB),这说明你手动计算range时完全没遵循分片的连续字节规则,导致每个分片的编号都异常偏大。
解决步骤
1. 终止当前错误的上传任务
先取消这次错误的上传任务,避免占用资源:
aws glacier abort-multipart-upload --account-id - --vault-name XXXXXXX --upload-id XXXXXXXXXX
2. 重新初始化分片上传
初始化时必须指定和你拆分文件一致的分片大小(1024000KB = 1048576000字节),同时要算好总归档大小(52个1024000KB + 1个148342KB的字节总和):
# 总大小计算:52*1024000*1024 + 148342*1024 = 550057115648 字节,可根据实际文件调整 aws glacier initiate-multipart-upload --account-id - --vault-name XXXXXXX --archive-description "ProjectRefDoc_230513.7z" --part-size 1048576000
执行后会得到一个新的upload-id,保存好用于后续上传。
3. 用脚本批量上传所有分片
绝对不要手动写range,用PowerShell循环自动计算每个分片的正确range:
$uploadId = "你的新upload-id" $vaultName = "XXXXXXX" $partSize = 1048576000 # 和初始化时的part-size一致 # 获取所有拆分文件并按名称排序 $files = Get-ChildItem Y:\ProjectRefDoc_230513.7z.* | Sort-Object Name $index = 0 foreach ($file in $files) { $startByte = $index * $partSize $endByte = $startByte + (Get-Item $file).Length - 1 $range = "bytes $startByte-$endByte/*" # 执行上传 aws glacier upload-multipart-part --body $file.FullName --range $range --account-id - --vault-name $vaultName --upload-id $uploadId $index++ }
4. 完成归档上传
所有分片传完后,先计算整个归档的SHA256树哈希(可以用aws glacier compute-checksums --body Y:\ProjectRefDoc_230513.7z命令,如果你合并了原始文件的话;或者用脚本遍历所有分片计算),然后执行完成命令:
aws glacier complete-multipart-upload --account-id - --vault-name XXXXXXX --upload-id $uploadId --archive-size 550057115648 --checksum "计算出的SHA256树哈希"
重要提醒
- 别再手动计算range,极易出错,优先用脚本或者直接使用
aws s3 cp --storage-class GLACIER命令,它会自动处理Glacier的分片上传,无需手动操作分片。 - 初始化上传时的
--part-size必须和拆分文件的大小一致,否则后续上传会出现分片编号不匹配的问题。
内容的提问来源于stack exchange,提问作者Min Yi Mak
相关产品推荐
相关产品推荐

