2017-04-23 69 views
3

我們已要求我的學校項目編寫在AWS Lambda中運行的Java代碼。它應該獲取特定URL的源代碼,然後將其上傳到S3存儲桶。 Java代碼應該在AWS Lambda上運行。AWS Lambda:任務超時

我得到了Java中String變量的源代碼。然後我有while循環,試圖將字符串寫入/ tmp目錄中的文件。然後該文件被上傳到S3。

一切正常,但我陷入了一個特定的URL。我已經跟蹤到這一點的問題:

try { 
    BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/url.txt")); 
    out.write(source_code); //Replace with the string 
    //you are trying to write 
    out.close(); 
} 
catch (IOException e) { 
    System.out.println("Exception "); 
} 

最奇怪的是,當我在本地測試代碼,一切正常。文件在我的計算機上的/ tmp目錄中創建,然後上載到S3存儲桶。然而,當我運行LAMBDA的代碼,我得到以下錯誤:

Task timed out after 15.00 seconds 

任何想法,爲什麼LAMBDA不能寫入文件到其臨時目錄在這種特殊情況下,它與人的作品?

+0

是否[此](http://stackoverflow.com/questions/37987576/how-to-scale-lambda-when-tmp-is-reused)有幫助嗎? (只是在黑暗中拍攝,我真的不知道) – ajb

回答

10

亞馬遜Lambda旨在用作響應事件的事件驅動系統。流量是:

  • 有事某處觸發拉姆達(例如上載到Amazon S3,數據進入一個Amazon室壁運動流,應用​​程序直接調用lambda函數)
  • lambda函數是創建,從觸發事件數據被傳遞
  • lambda函數運行

Lambda函數被限制爲5分鐘的最大執行時間。實際限制是在創建Lambda函數時配置的。這個限制已經到位,因爲Lambda函數意味着小而快,而不是大型應用程序。

您的錯誤消息說Task timed out after 15.00 seconds。這意味着AWS 一旦運行時間達到15秒就會故意停止該任務。它與當時的功能和正在處理的文件無關。

修復:增加Lambda函數配置頁面上的超時設置。

+0

我同意@約翰。您需要增加可延長至5分鐘的lambda超時限制。您的代碼需要超過15秒的時間來處理。 –

+0

這就是我的嘗試,我已經超時了2分鐘,仍然沒有運氣。我的Lambda函數每15分鐘運行一次,由Jenkins觸發。我不明白什麼時候在本地運行,它工作得很好,但是當在Lambda上時,它失敗了。這也發生在一個特定的網站上,其他網站都很好,並且Lambda正確處理它。另外,你認爲最好不要在/ tmp目錄中存儲任何內容,並直接從內存上傳到S3存儲桶中?非常感謝。 –

+0

現在您已將超時時間增加到2分鐘,您是否收到「超過120秒後超時」消息?如果是這樣,這意味着事情還沒有完成。你應該記錄儘可能多的信息,然後使用日誌來弄清楚所有的時間。 (這就是編程的樂趣!)在你上傳文件後肯定會從'/ tmp'中刪除文件,否則你的空間不足。在上傳之前記錄文件的大小會很好,所以如果失敗了,你會知道它想要做什麼。 –

0

首先,爲什麼寫入/ tmp /?你寫入Lambda函數執行的地方?

但是,更好的方法是,如果要將字符串編寫爲S3文件,則可以創建S3Object並將其直接寫入AWS S3。這裏有一個帖子展示了一個例子:https://stackoverflow.com/a/29844224/358013

+0

/tmp /是唯一的位置,lambda讓你寫文件 –

0

在我的情況下,當任務在本地工作正常但在Lambda上超時時,這是因爲我需要增加分配給Lambda實例的內存。