Как публиковать 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

Нечто похоже работает для меня. Я могу опубликовать его в конкретной конечной точке, используя: Ящик для уведомлений Apple Push Notification (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

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

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

Ответ 3

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

        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 ничего не сделает.

В моей работе script делались предыдущие сообщения:

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

И даже несмотря на то, что CloudWatch добился успеха в работе, я никогда не получал сообщение. Как только я добавил данные MessageStructure и что я правильно отформатировал полезную нагрузку, он работал как шарм.

Параметр [default] не полезен, но я оставил его там, чтобы показать, как выглядит структура.

Если вы не стягиваете часть payload.GCM, SNS будет barf и скажет, что ваше сообщение должно включать элемент "GCM".

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

Ответ 4

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

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

Ответ 5

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

Это приведет к ошибке: Недействительный параметр: TargetArn Причина: > arn: aws: sns: us-west-2: 561315416312351: app/APNS_SANDBOX/com.APP_NAME_HERE.app is > недействительный ARN для публикации.

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

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

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

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