我正在编写两个Python脚本,它将在Amazon S3中将文件从一个存储桶移动到另一个存储桶,然后验证已移动的密钥的内容。在将它们的boto的Key类倾倒之后,并研究了这个stackoverflow问题,我发现了在复制文件后如何通过“ etag”提取校验和。
但是,这仅在文件被下装/上载的情况下有效,因为验证将通过完全不同的脚本完成,因此我需要帮助,而无需实际下载文件即可从文件中获取etag。
当前,工作流程是:文件一个经过一个存储桶,并使用boto复制所有键,然后打印输出键的路径以及它们的etag。(buckets []是源和目标),可以正常工作:
inbuck = conn.get_bucket(buckets[0])
outbuck = conn.get_bucket(buckets[1])
for inkey in inbuck.list():
print buckets[1] + ";;" + inkey.key + ";;" + inkey.etag.replace("\"","")
out = Key(outbuck)
out.key = inkey.key
inkey.copy(outbuck,out.key,preserve_acl=True)
然后,文件2读取文件1的输出,检查密钥是否存在,然后应获取目标中密钥的etag以与输入的密钥进行比较。但是,该密钥的etag始终为“无”,因为未下载该密钥。
dstbuck = conn.get_bucket(destination[0])
dstkey = Key(dstbuck)
dstkey.key = destination[1]
if dstkey.exists() and dstkey.etag.replace("\"","") == destination[2]:
PASSED.append(dstkey.key)
else:
FAILED.append(dstkey.key)
由于dstkey.etag为“ None”,因此程序崩溃。有谁知道解决这个问题的方法吗?
问题在于您只是在创建本地Key对象。没有从S3检索到有关该密钥的信息。尝试这样的事情:
dstbuck = conn.get_bucket(destination[0])
dstkey = bucket.get_key(destination[1])
if dstkey is None:
FAILED.append(destination[1])
else:
# do etag check here
这样,Key对象应该具有来自S3的有关该对象的数据。该get_key
方法使用HTTP HEAD请求,因此将不检索对象的主体,而仅检索标头。
同样,如果对于程序的给定运行,存储桶名称(即destination [0])始终相同,则无需get_bucket
对存储桶中的每个关键对象都执行“ a ”操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句