web-dev-qa-db-fra.com

Comment publier des sns sur un noeud final spécifique?

J'ai un problème avec la publication de sns sur un noeud final spécifique.

Mon code:

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);

    }
});

Quand j'utilise TopicArn, tout va bien. Mais lorsque j'essaie d'envoyer une notification à un noeud final spécifique, je prends une erreur:

Erreur d'envoi d'un message InvalidParameter: Paramètre non valide: Nom de la rubrique.

Et je n'ai aucune idée de quel genre de paramètres il s'agit et d'où.

16
Alex Cebotari

Une solution similaire fonctionne correctement pour moi. Je peux publier sur un ordinateur d'extrémité spécifique à l'aide de: Sandbox Apple Push Notification Service (APNS_SANDBOX)

Vous voudrez peut-être aussi essayer de mettre à jour aws-sdk, la version actuelle est 1.9.0.

Voici mon code, TargetArn a été copié directement à partir de la console SNS. J'ai omis certaines des données, comme & 

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);
        }
    });
13
guya

Vous pourriez avoir une région invalide. Vérifiez votre région pour le sujet et réglez-le en conséquence. Par exemple, si vous êtes nous-ouest-2, vous pouvez faire quelque chose comme: 

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

Rien de tout cela ne fonctionnera si vous ne massez pas un peu la charge utile.

        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);
        });

Donc, il s'avère que vous devez spécifier la structure du message (étant json). J'ai essayé de publier sur un noeud final à partir de la console AWS et cela a fonctionné tant que j'ai sélectionné JSON. L'utilisation de RAW ne ferait rien.

Dans mon script faisait ce que faisaient les messages précédents:

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

Et même si CloudWatch enregistrait des succès, je n'ai jamais reçu le message. Dès que j'ai ajouté les données MessageStructure et que j'ai correctement formaté la charge utile, cela a fonctionné comme un charme.

Le paramètre [default] n'est pas utile mais je l'ai laissé là pour montrer à quoi pourrait ressembler la structure.

Si vous ne personnalisez pas la partie payload.GCM, SNS indiquera que votre message doit inclure un élément "GCM". 

La seule chose qui est ennuyeuse est que vous devez savoir quel est le point final. J'espérais que vous n'aviez pas à formater le message en fonction du système d'extrémité, ce qui va à l'encontre de l'objectif de SNS à certains égards.

7
E.T

Essayez-vous des points de terminaison autres que les notifications Push, telles que les SMS? L’adressage direct n’est actuellement disponible que pour les points de terminaison des notifications Push. Telle est l'erreur que vous obtiendrez lorsque vous essayez de publier sur un ordinateur d'extrémité spécifique qui ne permet pas l'adressage direct!

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

1
Neo

J'avais exactement le même problème que vous. Le problème est le TargetArn que vous utilisez, il n'y a pas de documentation claire à ce sujet. Une erreur survient si vous essayez de placer l'ARN de l'application dans le TargetArn. 

Cela produira l'erreur: Paramètre non valide: TargetArn Raison:> arn: aws: sns: us-west-2: 561315416312351: app/APNS_SANDBOX/com.APP_NAME_HERE.app n'est> pas un ARN valide pour lequel publier.

Tout ce que vous avez à faire est de placer EndpointArn dans TargetArn. 

Si vous avez besoin de voir EndpointArn, vous pouvez:

  1. Appelez listPlatformApplications () pour obtenir toutes les ARN de vos applications.
  2. Appelez listEndpointsByPlatformApplication () avec l'ARN de l'application pour obtenir la liste de EndpointArn.

Prendre plaisir!

0
Minor Solis