【问题标题】:AWS Lambda function with Node issue带有节点问题的 AWS Lambda 函数
【发布时间】:2019-03-07 10:25:13
【问题描述】:

我一直在使用 Node 8.10 开发 AWS Lambda 函数。我注意到我能够导入 aws-sdk,但在触发一些 EC2 函数时遇到了一些问题。我有一个角色设置了允许我的功能访问的策略。这是我想要一些额外理解的地方。

我试图启动一个这样的实例...

let params = { InstanceIds: ["i-31112345d325"] };

 try{
    let response = ec2.startInstances(params);
    response.send();
}catch(ex){
    console.log(ex);
}

像这样……

 ...
 try{
    let response = ec2.startInstances(params, function(err, data){
      if(err) console.log(err);
      else //do something else
    });
 );
}catch(ex){
    console.log(ex);
}

这些方法中的任何一种似乎都不会触发 EC2 机器启动。我做了一些挖掘并取出了 promise() 并且它似乎有效。

try{
    await ec2.startInstances(params).promise().then((response)=> {
        console.log("Success with ", response);
    })
}
catch(ex){
    console.log(ex);
}

我没有改变其他任何东西。我在互联网上看到的大多数代码都是前两种方式。有人可以解释为什么这对我不起作用吗?文档似乎没有解决它,文档中的示例似乎对我不起作用。 (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/EC2.html#startInstances-property)

【问题讨论】:

  • 猜测:只有最后一个变种等待SDK函数返回。其他变体在函数完成调用之前返回,并且一旦提交 SDK 函数的异步调用,Lambda 函数就会被终止。
  • 你的处理函数......它是哪个? exports.handler = (event, ...exports.handler = async (event, ...
  • 当时,我使用的是异步处理程序。我已经删除了它,当我现在包含函数回调时它似乎可以工作。
  • 我发现问题在于我对处理程序如何工作的了解。我会更新答案,以帮助将来遇到同样问题的人。

标签: javascript node.js amazon-web-services aws-lambda


【解决方案1】:

对于 Node 8.10,处理函数支持 callback 方法。您可以使用 callback 告诉 Lambda 何时从回调函数或承诺中终止

      'use strict';
      const AWS = require('aws-sdk');
      var ec2 = new AWS.EC2();
      exports.handler = (event, context, callback) => {
              var params = {  InstanceIds: ["i-1234567890abcdef0"]}
              ec2.startInstances(params, function(err, data) {
                if (err) callback(err.stack); // an error occurred
                else     callback(null, data);           // successful response
                });
              }

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2015-03-17
    • 2020-07-04
    • 1970-01-01
    • 2021-12-08
    • 2018-09-19
    相关资源
    最近更新 更多