我正在编写两个 python 脚本,它们将在 Amazon S3 中将文件从一个存储桶移动到另一个存储桶,然后验证已移动的密钥的内容。在倾注了他们的关键类 boto 并查看了这个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)
文件二然后从文件一中读取输出,检查密钥是否存在,然后应该在目标中获取密钥的 etag 以与作为输入的内容进行比较。但是,密钥的 etag 始终为 None,因为它没有被下载。
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 为“无”,因此程序在此处崩溃。有谁知道解决这个问题的方法?