如何使用boto获取亚马逊上的密钥/文件的校验和?

时间:2013-08-05 12:24:54

标签: python amazon-web-services amazon-s3 checksum boto

我正在编写两个python脚本,它们将在Amazon S3中将文件从一个存储桶移动到另一个存储桶,然后验证已移动的密钥的内容。在倾倒了他们的键类boto,并查看了this 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始终为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为“None”,程序崩溃。 有人知道解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

问题是你只是在创建一个本地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