【问题标题】:Retrieving Etag of an s3 object using boto3 client使用 boto3 客户端检索 s3 对象的 Etag
【发布时间】:2018-09-19 09:21:17
【问题描述】:

有一种情况,我需要验证存储在 s3 存储桶中的文件的校验和(md5)。这可以在上传文件时通过在 api 调用的元数据中指定校验和值来实现。但就我而言,我想在以编程方式将数据放入存储桶后验证校验和。 S3 中的每个对象都将具有名为“ETag”的属性,这是 S3 计算的 md5 校验和。

有没有办法在 python 脚本中使用 boto3 客户端获取特定对象的 ETag 并比较存储在 s3 中的本地文件和文件的校验和?

【问题讨论】:

    标签: amazon-s3 checksum


    【解决方案1】:

    Boto3 api 提供了一种方法来获取存储在 s3 中的对象的元数据。以下 sn-p 将有助于通过编程方式获取元数据:

    >>> s3_cli = boto3.client('s3')
    >>> s3_resp = s3_cli.head_object(Bucket='ventests3', Key='config/ctl.json')
    >>> print pprint.pprint(s3_resp)
    >>> pp.pprint(s3_resp)
    {u'AcceptRanges': 'bytes',
     u'ContentLength': 4325,
     u'ContentType': 'binary/octet-stream',
     u'ETag': '"040c003386f1e2001816d32f2125d07a"',
     u'LastModified': datetime.datetime(2018, 9, 20, 7, 15, 3, tzinfo=tzutc()),
     u'Metadata': {},
     'ResponseMetadata': {'HTTPHeaders': {'accept-ranges': 'bytes',
                                          'content-length': '4325',
                                          'content-type': 'binary/octet-stream',
                                          'date': 'Thu, 20 Sep 2018 07:20:53 GMT',
                                          'etag': '"040c003386f1e2001816d32f2125d07a"',
                                          'last-modified': 'Thu, 20 Sep 2018 07:15:03 GMT',
                                          'server': 'AmazonS3',
                                          'x-amz-id-2': 'P2wapOciWCKPfol2sBgoo11tRdr4KwKcDJ/nHW7LZn00mvKfMYyfAPPV2tIcf3Vu+lrV57NBARY=',
                                          'x-amz-request-id': '42AF970E7C9AA18C'},
                          'HTTPStatusCode': 200,
                          'HostId': 'P2wapOciWCKPfol2sBgoo11tRdr4KwKcDJ/nHW7LZn00mvKfMYyfAPPV2tIcf3Vu+lrV57NBARY=',
                          'RequestId': '42AF970E7C9AA18C',
                          'RetryAttempts': 0}}
    
    >>> s3obj_etag = s3_resp['ETag'].strip('"')
    >>> print s3obj_etag
    '040c003386f1e2001816d32f2125d07a'
    

    s3 客户端对象中的 head_object() 方法将获取存储在 s3 存储桶中的给定对象的元数据(标头)。

    【讨论】:

      【解决方案2】:

      不要使用存储桶中的对象的 ETag 来确定另一个存储桶中的对象的对象等效性(具有相同的键)。在一些实验中,我发现对于大型对象,ETag 在不同区域之间不一致。例如,us-east-1 中存储桶中的大文件在复制到 us-east-2 时可能具有不同的 ETag。不同桶的 ETag 值的一致性因对象而异。我看到一些大型对象在两个区域中确实具有相同的 ETag。我求助于创建自己的带有 md5sum 的标签,当我将一个对象从一个存储桶复制到另一个存储桶时,我也复制了标签。

      【讨论】:

      • 谢谢@Peter Van Sickel。我可以用它来确定同一个桶内的对象等价性吗?
      • 这不完全是桶到桶的问题,相反,如果对象是使用分段上传创建的(=上传大文件的线程),则 ETag 计算为每个部分的 MD5 的 MD5。所以你必须知道进入分段上传的块或从块大小重新派生它们(呃)
      • 好吧,如果至少有一个桶使用加密,那么桶到桶的问题也会出现,有关更多详细信息,请参阅此问题:stackoverflow.com/questions/67171693/…。 ETag 问题在此功能请求中得到了很好的总结:github.com/aws/aws-sdk/issues/89
      【解决方案3】:

      实际上,上面的代码会像缺少参数一样产生错误。

      这对我有用

      s3.meta.client.head_bucket(Bucket='mybucket')
      

      【讨论】:

        猜你喜欢
        • 2016-09-05
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-05
        相关资源
        最近更新 更多