【问题标题】:Published sns message from lambda function not received by device设备未收到来自 lambda 函数的已发布 sns 消息
【发布时间】:2021-09-30 18:11:20
【问题描述】:

我有一个非常简单的 lambda 函数,可以将消息发布到这样的主题:

const AWS = require('aws-sdk');
const sns = new AWS.SNS()
const TOPIC_ARN = "arn:aws:sns:us-east-1:<topic ARN>";
const TARGET_ARN = "arn:aws:sns:us-east-1:<target ARN>";

exports.handler = async (event) => {
    
    return sns.publish({
        Message: JSON.stringify({
     "default": "any value", 
     "GCM": "{ \"notification\": { \"body\": \"message body\", \"title\": \"message title \", \"sound\":\"default\" } , \"data\" : {\"key\" : \"value\", \"key2\" : \"value\" } }"
     }),
        TargetArn: TARGET_ARN,
        // TopicArn: TOPIC_ARN, also tried this same result
    })
    .promise()
    .then(() => ({statusCode: 204, body: ''}))
    .catch(err => {
        console.log(err);
        return {statusCode: 500, body: 'sns-error'};
    });
};

函数执行没有问题,我可以在我的云监视日志中看到成功事件。

问题是设备从未收到通知。

我知道 ARN 是正确的,因为我可以转到 SNS 控制台并将相同的消息发布到设备并被接收。

我还可以在我的本地机器上启动一个 nodejs 应用程序并将相同的消息发布到 ARN 并且它被接收,没问题。

我还在平台应用程序上配置了交付状态日志记录,我可以从 lambda 函数中看到类似这样的成功响应:

{
    "notification": {
        "messageMD5Sum": "<sting of numbers>",
        "messageId": "<sting of numbers>",
        "timestamp": "2021-07-23 15:35:02.167"
    },
    "delivery": {
        "deliveryId": "<sting of text>",
        "destination": "<ARN>",
        "providerResponse": "{\"multicast_id\":<sting of numbers>,\"success\":1,\"failure\":0,\"canonical_ids\":0,\"results\":[{\"message_id\":\"0:<sting of text>\"}]}",
        "dwellTimeMs": 28,
        "attempts": 1,
        "token": <correct device token>,
        "statusCode": 200
    },
    "status": "SUCCESS"
}

为什么 lambda 函数是设备不接收 SNS 通知的唯一方法?

解决方案

const AWS = require('aws-sdk');
const sns = new AWS.SNS()
const TOPIC_ARN = "arn:aws:sns:us-east-1:<topic ARN>";
const TARGET_ARN = "arn:aws:sns:us-east-1:<target ARN>";

exports.handler = async (event) => {
    
    return sns.publish({
        Message: JSON.stringify({
     "default": "any value", 
     "GCM": "{ \"notification\": { \"body\": \"message body\", \"title\": \"message title \", \"sound\":\"default\" } , \"data\" : {\"key\" : \"value\", \"key2\" : \"value\" } }"
     }),
        MessageStructure: 'json', //this solved the problem
        TargetArn: TARGET_ARN,
    })
    .promise()
    .then(() => ({statusCode: 204, body: ''}))
    .catch(err => {
        console.log(err);
        return {statusCode: 500, body: 'sns-error'};
    });
};

添加 MessageStructure: 'json' 解决了这个问题。

感谢所有建议。

【问题讨论】:

  • 如果您将来自 Lambda 发布的 SUCCESS 日志与来自控制台发布的 SUCCESS 日志进行比较,有什么区别吗?
  • 都不显示任何错误,但它们有不同的成功细节。
  • 你能发布一个例子吗?

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


【解决方案1】:

编辑原始问题以包含答案:

添加 MessageStructure: 'json' 解决了这个问题。

感谢所有建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多