2013-10-14 4 views
14

У меня проблема с публикацией sns для конкретной конечной точки.
Мой код:Как опубликовать 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: Неверный параметр: Название темы
И я понятия не имею, какие параметры есть и откуда.

+1

Вы когда-нибудь узнавали, что это такое? У меня такая же проблема с PHP –

+0

У меня такая же проблема, и это было из-за неправильных настроек региона. Проверьте настройки вашего региона. – dieend

ответ

11

Нечто похоже работает для меня. Я могу опубликовать конкретную конечную точку, используя: Apple Sand 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); 
     } 
    }); 
+2

Ты прибил его. Конечная точка Arn должна выглядеть как arn: aws: sns: us-west-2: 302467918846: конечная точка/APNS_SANDBOX//. –

+0

У меня такая же проблема с php sdk, но моя enpoint arn выглядит не совсем так ... это arn: aws: sns: us-east-1: : : 1234abcf-56de-12ab- 34cd-12345abcd678. im 'пытается отправить sms на определенную конечную точку; отправка по всей теме работает –

+0

@JonB, я также пытаюсь отправить SMS на определенную конечную точку, мой формат endpoint arn (не так ли подписка?), как и ваш. Не повезло ... Но отправка всей теме работает так же, как и вы. Остальные работают, так как они использовали «Приложения» посередине, но мы этого не сделали, и у нас его нет. Итак, вы исправили свою проблему? если да, пожалуйста, помогите мне. Благодарю. – early

7

Вы могли бы иметь недопустимую область. Проверьте регион для темы и установите его соответствующим образом. Например, если вы нас-запад-2 вы могли бы сделать что-то вроде

var sns = new aws.SNS({region:'us-west-2'}); 
+0

Это то, что разрешило аналогичную проблему для меня, когда я ответил на сообщение об ошибке «aws lambda Invalid parameter: TopicArn'. Хотелось бы, чтобы я мог продвигать это не один раз. Спасибо, пожалуйста, вперед! – yanhan

+0

Плюс один для этого ... это была проблема, с которой я столкнулся. Я бы поставил это как ответ на проблему –

0

Вы пытаетесь другие конечные точки, Push-уведомления, такие как SMS? Прямая адресация доступна только для конечных точек push-уведомлений. Это ошибка, которую вы получите при попытке опубликовать в конкретной конечной точке, которая не позволяет прямое прямое обращение!

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

0

У меня был точно такой же вопрос, как вы. Проблема заключается в том, что TargetArn вы используете, там нет четкой документации. Ошибка возникает, если вы попытаетесь поместить приложение ARN в TargetArn.

That will produce the error: Invalid parameter: TargetArn Reason: >arn:aws:sns:us-west-2:561315416312351:app/APNS_SANDBOX/com.APP_NAME_HERE.app is >not a valid ARN to publish to.

Все что вам нужно сделать, это положить EndpointArn в TargetArn.

Если вам нужно, чтобы увидеть EndpointArn, вы можете:

  1. вызова listPlatformApplications(), чтобы получить все ваши приложения ARN-х.
  2. Список вызововEndpointsByPlatformApplication() с ARN приложения, чтобы получить список EndpointArn.

Наслаждайтесь!

6

Ничего из этого не получится, если вы немного не массируете полезную нагрузку.

 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 будет barf и скажет, что ваше сообщение должно включать элемент «GCM».

Единственное, что раздражает, это то, что вам необходимо знать, что такое конечная точка. Я надеялся, что вам не нужно форматировать сообщение на основе конечной точки, что в какой-то степени портит цель SNS.

+0

Отличный ответ! JSON для GCM - это то, чего мне не хватало. – KVISH

+0

Вы настоящий MVP. Инопланетянин У меня была эта проблема только с Android, iOS работал отлично, не имея JSON.stringify APNS/APNS_SANDBOX. – Dan