【问题标题】:node.js aws sns difference between console test and npm run publish'ed messagenode.js aws sns 控制台测试和 npm run 发布消息之间的区别
【发布时间】:2021-04-10 18:44:42
【问题描述】:

我向 Amazon SNS 发布一条消息,供 lambda 函数读取。

在我的测试中,我使用 2 种方法来调用 lambda 函数;

  1. AWS 控制台 Lambda > 函数 > 22-generic-subscription
  2. 使用 AWS CLI $> npm run invoke-test-sns

package.json 包含的地方

  "scripts":
  {"invoke-test-sns": "aws sns publish --message file://message.txt --subject TestMsg --topic-arn ${npm_package_SNS_srcARN}"
  }

message.txt;

{
  "test": "cli",
  "length": "20",
  "width": "6"
}

显然代码没有改变,但是两次调用的结果出乎意料,我已经减少了代码以突出差异;

代码;

/*
**    22-generic-subscription
*/
var AWS = require("aws-sdk");

console.log('Loading function');

// START
let area;

exports.handler = async (event) => {
try {

var jMsg = event.Records[0].Sns.Message

console.log('messageConsole: 1-');
var messageConsole = JSON.parse(JSON.stringify(jMsg));
console.log('messageConsole: ', messageConsole);
console.log('messageConsole: ', messageConsole.test);

console.log('messageCLI: 1-');
var messageCLI = JSON.parse(jMsg);
console.log('messageCLI: ', messageCLI);
console.log('messageCLI: ', messageCLI.test);

console.log('messageCLI.stringify: 2-');
var messageCLI2 = JSON.parse(JSON.stringify(jMsg));
console.log('messageCLI2: ', messageCLI2);
console.log('messageCLI2: ', messageCLI2.test);
}
catch (err) {
console.log(err);
return err;
}
return area;
};

从控制台设置测试 - 选择 AWS Console > Configure Test Event > Amazon SNS Test Notification 并通过复制和编辑 message.txt 的内容来更改 Message 元素,如下所示;

    "Message": {
      "test": "console",
      "length": "10",
      "width": "5"
    }

我更改了测试值以指示如何调用测试,即控制台或 cli。

这是结果;

控制台测试 1

START RequestId:2b671ef5-06f1-45f2-9501-e797997eb2c0 版本:$LATEST 2021-01-02T23:12:03.891Z 未定义的信息加载功能 2021-01-02T23:12:03.896Z 2b671ef5-06f1-45f2-9501-e797997eb2c0 信息消息控制台:1- 2021-01-02T23:12:03.898Z 2b671ef5-06f1-45f2-9501-e797997eb2c0 信息消息控制台:{测试:'控制台',长度:'10',宽度:'5'} 2021-01-02T23:12:03.898Z 2b671ef5-06f1-45f2-9501-e797997eb2c0 信息消息控制台:控制台 2021-01-02T23:12:03.898Z 2b671ef5-06f1-45f2-9501-e797997eb2c0 信息消息CLI:1- 2021-01-02T23:12:03.898Z 2b671ef5-06f1-45f2-9501-e797997eb2c0 信息
语法错误:位置 1 处 JSON 中的意外标记 o END RequestId: 2b671ef5-06f1-45f2-9501-e797997eb2c0

CLI 测试 2

开始请求 ID:c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 版本:$LATEST 2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息控制台:1- 2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息控制台: { “测试”:“cli”, “长度”:“20”, “宽度”:“6” }

2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息控制台:未定义 2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息CLI:1- 2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息CLI:{测试:'cli',长度:'20',宽度:'6'} 2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息CLI: cli 2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息 CLI.stringify: 2- 2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息 CLI2:
{ “测试”:“cli”, “长度”:“20”, “宽度”:“6” } 2021-01-02T23:14:24.944Z c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d 信息消息CLI2:未定义 END RequestId: c5e4a0f3-50ac-4031-af0e-4dfb581ccb4d

抱歉,可能不清楚控制台测试 1 - CLI 代码失败和 CLI 测试 2 - 控制台代码失败。 有人可以解释为什么结果不同,以及无论如何调用测试,我如何编写代码以相同的方式运行?

【问题讨论】:

    标签: node.js amazon-sns


    【解决方案1】:
    • Lambda 在单次调用中调用一个或多个 SNS 消息,因此,您将获得一组消息,而不是单个 json。消息格式为Here
    • 实际消息有时会根据消息写入 SNS 的方式进行压缩和 base64 编码。例如 SNS 的 Cloudwatch 订阅过滤器。

    所以,我们总是需要遍历 Records 并处理每条消息,而不仅仅是第一个记录 event.Records[0]..

    从 AWS 控制台传递的输入也应该与我们从 SNS 获得的格式完全相同。 从 CLI aws sns 发布 --topic-arn arn:aws:sns:us-east-1:111122223333:my-test-topic --message '{"test":"cli","length":"20","width ":"6"}'

    来自控制台:消息应位于 Records 数组内的 Sns.Message 中。

    {"Records":[{"Sns":{"Message":"{\"test\":\"cli\",\"length\":\"20\",\"width\":\"6\"}"}}]}
    

    并打印节点中的传入消息

      event.Records.forEach((record) => {
        const snsMessage = JSON.parse(record.Sns.Message);
        console.log("Sns Message", snsMessage);
      });
    

    【讨论】:

    • 我尝试通过 CLI 在 message.txt 中传递 '{"test":"cli","length":"20","width":"6"}' 并得到相同的结果,无论是否带有引号字符。单独在 AWS 控制台中,我还尝试使用反斜杠“\”格式化消息以转义双引号并得到相同的错误,所以我的理解仍然不完整,请您查看一下?
    • 您可以像我的示例一样将'{"test":"cli","length":"20","width":"6"}' 直接传递给 --message 或者您可以将 json 直接保存在 message.txt 中并传递 file://message.txt ,就像您所做的那样。两者都应该工作正常。重要的是您从 Lambda 控制台传递的格式是什么
    • 对不起,只是重新盖章;根据原始帖子,一切都是/一直适用于 CLI 和控制台,但奇怪的是使用不同的代码!?我需要更改我的代码还是我的消息格式有一些特殊性?
    • @chris-j 在我的示例中,我从 cli 和控制台传递了一个字符串。我编辑了答案以添加一个小循环来打印它们。总的来说,在您的问题中,您从 Lambda 控制台传递的输入似乎格式不正确。
    猜你喜欢
    • 2022-11-14
    • 2019-04-11
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2021-10-18
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多