AWS Lambda函数始终返回空值(节点/ Javascript)吗?

时间:2018-07-21 20:17:41

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

我有一个简单的Lambda函数,该函数应该获取事件数据并将消息发送到SNS主题。

运行时是Node.js 8.10。

这是我完整的Lambda代码:

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

exports.handler = async (event) => {

const sns = new AWS.SNS();

const emailBody = 
`
New Message

From: ${event.name}
Contact: ${event.contact}

Message: ${event.message}
`;

const snsMessageParams = {
    TopicArn: process.env.snsTopicArn,
    Message: emailBody
};

sns.publish(snsMessageParams, (err, data) => {
    if(err) {
        return err;
    } else {
        return data;
    }
  });
};

每次我运行该函数时,我总是得到null作为响应。没有错误返回,但我从未从SNS的电子邮件中收到消息,因此这里有问题。我只是不知道是什么。

我能够从SNS控制台以及本地计算机上的Node SDK成功地向我的SNS主题发布消息。这些完美地工作。通过直接从成功的本地代码和SNS控制台复制并粘贴,我已检查env变量中的snsTopicArn是否正确。

我在Lambda函数上具有执行角色,该角色应使我可以在帐户中的任何主题上发布到SNS。在配置Lambda角色以测试所有内容时,我选择了默认的“ SNSPublish”选项。但作为参考,以下是我的执行角色的政策:

{
  "roleName": <MyRoleName>,
  "policies": [
    {
       "document": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "sns:Publish"
              ],
              "Resource": "arn:aws:sns:*:*:*"
            }
          ]
        }
    ...
}

这是怎么回事?任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:5)

好,所以我知道了。

有两个问题。首先是我没有使用Lambda隐式使用Node的“ callback”参数。第二个是默认情况下该函数是异步的,因此它期望稍后某个地方“等待”。我决定只删除“异步”并使其同步运行,因为它只是一个简单的函数,反正不需要它。

这是我更新的工作代码:

const AWS = require("aws-sdk");
const sns = new AWS.SNS();

exports.handler = (event, context, callback) => {

const emailBody = 
`
Message

From: ${event.name}
Contact: ${event.contact}

Message: ${event.message}
`;

const snsMessageParams = {
    TopicArn: process.env.snsTopicArn,
    Message: emailBody
};

sns.publish(snsMessageParams, (err, data) => {
    if(err) {
        return err;
    } else {
        callback(null, JSON.stringify(data));
    }
});
};