簡體   English   中英

在TypeError(Node.js 4.3)之后,AWS Lambda變得沒有響應

[英]AWS Lambda becomes unresponsive after TypeError (Node.js 4.3)

我正在使用帶有Node.js 4.3的AWS Lambda,並在代碼中使用DynamoDB:

dynamodb.get(params, function(err, data) {
    if (err) {
        console.log("Error: " + JSON.stringify(err));
        callback("Error: DB problem");
    }
    else {
            callback(null, data.Item.someAttribute);
    }
});

我知道這是錯的,我需要在訪問之前檢查Item是否存在。 現在不是重點。

我得到TypeError: TypeError:無法讀取未定義的屬性'someAttribute'

哪個沒關系,如果沒有這樣的項目,就會失敗。 在lambda變得沒有響應之后,還有其他健康的請求來到lambda,而lambda每次都會因超時而失敗。 正如您在下面的日志(來自CloudWatch)中看到的那樣,即使錯誤發生后40(!)分鍾,lambda仍然沒有響應。 而且我知道那里沒有任何事情發生,如果我正在打印“輸入到Lambda”的代碼,可以在第一個請求中看到。 在任何時候,沒有這樣的打印請求,Lambda剛剛死了。

START RequestId: xxx Version: 1
2017-05-12T09:20:18.739Z    Input to Lambda: ...
2017-05-12T09:20:19.770Z    xxx TypeError: Cannot read property 'someAttribute' of undefined at ...
END RequestId: xxx
REPORT RequestId: xxx   Duration: 1094.61 ms    Billed Duration: 1100 ms
RequestId: xxx Process exited before completing request

START RequestId: xxx Version: 1
END RequestId: xxx
REPORT RequestId: xxx   Duration: 3002.12 ms    Billed Duration: 3000 ms
2017-05-12T09:24:08.556Z xxx Task timed out after 3.00 seconds

...

START RequestId: xxx Version: 1
END RequestId: xxx
REPORT RequestId: xxx   Duration: 3001.15 ms    Billed Duration: 3000 ms
2017-05-12T10:01:14.672Z xxx Task timed out after 3.00 seconds

修復代碼並將其重新上載到Lambda使其工作,但是如何使某些錯誤使整個端點無響應。 等待幾個小時也讓Lambda再次工作。 我正在考慮刪除“使用嚴格”,但它看起來不是一個好的解決方案。 關於什么可能是死亡lambda的原因以及如何在將來避免這種情況的想法?

事實上,Lambda變得反應遲鈍的情況很多,例如:

  1. 解析無效的json:

     exports.handler = function(event, context, callback) { var nonValidJson = "Not even Json"; var jsonParse = JSON.parse(nonValidJson); 
  2. 訪問未定義變量的屬性:

     exports.handler = function(event, context, callback) { var emptyObject = {}; var value = emptyObject.Item.Key; 
  3. 訪問RDS后未關閉mySql連接會導致Lambda超時,然后它變得無響應。

據透露,這是一個錯誤,AWS團隊已知將近一年:
https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0

不幸的是,它仍然沒有修復,經過一些測試后發現實際上Lambda試圖重新啟動(重新加載容器?),沒有足夠的時間。 如果將超時設置為10秒,則執行時間約為4秒后,Lambda開始工作,然后在下一次運行中表現正常。 我也試過玩設置:

context.callbackWaitsForEmptyEventLoop = false;

並將所有'require'塊放在處理程序中,沒有什么真正起作用。 防止Lambda死機的唯一方法是設置更大的超時,10s應該足以作為針對此bug的變通防護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM