Facebook Twitter Google Maps RSS
Home Webアプリ AWS LambdaとAPI Gatewayを使ってサーバーレスでプッシュ通知を送る
formats

AWS LambdaとAPI Gatewayを使ってサーバーレスでプッシュ通知を送る

こんにちは。陽気なシステム屋のうっちーです。

前回 の続きです。サーバーレスで Web Pushを実現するために APIを 3つ作成しましたので、その実装の中身を解説していきます。

1つ目の APIは GCM (Google Cloud Messaging) の registration Idを受け取って DynamoDBに登録する機能を担います。

AWS Lambdaで書くと

こんな感じでしょうか。この程度であればLambdaなんて使わずに、API Gateway の 「AWS Service Proxy」機能でもまかなえるかもしれません。

 

次に、プッシュ通知送信を受け付ける機能を実装します。これは、通知に表示する内容を DynamoDBに更新する機能と、送信対象の GCM registrationIdの一覧を DynamoDBから取り出し、ループして実際にプッシュ通知を送る機能に分かれています。

Web Pushで単に通知を送るだけでなくデータ(ペイロード)付きで送れるようにするには、送る内容の暗号化(Web Push Encryption)が必要ということらしいのですが、この部分の仕様がまだ策定中らしく GCMでは対応していません。仕方がないので、送りたい内容を DynamoDBに書いておいて、通知を受けた側(Service Worker)で読み出すようにしました。

※ という仕様で実装したら、GCMは「トピック メッセージング」という機能を実装したようです。

https://developers.google.com/cloud-messaging/topic-messaging

上記の例では DynamoDBから取り出した registrationId に対して、一件ずつ curlコマンドを使って GCMにリクエストを投げています。
ここは複数の registrationId に対してまとめてリクエストを投げるように修正した方が良いかもしれません。

また、Node.js の v0.11では同期的にコマンドを実行する execSyncと呼ばれるメソッドがcoreモジュールから提供されているそうなのですが、AWS Lambdaは現状、Node.jsの v0.10.36ランタイムサポートとなっています。仕方がないので、 http://yosuke-furukawa.hatenablog.com/entry/2014/07/26/145814 の方が作られている execsyncs というモジュールを npm install して使用しました。

 

最後に、DynamoDBから通知に表示するメッセージを取り出す APIを実装します。

これも簡単ですね。AWS Service Proxyでも可能かもしれません。

 

このように、AWS LambdaやAPI Gatewayの機能を活用することによって、必要な機能を部品化し、それらをマッシュアップして一つのサービス(Micro Service)を組み立てることができます。

実際には、Lambda Functionから DynamoDBにアクセスするには、必要なテーブルに必要な権限でのみアクセスできるように適切な IAM Roleを作って割り当てる必要がありますし、APIはIPアドレス制限や CORS、OAuth2認証(Cognito Identity)等を使って保護する必要もあります。しかし、使い道によっては非常に簡単にアイデアを実装できる時代になったと言えるのではないでしょうか。

 

※アイエンターではAmazon Web Services(AWS)を用いたサイト構築、ソリューション提案の実績が多数あります。様々なサービスに対する豊富な知見をもとに最適なご提案を行うことが可能です。お気軽にアイエンターへご相談ください!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">