【问题标题】:GSUtil rsync gives a 400 non-retryable exception on S3 bucketGSUtil rsync 在 S3 存储桶上给出 400 不可​​重试异常
【发布时间】: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

【问题讨论】:

    标签: amazon-s3 google-cloud-storage gsutil


    【解决方案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 选项吗?
    猜你喜欢
    • 2019-10-04
    • 2017-06-08
    • 2019-09-25
    • 2016-06-13
    • 2020-01-29
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多