Lambda SDK调用无响应

时间:2019-03-01 19:58:01

标签: amazon-web-services aws-lambda aws-sdk

我正在尝试在AWS Lambda中创建一个非常简单的“ hello world”。我尝试了一些仅调用AWS开发工具包的服务,只是尝试阅读。我的回调永远不会被调用。我必须丢失一些东西。任何帮助表示赞赏!

var AWS = require("aws-sdk");

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };

    var s3 = new AWS.S3(); // confirmed this is not null
    s3.listBuckets({}, function(err, data) {
           // never reaches here!
           if (err) console.log(err, err.stack); // an error occurred
            else     console.log(data);           // successful response
    });

    return response;
};

我确实创建了该Lambda使用的具有S3访问权限的角色。 :-)

2 个答案:

答案 0 :(得分:1)

这是一个同步问题。

在调用回调之前,您的return response代码已执行。

您必须将return语句放入回调中或使用async/await

返回您的回调:

var AWS = require("aws-sdk");

exports.handler = async (event) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };

  var s3 = new AWS.S3();
  s3.listBuckets({}, function (err, data) {
    if (err) {
      console.log(err, err.stack);
      return {
        statusCode: 500,
        message: 'some error'
      }
    }
    return response
  });
}

使用异步/等待:

var AWS = require("aws-sdk");

exports.handler = async (event) => {
  const response = {
    statusCode: 200
  };

  var s3 = new AWS.S3();
  await s3.listBuckets().promise();
  return response;
}

我会使用async / await方法,因为它更干净,更易读。使用promise比使用回调还容易。

编辑:OP声称它不起作用。因此,我决定自己进行测试。上面的代码可以工作,只需要很小的更改即可将列出的存储桶添加到响应中。这是最终的代码:

var AWS = require("aws-sdk");

exports.handler = async (event) => {
  const response = {
    statusCode: 200
  };

  var s3 = new AWS.S3();
  const buckets = await s3.listBuckets().promise();
  response.body = JSON.stringify(buckets);
  return response;
}

这是CloudWatch Logs中的输出:

enter image description here

答案 1 :(得分:1)

似乎,因为我选择了Node 8.x运行时,所以我需要使用其中一种异步构造。这行得通...

let AWS = require('aws-sdk');
let s3 = new AWS.S3();

exports.handler = async (event) => {
    return await s3.listBuckets().promise() ;
};