2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】SNSによる、メール送信・プッシュ通知(nodejs)

Last updated at Posted at 2022-07-03

要件

検証済みのメールアドレスへメール送受信可能です。登録済みのグループ内のメールアドレスまたはモバイルデバイスへ一斉送信・プッシュ通知します。

※今記事のサンプルソースは下記のgithubをご参考ください。
サンプルソース

前提

  • Node.js環境
  • AWSアカウント
  • プッシュ通知の場合、Firebaseのアカウントも必要
    ※AWSとFirebaseの事前準備は【SNSとFCMの連携】をご参考ください
  • メールアドレス事前登録し済み(topicやSubscription作成済み)

専門用語

  • DeviceToken
    モバイル端末(デバイス)固有の値
  • EndPoint
    配信対象端末を識別するためのデータです。
    DeviceTokenより作成する、端末を識別するためのID
  • Topic
    配信対象をグルーピングし、配信対象に一斉に通知を配信するための機能です。
  • Subscription
    Subscriptionとは、作成したTopicと配信対象のEndPointを紐づけるデータです。

処理フロー

プッシュ通知

プッシュ通知フロー

メール送信

メール送信フロー

nodejsによるメール送信/プッシュ通知

topic作成

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'REGION'});

// Create promise and SNS service object
var createTopicPromise = new AWS.SNS({apiVersion: '2010-03-31'}).createTopic({Name: "TOPIC_NAME"}).promise();

// Handle promise's fulfilled/rejected states
createTopicPromise.then(
  function(data) {
    console.log("Topic ARN is " + data.TopicArn);
  }).catch(
    function(err) {
    console.error(err, err.stack);
  });

トピックへのサブスクライブ

メールアドレスの場合、パラメーター下記のようです。ProtocolはEMAILです

var params = {
  Protocol: 'EMAIL', /* required */
  TopicArn: 'TOPIC_ARN', /* required */
  Endpoint: 'EMAIL_ADDRESS'
};

モバイルのデバイストークンによる、サブスクライブを作成時は、パラメーターは下記のようです。endPointはデバイストークンで作成したものです。

var params = {
  Protocol: 'application', /* required */
  TopicArn: 'TOPIC_ARN', /* required */
  Endpoint: 'MOBILE_ENDPOINT_ARN'
};

トピックへのサブスクライブのセット

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'REGION'});

// Create subscribe/email parameters
var params = {
  Protocol: 'EMAIL', /* required */
  TopicArn: 'TOPIC_ARN', /* required */
  Endpoint: 'EMAIL_ADDRESS'
};

// Create promise and SNS service object
var subscribePromise = new AWS.SNS({apiVersion: '2010-03-31'}).subscribe(params).promise();

// Handle promise's fulfilled/rejected states
subscribePromise.then(
  function(data) {
    console.log("Subscription ARN is " + data.SubscriptionArn);
  }).catch(
    function(err) {
    console.error(err, err.stack);
  });

Endpoint

メールの場合、Endpointはメールアドレスですが、プッシュ通知の場合はEndpointはデバイストークンによって、作成しないといけません。

パラメーター

  • PlatformApplicationArn
    SNSコンソールの[Mobile]の[プッシュ通知]のプラットフォームアプリケーションからプラットフォームアプリケーション作成ボタンをクリックして作成します。
  • token
    デバイストークン
const params = {
  PlatformApplicationArn: snsPlatformApplicationArn,
  Token: token
}
await sns.createPlatformEndpoint(params).promise()

メール送信/プッシュ通知

    var payload = {
      GCM: {
        fcmV1Message: {
          message: {
            data: {
              type: chatType,
              groupId: groupId
            },
            android: {
              notification: {
                notification_count: badge
              }
            },
            apns: {
              payload: {
                aps: {
                  badge: badge
                }
              }
            },
            notification: {
              body: message,
              title: title
            }
          }
        }
      }
    }
    payload.GCM = JSON.stringify(payload.GCM);
    payload = JSON.stringify(payload);
    const params = {
      TargetArn: endpointArn,
      MessageStructure: 'json',
      Subject: title,
      Message: payload,
    }
    await sns.publish(params).promise()

※アプリアイコンのバッジ表示が必要の場合、badgeが必要です。

badge

省略可、数字

ホーム画面のアプリアイコンのバッジの値。
これを指定しなかった場合、バッジは変更されません。
0 に設定するとバッジは削除されます。

参考:
FCMドキュメント

以前のHTTPからHTTP v1 に移行する

2023年6月21日、Googleは、従来の Firebase Cloud Messaging (FCM) API を使用するアプリケーションがプッシュできなくなると発表しました。Amazon SNSが、Google Firebase の HTTP V1 API を介したモバイル プッシュ通知の配信をサポートするようになりました。

移行手順

  1. AWS SNSの認証方法をキーからトークンに変更
    Firebaseコンソール画面の対象プロジェクトの「サービスアカウント」タブにて「新しい秘密鍵を生成」で秘密鍵ファイを生成し、それをAWS SNSにアップロードします。
    トークンの生成手順
    FCMの設定変更
  2. 送信構文の修正
    HTTP v1 に移行することでプッシュ通知送信のJson構文が変わりました。
    HTTP V1 API
    AWS FCMのjson構文
{
  "GCM": "{
     \"fcmV1Message\": { 
        \"validate_only\" : false,
        \"message\" : 
            {
            \"notification\": {
                \"title\": \"string\",
                \"body\": \"string\"
            },
            \"data\": {
                \"dataGen\": \"priority message\",
            },
            \"android\": {
                \"priority\": \"high\",
                \"notification\": {
                    \"body_loc_args\": [
                    \"string\"
                    ],
                    \"title_loc_args\": [
                    \"string\"
                    ],
                    \"sound\": \"string\",
                    \"title_loc_key\": \"string\",
                    \"title\": \"string\",
                    \"body\": \"string\",
                    \"click_action\": \"clicky_clacky\",
                    \"body_loc_key\": \"string\"
                },
                \"data\": {
                    \"dataAndroid\": \"priority message\",
                },
                \"ttl\": \"10023.32s\"
            },
            \"apns\": {
                \"payload\": {
                    \"aps\": {
                        \"alert\": {
                            \"subtitle\": \"string\",
                            \"title-loc-args\": [
                            \"string\"
                            ],
                            \"title-loc-key\": \"string\",
                            \"loc-args\": [
                            \"string\"
                            ],
                            \"loc-key\": \"string\",
                            \"title\": \"string\",
                            \"body\": \"string\"
                        },
                        \"category\": \"Click\",
                        \"content-available\": 0,
                        \"sound\": \"string\",
                        \"badge\": 5
                    }
                }
            },
            \"webpush\": {
                \"notification\": {
                    \"badge\": \"5\",
                    \"title\": \"string\",
                    \"body\": \"string\"
                },
                \"data\": {
                    \"dataWeb\": \"priority message\",
                }
            }
         }
     }
  }"
}    

※AWS SNS送信する際、fcmV1Messageのキーは追加しました。

その他

メール送信の場合、以上の設定で送信できますが、プッシュ通知の場合、その他の設定が必要です。例えば、FirebaseのFCM設定、iosのプッシュ通知証明書発行などは必要です。ここでは記述しません。

おまけ

テストする際、エラーログなどはcloudwatchで確認できます。
ロググループ:
sns/region名/アカウント名/app/GCM/プラットフォームアプリケーション名

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?