AWS Lambda 函数总是返回 null (Node/Javascript)?

Posted

技术标签:

【中文标题】AWS Lambda 函数总是返回 null (Node/Javascript)?【英文标题】:AWS Lambda Function always returns null (Node/Javascript)? 【发布时间】:2018-12-29 18:48:21 【问题描述】:

我有一个简单的 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. 不确定资源部分中的 ::* 会做什么。我会将其更改为 "Resource": "*" 开始,然后在您开始工作后将 sns arn 放入其中。 2. 设置您的 lambda 以写入 cloudwatch(LambdaFullAccess 或等效项),然后在其中放置一些写入行,例如验证 env 变量是否被正确读取等。我将从这两个步骤开始。 @Zaxxon 感谢您的建议,尽管我无需这样做就能解决它 【参考方案1】:

好的,所以我想通了。

有两个问题。首先是我没有使用 Lambda for Node 隐式使用的“回调”参数。第二个是该函数默认是异步的,所以它期待稍后的某个地方“等待”。我决定只是删除“异步”并让它同步运行,因为它只是一个简单的功能,反正不需要它。

这是我更新后的工作代码:

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

【讨论】:

你可以通过promisify来避免回调风格并使用async/await。 您也没有使用err 调用回调,即它应该是:if(err) callback(err, statusCode: 500, body: Error: $err` ); else callback(null, JSON.stringify(data)); 此部分的文档:docs.aws.amazon.com/lambda/latest/dg/…【参考方案2】:

就我而言,我只是想执行基本的helloWorld 处理程序。

exports.helloWorld = (event, context) => 
    context.callbackWaitsForEmptyEventLoop = false;

    return 
        statusCode: 200,
        body: 'Hello World'
    

我正在尝试使用上述功能,但响应为 nullconsole.log 工作正常。但是在将async 添加到函数后,会显示正确的响应。

exports.helloWorld = async (event, context) => 

【讨论】:

以上是关于AWS Lambda 函数总是返回 null (Node/Javascript)?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定AWS Lambda函数中的当前区域?

如何在 Python 中从 AWS 中的 lambda 函数返回二进制数据?

如何从 JAVA 调用 AWS lambda 函数?

AWS Lambda 函数返回模块“索引”上缺少的处理程序“处理程序”

AWS Lambda Callback的函数签名

如何从我的 EC2 实例调用 AWS Lambda 函数?