web-dev-qa-db-ja.com

AWS Lambda「リクエストを完了する前にプロセスが終了しました」

DynamoDB clientメソッドを呼び出して、DynamoDBテーブルから1つのアイテムを取得しようとしています。 AWS Lambdaを使用しています。しかし、私はメッセージを取得し続けます:

「リクエストを完了する前にプロセスが終了しました。」

念のためにタイムアウトを増やしましたが、処理時間はタイムアウトより短くなります。何かアドバイス?

console.log('Loading event');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function(event, context) {
dynamodb.listTables(function(err, data) {
});

var params = {
    "TableName": "User",
     "Key":
        {"User Id"   : {"S":event.objectId}
    },
    "AttributesToGet"   : ["First Name","Last Name", "Latitude", "Longitude"],
    "ConsistentRead"    : true
  }


   dynamodb.getItem(params, function(response,result) {
    response.on('data', function(chunk){
    console.log(""+chunk);
    console.log("test1")
    context.done(result);
});
result.on('ready', function(data){
    console.log("test2")
    console.log("Error:" + data.error);
    console.log("ConsumedCapacityUnits:" + data.ConsumedCapacityUnits);
     context.done('Error',data);
    // ...
});
});
};
54
Rupert

「リクエストが完了する前にプロセスが終了しました」というメッセージは、context.done(またはcontext.succeedなど)を呼び出す前にJavascript関数が終了したことを意味します。通常、これはコードに何らかのエラーがあることを意味します。

私は(まったく)Javascriptの専門家ではないので、エラーを見つけるためのより洗練された方法があるかもしれませんが、私のアプローチはconsole.logメッセージを大量にコードに入れて実行し、ログ。通常、問題のある行に焦点を合わせることができ、十分に長く見れば、通常は間違いを見つけることができます。

すでにいくつかのロギングがあります。出力には何が見えますか?

51
garnaat

メモリ消費量を確認してください(最後のログ行に含まれています)。ラムダ関数に割り当てるメモリが少なすぎると、同じメッセージが表示されます。

54
linqu

callbackの代わりにcontextを使用しました。
aws Webサイトの最近の例では、callbackの代わりにcontextを使用しています。

リクエストを完了するには、次のいずれかを呼び出す必要があります。

callback(error);         // This is used when there is an error
// or
callback(null, data);    // This is used when there is a success
                         // 'data' will contain success result, like some JSON object  

ラムダ実行がリクエストを完了すると、
上記のコールバックのいずれかを呼び出せない、
以下のエラーが表示されます。

「リクエストを完了する前にプロセスが終了しました。」

コードにエラーがあります。最後の});を削除します。また、下位互換性のために存在するコンテキストを使用しないでください。node.js4.3および6.1ランタイムでコールバックを使用してください。