繁体   English   中英

Lambda Function 使用 Node.Js

[英]Lambda Function using Node.Js

我正在尝试使用 lambda function 列出特定区域中的所有 EC2 实例。 这是我的代码:

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;
}

我得到 Execution result: succeeded 但并没有真正返回任何实例。

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;
}

所以这里我们有一个 promise,如果描述实例成功,它将用数据解决,如果描述实例失败,则会用错误拒绝。

请注意,我们将data变量传递给resovle而不仅仅是“Data”字符串,这在以前没有任何意义。

另外,请记住,使用此代码,您的 lambda function 将从describeInstances响应返回原始 output。 如果您需要过滤某些数据或添加其他逻辑,您需要在resolve之前执行此操作并将结果传递给resolve ,或者await promise 的结果,对数据执行任何您需要的操作并返回结果。

TL/DR:尝试回调中解决您的 promise。

也许与回调和承诺有一些混淆。

  • 您的describeInstances方法获取一个正在调用的回调,但您不知道何时会调用。 所以可能发生的是你调用 describeInstances (它不会阻塞),然后你的 promise 立即解决。 之后,您的 AWS 回调会在某个时间点被调用。 我想这不是你想要的?
  • 我猜你的 function 不需要async关键字,因为你返回 promise (你没有在等待任何东西。

另外,也许看看这里: https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original

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;
  }
};

上面的代码很好地适用于用例,不需要处理 promise 和回调好先生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM