ho il seguente codice per una funzione lambda:Interrogazione DynamoDB con Lambda non fa nulla
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();
};
Ho una tabella [gli utenti] che si definisce come tale:
{
"cognitoID": { "S": "token" },
"email": { "S": "[email protected]" },
"password": { "S": "somepassword" },
"tos_aggreement": { "BOOL": true },
"userID": { "S": "user1" }
}
Quando chiamo il funzione (da AWS Console o CLI) Posso vedere i messaggi nei log ma il callback per getItem() non viene mai chiamato.
Ho provato a eseguire getItem (params) senza richiamata, quindi definito i callback per il completamento, il successo e l'errore ma quando eseguo send(), neanche il callback completo viene chiamato.
So che le chiamate sono asincrone e ho pensato che forse, la funzione lambda stava finendo prima che la query fosse terminata e quindi il callback non sarebbe stato chiamato, ma, ho aggiunto un semplice ciclo stupido alla fine della funzione e la chiamata è scaduta dopo 3 secondi, senza che vengano richiamati i callback.
Ho provato con diverse funzioni batchGetItem, getItem, listTables e scan. Il risultato è lo stesso, nessun errore ma la funzione di callback non viene mai chiamata.
Scommetto che se interrogassi dynamoDB senza usare Lambda, otterrò i risultati quindi mi sto davvero chiedendo perché non sta succedendo nulla qui.
Ho creato un ruolo per la funzione e ho creato una politica che consentisse l'accesso alle funzionalità in dynamoDB di cui ho bisogno, ma senza risultato.
La politica si presenta così:
{ "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": "*" } ] }
ho eseguito la politica nel simulatore e ha funzionato come ho pensato che sarebbe. Suggerimenti?
hai ricevuto un messaggio che indica che il processo è stato chiuso prima di completare la richiesta? –
No perché ho avuto una chiamata context.done() o context.succeed(). Il problema è che lo script JSNode è asincrono e quando si effettua una chiamata a dynamoDB, i suoi callback potrebbero non essere mai chiamati poiché la funzione lambda termina. In effetti, l'azione dynamoDB non ha nemmeno il tempo di iniziare. –