web-dev-qa-db-ja.com

特定のエンドポイントに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:Invalid parameter:Topic Name

そして、私はそれがどのような種類のパラメータであり、どこからのものなのかわかりません。

19
Alex Cebotari

同様のことが私にとってはうまく機能しています。 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);
        }
    });
15
guya

無効な地域がある可能性があります。トピックのリージョンを確認し、それに応じて設定します。たとえば、あなたがus-west-2の場合、次のようなことができます

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

ペイロードを少しマッサージしないと、これは機能しません。

        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データを追加し、ペイロードを適切にフォーマットするとすぐに、魅力的に機能しました。

[デフォルト]パラメータは役に立ちませんが、構造がどのように見えるかを示すために残しました。

Payload.GCMの部分を文字列化しない場合、SNSはbarfし、メッセージに「GCM」要素を含める必要があると伝えます。

厄介なのは、エンドポイントが何であるかを知る必要があることだけです。エンドポイントに基づいてメッセージをフォーマットする必要がないことを期待していました。これは、SNSの目的を実際にいくつかの点で損ないます。

7
E.T

SMSなどのプッシュ通知以外のエンドポイントを試していますか?直接アドレス指定は現在、プッシュ通知エンドポイントでのみ使用できます。これは、直接直接アドレッシングが許可されていない特定のエンドポイントに公開しようとすると発生するエラーです。

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

1
Neo

私はあなたとまったく同じ問題を抱えていました。問題は、使用している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. アプリARNを指定してlistEndpointsByPlatformApplication()を呼び出し、EndpointArnのリストを取得します。

楽しい!

0
Minor Solis