2013-08-05 61 views
1

我正在編寫兩個python腳本,它們將在Amazon S3中將文件從一個存儲桶移到另一個存儲桶,然後驗證已移動的密鑰的內容。在倒了他們以後,他們的關鍵類boto,並看着this stackoverflow的問題,我已經找到了如何通過文件被複制後的「etag」拉校驗和。如何使用boto獲取亞馬遜上的密鑰/文件的校驗和?

但是,這隻適用於文件被downlaoded /上傳,因爲驗證將由完全不同的腳本來完成,我需要從文件中獲取etag而不需要實際下載它。

目前,工作流程如下: 文件一通過一個存儲桶並使用boto複製所有密鑰,然後打印輸出密鑰後跟etag的路徑 。 (桶[]爲源和目的地)這工作正常:

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是「None」,程序崩潰。 有沒有人知道解決這個問題的方法?

回答

4

問題是你剛創建一個本地密鑰對象。沒有信息被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請求,因此不會檢索對象的主體,只有標題。另外,如果對於程序的給定運行,存儲桶名稱(即目的地[0])總是相同的,則不需要爲存儲桶中的每個關鍵對象執行get_bucket

+0

事實上,這是解決方案,謝謝。 – Martinnj

相關問題