Ich habe den folgenden Code für eine Lambda-Funktion:Querying DynamoDB mit Lambda tut nichts
console.log('Loading function');
var aws = require('aws-sdk');
var ddb = new aws.DynamoDB();
function getUser(userid) {
var q = ddb.getItem({
TableName: "Users",
Key: {
userID: { S: userid } }
}, function(err, data) {
if (err) {
console.log(err);
return err;
}
else {
console.log(data);
}
});
console.log(q);
}
exports.handler = function(event, context) {
console.log('Received event');
getUser('user1');
console.log("called DynamoDB");
context.succeed();
};
Ich habe eine [Benutzer] Tabelle, die als solche definiert:
{
"cognitoID": { "S": "token" },
"email": { "S": "[email protected]" },
"password": { "S": "somepassword" },
"tos_aggreement": { "BOOL": true },
"userID": { "S": "user1" }
}
als ich den Anruf Funktion (von der AWS-Konsole oder der CLI) Ich kann die Nachrichten in den Protokollen sehen, aber der Rückruf für die getItem() wird nie aufgerufen.
Ich habe versucht mit getItem (params) ohne Rückruf, dann die Rückrufe für vollständig, Erfolg und Misserfolg definiert, aber wenn ich die send(), wird auch die komplette Rückruf nicht aufgerufen.
Ich weiß, dass die Aufrufe asynchron sind und ich dachte, dass vielleicht die Lambda-Funktion beendet wurde, bevor die Abfrage durchgeführt wurde und daher der Callback nicht aufgerufen würde, aber ich fügte eine einfache dumme Schleife am Ende der Funktion und der Anruf endete nach 3 Sekunden, ohne dass die Rückrufe überhaupt angerufen wurden.
Ich habe versucht mit verschiedenen Funktionen BatchGetItem, GetItem, ListTables und Scan. Das Ergebnis ist das gleiche, kein Fehler, aber die Callback-Funktion wird nie aufgerufen.
Ich wette, wenn ich DynamoDB abfrage, ohne Lambda zu verwenden, wird es mir die Ergebnisse bringen, also frage ich mich wirklich, warum hier nichts passiert.
Ich erstelle eine Rolle für die Funktion und ich habe eine Richtlinie erstellt, die den Zugriff auf die Funktionalitäten in dynamoDB erlaubt, die ich brauche, aber ohne Erfolg.
Die Politik sieht wie folgt aus:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:*:*:*" }, { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:GetRecords", "dynamodb:ListTables" ], "Resource": "arn:aws:dynamodb:*:*:*" }, { "Action": [ "logs:*" ], "Effect": "Allow", "Resource": "*" } ] }
ich die Politik im Simulator lief und es funktionierte, wie ich dachte, es würde. Vorschläge?
Haben Sie eine Nachricht erhalten, die besagt, dass der Prozess beendet wurde, bevor die Anfrage abgeschlossen wurde? –
Nein, weil ich dort einen context.done() - oder context.succeed() -Aufruf hatte. Das Problem ist, dass das JSNode-Skript asynchron ist und wenn Sie einen Aufruf von dynamoDB ausführen, werden seine Callbacks möglicherweise nie aufgerufen, da die Lambda-Funktion beendet wird. Tatsächlich hat die DynamoDB-Aktion nicht einmal Zeit, anzufangen. –