Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法９―サーバー(Amazon SNS：プッシュ通知を配信：HMS Part 1)

# Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法―サーバー(Amazon SNS：プッシュ通知を配信：HMS Part 1)

LambdaとAPI Gatewayで配信用のAPIを作成します。

Lambdaでは、aws-sdkライブラリを使って、DynamoDBに登録したHMSのトークンを取得し、それを対象にして、プッシュ配信内容をAmazon SNSのトピックに送ります。対象のAmazon SNSトピックをトリガーとして、さらに別のLambdaを起動し、プッシュ配信内容をプッシュサーバーに送ります。

### プッシュ配信内容をAmazon SNSのトピックに送るLambdaのサンプル

```javascript:index.js
const PushUtil = require("./pushUtil.js");

exports.handler = function (event, context, callback) {
    const pushUtil = new PushUtil();

    let pushData = event;
    
    const promiseArray = [];

    // Amazon SNSにアクセスするためのPromiseを作成する
    const promise = pushUtil.createHmsPushPromise(pushData.HMS, 'Amazon SNSのトピックのARN');

    promise.then((result) => {
        // レスポンスを返す
        callback(null, result);
    }).catch((error) => {
        callback(null, { error : error });
    });
}
```

```javascript:pushUtil.js
const TokenUtil = require("./tokenUtil.js");

// AWS SDKをロードする
const AWS = require('aws-sdk');
// リージョンを設定する
AWS.config.update({region: 'ap-northeast-1'});

// SNSサービスのオブジェクトを生成
const sns = new AWS.SNS();

module.exports = class PushUtil {

    constructor() {
    }

    createHmsPushPromise(content, topicArn) {
        return new Promise((resolve, reject) => {
            const tokenUtil = new TokenUtil();
            const getTokenPromise = tokenUtil.createGetTokenPromise();
            
            getTokenPromise.then((result) => {
                if (result.hasOwnProperty("Items") && Array.isArray(result.Items)) {
                    content.token = result.Items.map(function(value) {
                        if (value.hasOwnProperty("token") && value.token.hasOwnProperty("S")) {
                            return value.token.S;
                        }
                        return "";
                    });
                }

                // プッシュのパラメータを設定する
                const params = {
                    // プッシュ内容
                    Message: JSON.stringify(content),
                    // 対象トピック
                    TopicArn: topicArn
                };
                
                sns.publish(params, (error, data) => {
                    if (error) {
                        reject(error);
                        return;
                    }
                    resolve(data);
                });
            }).catch((error) => {
                reject(error);
            });
        });
    }
}
```

```javascript:tokenUtil.js
// AWS SDKをロードする
const AWS = require('aws-sdk');
// リージョンを設定する
AWS.config.update({region: 'ap-northeast-1'});

// DynamoDBサービスのオブジェクトを生成
const ddb = new AWS.DynamoDB();

module.exports = class TokenUtil {

    constructor() {
    }

    createGetTokenPromise() {
        return new Promise((resolve, reject) => {
            const params = {
                TableName: 'token_info'
            };
    
            ddb.scan(params, function(error, data) {
                if (error) {
                    reject(error);
                    return;
                }
                resolve(data);
            });
        });
    }
}
```

# GitHub
https://github.com/Rei2020GitHub/MyPublicProject/tree/master/PushDemo(H%2BG)/AWS/Lambda/amazon-sns-demo-send-push-notification

# 参考
<b>Amazon SNSを用いてAndroid(GMSとHMS)とiOSに対応したプッシュ通知の実装方法</b>
[１―概要](https://qiita.com/Rei_2020/items/69b9d9344e6d23dea097)
[２―クライアント(Android-GMS)](https://qiita.com/Rei_2020/items/2f4424cb3a5bbf86abc3)
[３―クライアント(Android-HMS)](https://qiita.com/Rei_2020/items/9d3764fc150e0e7a8014)
[４―クライアント(iOS-APNS)](https://qiita.com/Rei_2020/items/d839753f1514338809f9)
[５―サーバー(Amazon SNS：プッシュトークンの保存)](https://qiita.com/Rei_2020/items/c2ecd5bcd3866fe7d4e4)
[６―サーバー(Amazon SNS：プッシュトークンの管理：HMS)](https://qiita.com/Rei_2020/items/5e1906e3a4d1b737a803)
[７―サーバー(Amazon SNS：プッシュトークンの保存：HMS)](https://qiita.com/Rei_2020/items/6ad6f4ef13d5155cffa7)
[８―サーバー(Amazon SNS：プッシュ通知を配信)](https://qiita.com/Rei_2020/items/6ff3c1b8d3f7f44d27f0)
[９―サーバー(Amazon SNS：プッシュ通知を配信：HMS)](https://qiita.com/Rei_2020/items/40df3519b99c80fdea3d)
[１０―サーバー(Amazon SNS：プッシュ通知を配信：複数のデバイスに同時配信)](https://qiita.com/Rei_2020/items/ee32f3caeff8257097e6)