使用 boto3 客户端检索 s3 对象的 Etag
Retrieving Etag of an s3 object using boto3 client
在某些情况下,我需要验证存储在 s3 存储桶中的文件的校验和 (md5)。这可以在上传文件时通过在 api 调用的元数据中指定校验和值来实现。但就我而言,我想在以编程方式将数据放入存储桶后验证校验和。 S3 中的每个对象都将具有名为 'ETag' 的属性,这是 S3 计算的 md5 校验和。
是否可以在 python 脚本中使用 boto3 客户端获取特定对象的 ETag 并比较本地文件和存储在 s3 中的文件的校验和?
Boto3 api 提供了一种获取存储在 s3 中的 object 元数据的方法。以下代码段将有助于以编程方式获取元数据:
>>> 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() 方法 object 将获取给定 [=20= 的元数据 (headers) ] 存储在 s3 存储桶中。
不要使用存储桶中对象的 ETag 来确定另一个存储桶中对象(具有相同键)的对象等效性。在一些实验中,我发现对于大型物体,ETag 在不同区域之间并不一致。例如,us-east-1 中的存储桶中的大文件复制到 us-east-2 时可能具有不同的 ETag。桶与桶之间 ETag 值的一致性因对象而异。我看到一些大物体在两个区域中确实具有相同的 ETag。我求助于创建自己的带有 md5sum 的标签,当我将一个对象从一个存储桶复制到另一个存储桶时,我也复制了标签。
实际上,上面的代码会像缺少参数一样产生错误。
这对我有用
s3.meta.client.head_bucket(Bucket='mybucket')
在某些情况下,我需要验证存储在 s3 存储桶中的文件的校验和 (md5)。这可以在上传文件时通过在 api 调用的元数据中指定校验和值来实现。但就我而言,我想在以编程方式将数据放入存储桶后验证校验和。 S3 中的每个对象都将具有名为 'ETag' 的属性,这是 S3 计算的 md5 校验和。
是否可以在 python 脚本中使用 boto3 客户端获取特定对象的 ETag 并比较本地文件和存储在 s3 中的文件的校验和?
Boto3 api 提供了一种获取存储在 s3 中的 object 元数据的方法。以下代码段将有助于以编程方式获取元数据:
>>> 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() 方法 object 将获取给定 [=20= 的元数据 (headers) ] 存储在 s3 存储桶中。
不要使用存储桶中对象的 ETag 来确定另一个存储桶中对象(具有相同键)的对象等效性。在一些实验中,我发现对于大型物体,ETag 在不同区域之间并不一致。例如,us-east-1 中的存储桶中的大文件复制到 us-east-2 时可能具有不同的 ETag。桶与桶之间 ETag 值的一致性因对象而异。我看到一些大物体在两个区域中确实具有相同的 ETag。我求助于创建自己的带有 md5sum 的标签,当我将一个对象从一个存储桶复制到另一个存储桶时,我也复制了标签。
实际上,上面的代码会像缺少参数一样产生错误。
这对我有用
s3.meta.client.head_bucket(Bucket='mybucket')