2016-08-17 53 views
6

我通過這段代碼AWS LAMBDA連接到S3 ObjectCreated事件恢復「NoSuchKey:指定的鍵不存在:

TransferUtility trasnferManager = new TransferUtility(s3, context); 
trasnferManager.upload(..,..,..); 

上傳從Android設備S3存儲文件後,我有一個lambda觸發連接到S3:ObjectCreated事件

當執行拉姆達我試圖通過S3.getObject()函數來獲取文件遺憾的是,有時我接受了。「NoSuchKey:指定的鍵不存在:」錯誤。之後,lambda重試幾次t imes併成功獲取文件並繼續執行。

在我看來,lambda函數是在S3中的文件可執行之前執行的嗎?但這不應該發生在設計上。在S3上的文件上傳完成後觸發器應該被觸發。

據公告上2015年8月4日

亞馬遜S3水桶所有地區提供讀後寫一致性 新的對象和覆蓋PUTS最終一致性的PUTS 和DELETES。

事務後寫入一致性允許您在Amazon S3中創建後立即檢索對象。

但這之前:

除了美國標準所有地區(更名爲美國東(N.弗吉尼亞州))支持讀後寫新對象 一致性上傳到Amazon S3。

我鬥是美國東(N.弗吉尼亞州)區域,它是創建8月4日之前,2015年。我不知道,這可能是問題...

編輯:2016年10月20日

根據documentaion - 最終一致的讀取操作可以返回NO RESULT即使兩個或更多WRITE操作在它之前已經完成。

在本例中,W1(寫入1)和W2(寫入2)在R1(讀取1)和R2 (讀取2)開始之前完成。爲了一致的讀取,R1和R2都返回color = ruby​​。對於最終一致的 閱讀,R1和R2可能會返回color = red,color = ruby​​或沒有結果,具體取決於已經過去的時間量 。

Consistent example

+0

請註明您所使用的終點,並在你的問題添加更多的代碼。這可能有所幫助 - https://forums.aws.amazon.com/ann.jspa?annID=3112 –

+0

我正在使用「s3.amazonaws.com」。我認爲這已經過時了,因爲據說「所有地區的Amazon S3存儲桶都提供了讀寫後一致性」,而沒有附加信息。 – bpavlov

+1

我有類似的問題,但並不總是如此。我發現大文件發生這種情況。我有一個事件觸發lambda,並且大部分時間lambda然後試圖移動文件並且成功。在較大的文件(38mb jpg)上,它表示它不存在並失敗。一旦lambda重新初始化因失敗而重試,它可以正常工作。似乎荒謬的是,事件會在文件訪問之前觸發。 – Joel

回答

1

有時,當文件比較大,他們使用的是多部分上傳,它會發送一個觸發拉姆達之前文件是完全上傳上傳的照片。據推測,它與觸發Lambda函數的事件有關。在lambda函數的事件字段中,確保將添加和完整的多部分上傳添加到事件。

+0

我不知道這是一個選項,但肯定會研究這一點。 – Joel

+1

此問題與文件大小沒有關聯。它甚至發生在小文件(〜200kB)上。 – bpavlov

+0

@Joel你可以更新當你將多部分上傳添加到事件時發生了什麼。謝謝 –

0

爲了防止這個問題,可以使用S3 SDK服務器。收到通知後,我們可以確保該對象實際存在。例如,對於AWS的JavaScript SDK,可以用下面的代碼片段:

s3.waitFor("objectExists", { 
    Bucket: "<bucket-name>", 
    Key: "<object-key>" 
}, callback); 

請注意,WAITFOR會增加你的拉姆達的執行時間,這意味着你將需要延長超時。根據文件,檢查將每5秒鐘執行20次。因此,將超時設置爲1分鐘左右應該有助於避免執行超時異常。

鏈接到文件:AWS JavaScript SDK S3 Class