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