Lambda SDK 调用无响应

Lambda SDK Calls No Response

我正在尝试在 AWS Lambda 中做一个非常简单的 "hello world"。我尝试了一些只调用 AWS SDK 的服务,只是尝试阅读。我的回调永远不会被调用。我必须错过一些东西。任何帮助表示赞赏!

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 访问权限的角色。 :-)

这是一个同步问题。

您的 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
  });
}

使用async/await:

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 中的输出:

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

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

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