【问题标题】:How to publish sns to a specific endpoint?如何将 sns 发布到特定端点?
【发布时间】:2013-10-22 02:40:34
【问题描述】:

我在将 sns 发布到特定端点时遇到问题。

我的代码:

var AWS = require('aws-sdk');
AWS.config.loadFromPath('/web/config.json');

var sns = new AWS.SNS();
sns.publish({
    // TopicArn:'arn:aws:sns:us-west-2:302467918846:MyTestTopik',
    TargetArn: 'arn:aws:sns:us-west-2:302467918846:MyTestTopik:613ee49c-d4dc-4354-a7e6-c1d9d8277c56',
    Message: "Success!!! ",
    Subject: "TestSNS"
}, function(err, data) {
    if (err) {
        console.log("Error sending a message " + err);
    } else {
        console.log("Sent message: " + data.MessageId);

    }
});

当我使用TopicArn 时,一切都很好。但是当我尝试向特定端点发送通知时出现错误:

发送消息时出错 InvalidParameter: Invalid parameter: Topic Name

而且我不知道它是什么类型的参数以及来自哪里。

【问题讨论】:

  • 你有没有发现它是什么?我对 PHP 有同样的问题
  • 我有同样的问题,这是因为区域设置不正确。检查您的区域设置。

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


【解决方案1】:

类似的东西对我来说很好用。 我可以使用以下方式发布到特定端点:Apple Push Notification Service Sandbox (APNS_SANDBOX)

您可能还想尝试更新 aws-sdk,当前版本是 1.9.0。

这是我的代码,TargetArn 是直接从 SNS 控制台复制的。我省略了一些数据,比如 &

var sns = new AWS.SNS();
var params = {
    TargetArn:'arn:aws:sns:us-west-2:302467918846:endpoint/APNS_SANDBOX/<APP_NAME>/<USER_TOKEN>'
    Message:'Success!!! ',
    Subject: 'TestSNS'
};

sns.publish(params, function(err,data){
        if (err) {
            console.log('Error sending a message', err);
        } else {
            console.log('Sent message:', data.MessageId);
        }
    });

【讨论】:

  • 你成功了。端点 Arn 应类似于 arn:aws:sns:us-west-2:302467918846:endpoint/APNS_SANDBOX//
  • 我在使用 php sdk 时遇到了同样的问题,但我的 enpoint arn 看起来不太像……它是 arn:aws:sns:us-east-1: ::1234abcf-56de-12ab-34cd-12345abcd678。我正在尝试向特定端点发送短信;发送到整个主题作品
  • @JonB,我也在尝试将 SMS 发送到特定端点,我的端点 arn 格式(真的不是订阅 arn 吗?)就像你的一样。也没有运气......但是发送到整个主题就像你一样。其他人工作,因为他们在中间使用了“应用程序”,但我们没有,我们也没有。那么,你的问题解决了吗?如果你这样做,请帮助我。谢谢。
【解决方案2】:

您的区域可能无效。检查您的主题区域并进行相应设置。例如,如果您是 us-west-2,您可以执行类似

的操作
var sns = new aws.SNS({region:'us-west-2'});

【讨论】:

  • 当我反驳错误消息aws lambda Invalid parameter: TopicArn 时,这为我解决了类似的问题。希望我能不止一次地对此表示赞同。谢谢点击前进!
  • 这个加一...这也是我遇到的问题。我会将其设置为问题的答案
【解决方案3】:

您是否正在尝试推送通知(如短信)以外的端点?直接寻址当前仅适用于推送通知端点。这就是当您尝试发布到不允许直接直接寻址的特定端点时会遇到的错误!

http://aws.amazon.com/sns/faqs/#Does_SNS_support_direct_addressing_for_SMS_or_Email

【讨论】:

    【解决方案4】:

    我遇到了和你一样的问题。问题是您正在使用的 TargetArn,没有关于它的明确文档。如果您尝试将应用程序 ARN 放入 TargetArn,则会发生错误。

    这将产生错误:无效参数:TargetArn 原因:>arn:aws:sns:us-west-2:561315416312351:app/APNS_SANDBOX/com.APP_NAME_HERE.app >不是要发布到的有效 ARN。

    您需要做的就是将 EndpointArn 放入 TargetArn。

    如果您需要查看 EndpointArn,您可以:

    1. 调用 listPlatformApplications() 以获取所有应用程序的 ARN。
    2. 使用 App ARN 调用 listEndpointsByPlatformApplication() 以获取 EndpointArn 的列表。

    享受吧!

    【讨论】:

      【解决方案5】:

      如果你不稍微按摩一下有效载荷,这一切都不会起作用。

              var arn = 'ENDPOINT_ARN';
              console.log("endpoint arn: " + arn);
      
              var payload = {
                  default: message_object.message,
                  GCM: {
                      data: {
                          message: message_object.message
                      }
                  }
              };
      
              // The key to the whole thing is this
              //
              payload.GCM = JSON.stringify(payload.GCM);
              payload = JSON.stringify(payload);
      
              // Create the params structure
              //
              var params= { 
                  TargetArn: arn,
                  Message: payload,
                  MessageStructure: 'json' // Super important too
              };
      
              sns.publish(params , function(error, data) {
                  if (error) {
                      console.log("ERROR: " + error.stack);
                  }
                  else {
                      console.log("data: " + JSON.stringify(data));
                  }
      
                  context.done(null, data);
              });
      

      所以,事实证明您必须指定消息结构(即 json)。我尝试从 AWS 控制台发布到端点,只要我选择 JSON,它就可以很好地工作。使用 RAW 将无济于事。

      在我的脚本中所做的是以前的帖子正在做的:

      var params = {
          TargetArn: arn,
          Message:'Success!!! ',
          Subject: 'TestSNS'
      };
      

      即使 CloudWatch 记录成功,我也从未收到过消息。 一旦我添加了 MessageStructure 数据并正确格式化了有效负载,它就像一个魅力。

      [default] 参数没有用,但我将它留在那里以显示结构的外观。

      如果您没有对 payload.GCM 部分进行字符串化,SNS 会吐槽并说您的消息应该包含“GCM”元素。

      唯一烦人的是你需要知道端点是什么。我希望您不必根据端点格式化消息,这在某些方面确实违背了 SNS 的目的。

      【讨论】:

      • 优秀的答案! GCM 的 JSON 是我所缺少的。
      • 你是真正的 MVP。外星人我只在 Android 上遇到过这个问题,iOS 运行良好,无需 JSON.stringify APNS/APNS_SANDBOX。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 2016-09-23
      • 2019-03-19
      • 2018-10-31
      相关资源
      最近更新 更多