GSUtil rsync 在 S3 存储桶上给出 400 不可重试异常
Posted
技术标签:
【中文标题】GSUtil rsync 在 S3 存储桶上给出 400 不可重试异常【英文标题】:GSUtil rsync gives a 400 non-retryable exception on S3 bucket 【发布时间】:2015-04-19 09:58:44 【问题描述】:我正在使用 gsutil rsync,从 s3 复制到 gs,在 gsutil 通过存储桶中途后出现以下错误:
列出 s3://[bucket]/ 时捕获不可重试异常:BadRequestException: 400 None CommandException:捕获不可重试的异常 - 正在中止 rsync
这是不受欢迎的行为,因为我可以手动从 s3 复制到 gs 其他文件。我无法使用“-C”开关绕过,因为这不是复制错误。
编辑:如果“#”出现在 s3 的文件名中,gsutil 会将其替换为“?versionId=”。例如:
S3 文件名:Updaet#2_Montgomery Building Permits.xlsx
调试输出中的 GS 列表如下:Updaet?versionId=2_Montgomery Building Permits.xlsx
【问题讨论】:
【参考方案1】:您能否通过运行提供有关此故障的更多详细信息:
gsutil -D rsync your-source your-destination
然后摘录显示错误的 HTTP 请求/响应?当你这样做时,请编辑授权:标题。
如果您不想在公共论坛上发布请求的详细信息,可以通过 gs-team@google.com 将它们发送给我
谢谢。
【讨论】:
看起来好像是 gsutil 将“#”替换为“?versionId=”。您应该可以通过在 s3 中的文件名中添加“#”来复制,然后尝试同步它。 另外,-x "#" 似乎没有跳过文件,因为替换。【参考方案2】:昨天我也发生了同样的事情,'#'确实是问题所在。
问题似乎出在 boto,不一定是 gsutil,尽管我不知道修复的确切位置。 BotoTranslation._StorageUriForObject()
调用 boto.storage_uri()
,它使用 VERSION_RE ('(?P<versionless_uri_str>.+)#(?P<version_id>.+)$')
在 uri_str/path 中查找版本。如果对象名称包含“#”,那么它之后的所有内容都将被视为 S3 版本 ID。我没有看到目前有任何方法可以对“#”进行转义或编码,使其不会被视为版本分隔符。
【讨论】:
至少 gsutil 可以修改为跳过这些文件并同步其余文件的开关...?我可以不同步这些,但如果我愿意说我不需要以这种方式失败的同步,我不明白为什么整个同步会在这里失败。 你见过 gsutil rsync -x 选项吗?以上是关于GSUtil rsync 在 S3 存储桶上给出 400 不可重试异常的主要内容,如果未能解决你的问题,请参考以下文章
gsutil rsync Google Store 与 AWS S3 400 ExcessHeaderValues
如何使用 gsutil 通过 http 链接从谷歌云存储下载到 AWS 实例或 s3 存储桶?