1
votes

Fonction Lambda utilisant Node.Js

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 commentaires

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


3 Réponses :


1
votes

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.

  • Votre méthode 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?
  • votre fonction n'a pas besoin du mot-clé 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


0 commentaires

2
votes
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.

0 commentaires

0
votes
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.

0 commentaires