J'essaye de lister toutes les instances EC2 dans la région particulière en utilisant la fonction lambda. Voici mon code:
const AWS = require('aws-sdk'); AWS.config.region = '******'; exports.handler = async function(event) { const promise = new Promise(function(resolve, reject) { const ec2 = new AWS.EC2(); ec2.describeInstances( function(err, data) { console.log("\nIn describe instances:\n"); if (err) console.log(err, err.stack); // an error occurred else console.log("\n\n" + data + "\n\n"); // successful response context.done(null, 'Function Finished!'); }) resolve("Data"); }) return promise; }
J'obtiens le résultat de l'exécution: réussi mais ne renvoie vraiment aucune instance.
3 Réponses :
TL / DR: essayez de résoudre votre promesse dans le rappel.
Peut-être y avoir un peu de confusion avec des rappels et des promesses.
describeInstances
obtient un rappel qui est appelé, mais vous ne savez pas quand ce sera le cas. Donc, ce qui se passe probablement, c'est que vous invoquez describeInstances (qui ne bloque pas), puis votre promesse se résout immédiatement. Après cela, votre rappel AWS est appelé à un moment donné. Je suppose que ce n'est pas ce que vous voulez? async
je suppose que vous renvoyez une promesse (vous n'attendez rien. Vous pouvez également jeter un œil ici: https : //nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original
const AWS = require('aws-sdk'); AWS.config.region = '******'; exports.handler = async function(event) { const promise = new Promise(function(resolve, reject) { const ec2 = new AWS.EC2(); ec2.describeInstances(function(err, data) { console.log("\nIn describe instances:\n"); if (err) { console.log(err, err.stack); // an error occurred reject(err); } else { console.log("\n\n" + data + "\n\n"); // successful response resolve(data); } }) }); return promise; } So here we have a promise, which is going to be resolved with data in case of success and rejected with an error in case of fail of describing instances.Note, that we pass data variable into resovle instead of just "Data" string, which did not make any sense previously.Also, keep in mind, that with this code your lambda function will return the raw output from describeInstances response. If you need to filter some data or add other logic, you need to do that before resolve and pass result into resolve, or await for result of promise, do whatever you need with the data and return the result.
const AWS = require("aws-sdk"); const ec2 = new AWS.EC2({ region: "your_region" }); exports.handler = async function (event) { try { let response = await ec2.describeInstances().promise(); return response; } catch (error) { return error; } }; The above code works neatly for the use-case and doesn't need to deal with promise and callbacks good sir.
Vous appelez la résolution avec une chaîne "Data" sans données réelles.
@ArtemArkhipov que dois-je entrer au lieu d'une chaîne?
vos données «réelles» doivent être à l'intérieur de la variable de données