【问题标题】:Multipart upload to S3 with hash verification使用哈希验证分段上传到 S3
【发布时间】:2017-05-05 00:49:29
【问题描述】:

我正在寻找一个命令行工具或 Python 库,它允许将大文件上传到 S3,并进行哈希验证。

有一个AWS article 解释如何通过提供content-md5 标头自动完成。

然而,尚不清楚哪些命令行工具可以这样做或不这样做:

  • rclone 的文档指出

    通过分段上传上传的文件没有 MD5SUM。

  • s3cmd 没有说明这一点,但它支持 md5 的同步功能

  • s4cmd在手册中有一个完整的段落,但是上传是否真的经过验证仍然不清楚

  • boto3 / s3transfer 的upload_file() 方法并没有真正说明什么

您是否有关于这些工具或其他一些工具或 Python 库或 boto3 sn-p 的信息,这些工具以 rsync 的可靠性处理大文件上传到 s3?

【问题讨论】:

    标签: amazon-s3 boto boto3 s3cmd


    【解决方案1】:

    询问了官方aws cli(boto3)工具的作者,我可以得出结论是aws clialways verifies every upload,包括多部分的。

    它使用官方 MD5 ETag 验证逐块进行单部分上传。此外,您还可以逐块启用 SHA256 验证。

    aws cli 不会验证整个组装文件。为此,您需要使用一些小的 Python 函数,例如:

    def calculate_s3_etag(file_path, chunk_size=8 * 1024 * 1024):
        md5s = []
    
        with open(file_path, 'rb') as fp:
            while True:
                data = fp.read(chunk_size)
                if not data:
                    break
                md5s.append(hashlib.md5(data))
    
        if len(md5s) == 1:
            return '"{}"'.format(md5s[0].hexdigest())
    
        digests = b''.join(m.digest() for m in md5s)
        digests_md5 = hashlib.md5(digests)
        return '"{}-{}"'.format(digests_md5.hexdigest(), len(md5s))
    

    【讨论】:

    • chunk_size 是多部分 s3 对象的属性吗?如何为已上传的 s3 对象获取上传 chunk_size
    【解决方案2】:

    您可以使用 TransferConfig 设置上传的块大小,然后使用 hyperknot 发布的方法自己重新创建 ETag

    from boto3.s3.transfer import TransferConfig
    transfer_config = TransferConfig(multipart_chunksize=8*1024*1024)
    

    将 transfer_config 传递给 upload_file 方法

    【讨论】:

      【解决方案3】:

      为什么不使用 aws cli?它支持 md5 验证,甚至支持分段上传。见this。 s3api 的 upload-partput-object 命令都支持使用哈希进行内容验证。

      并且 s4cmd 确实使用包含 md5 的自定义内容标头验证上传。

      关于S4cmd doc中提到的Etag计算,见this

      【讨论】:

      • 我正在寻找一个经过测试的内置函数,例如 aws s3 cpaws s3 sync,它负责验证,而不是编写自定义脚本来计算哈希值并使用 s3api。不过,使用相同的多部分 etag 计算方法进行验证是一个有趣的想法。
      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多