どうも、2カ月ぶりですね。自分に甘いエンジニア、黒砂糖です。

iPhoneアプリを作ってみて驚いた事の一つに、プッシュ通知の効果の高さがあります。受け取る側としては軽く見てたし、うざいなーくらいに思っていました。でもこれ、アプリを思い出してもらったり、狙ったタイミングで狙った物を見てもらったり、アプリを使い続けてもらうにはすごく有効なんですね。

そんな便利なプッシュ通知なのですが、実際に思い通りに送るのは大変です。タイミングを調整したり、狙った相手にだけ送ったり、しかもそれらをユーザーが増えたとしても滞りなく行える必要があります。

そこで、今日はそのプッシュ通知をきちんと送るために便利なAmazon SNSを少しだけご紹介します。

もくじ

  1. Amazon SNSって何
  2. Amazon SNSの良いところ
  3. Amazon SNSでできないこと
  4. Amazon SNSの使いどころ
  5. まとめ

Amazon SNSって何

AWSのひとつ、Amazon Simple Notification Serviceというプッシュメッセージングサービスです。

iOSやAndroidの”プッシュ通知”の他、同じAWSのAmazon SQSへ通知を飛ばす事もできます。他にもSMSやEメールによる通知にすら対応しています。

Amazon SNSの良いところ

AWSである

まず第一に、AWSのひとつなのでほかのAWSとの連携や管理運用が楽という点があります。

他にS3やEC2などを使っていれば請求をまとめたりできますし、S3とAmazonSNSだけ使える権限、みたいなアクセスコントロールもAWS内であれば柔軟に可能です。

速度が速い

次に速度が速いという点です。リクエストを投げるとAmazonSNS側で並列実行して再試行とかもやってくれるため、ApnsPHPとかを使って自前で送信して結果を待ちつつ再試行、なんていうことをするよりも早く処理を追える事ができるでしょう。

また、後述するトピックという概念を持っています。これを利用することで1リクエストで大量の通知を一度に送る事ができます。件数が増えてくればリクエストそのものにかかる負荷もバカにできませんから、1リクエストで大量のプッシュ通知が行えることは速度上でも大きな利点になります。

価格が安い

また価格の安さも大きな魅力です。100 万件送信するたびに1ドル、という価格で配信が可能です。(リクエスト0.5ドル+通知配信0.5ドル)

これも従量課金のため、初期費用0で実際使った分だけ支払えば良いです。そのため固定費を無駄にすることも、逆に小さいプランのせいで上限に悩まされてここぞで使えない、スケールしづらいなんて事もありません。

しかもAmazon SNS リクエストのうち、毎月最初の 100 万件は無料とされています。
参考リンク:
Amazon SNS 料金表

“トピック”

さて、さきほどちらっと触れたトピックですが、1リクエストで複数の送信先へ一括送信できます。さらにこのトピックは種類をまたいでの一括送信が可能です。つまり、AndroidとiOSに1リクエストで同時送信できることになります。

これにはAmazonSQSのキューへ配信やメール送信まで含める事が可能で、「AndroidとiOSのユーザーに通知しつつSQSでバッチ処理を追加して、その発動をエンジニアにメールする」なんて事が1リクエストで終わらせる事すら出来てしまいます。

以前はトピックには1トピックにつき10,000箇所までしか送れないという制限があったようなのですが、最近はこの制限が1トピックあたり1,000万にまで増加したようです。またトピック数に関してはAWS アカウントにつき最大 3,000 トピックまでの制限があるそうです。これらの制限は引き上げもリクエストできるようなので、よほど急激な大ヒットでもしない限り安心ですね。

参考リンク:
Amazon SNSのトピック数と受信者数
Amazon SNS よくある質問

その他

その他にも登録したtokenの有効、無効をチェックしてくれる機能もあります。無効になったtokenには送信しない。手動で有効無効も設定できます。
配信数やリクエストのサイズ、配信失敗数なんかはAmazon CloudWatchで確認が可能です。投げっぱなしで終わらないのも良いですね。

あとは、SDKがきちんと用意してあって使いやすいという点も個人的にはうれしかったです。しかもこれ、AWSのSDKという扱いなので他にS3を使っている、とかでもまとめて使えるので便利です。

Amazon SNSでできないこと

逆にAmazon SNSといえども出来ない事ももちろんあります。

時間や条件を指定して自動的に配信する

例えば予約配信や条件設定による自動配信はAmazon SNSでは行う事ができません。Amazon SNSはリクエストを受けたらすぐに通知の配信を開始してしまいます。

もっとも、この点は自前でサーバーを持っていればcron等を設定して、特定の時間や条件でリクエストを投げるようなプログラムを用意すれば良いだけです。シンプルアプリではサーバー側を用意することは少ないと思いますが、ちょっとした規模のアプリであればサーバーも用意されているのではないでしょうか?

配信した結果を観察する

また、送信履歴からなにかを分析したり、プッシュ通知の有無でユーザーをセグメントして次のプッシュ通知を調整するようなこともAmazon SNS単体では出来ません。Amazon CloudWatchで結果を確認することはできるものの、ここでわかるのはあくまでも配信した数であって、ユーザーがそれにどう反応したのかはこれだけでは知る由もありません。

しかしこの問題も、アプリ側になんらかの行動解析ツールを導入したり、なにか自前でデータを取得できるようになっていればなんの問題も無いのです。弊社の場合別途解析ツールをすでに導入済みだったため、そちらでプッシュ通知に対して起こしたアクションもあらたに計測させることでこの点をカバーしました。

Amazon SNSの使いどころ

他の選択肢との比較すると

自前でプッシュ通知を送信することは、追加のコストが必要無いかもしれませんが、とても手間のかかる事です。また将来スケールさせる事も考えると、突発的な負荷まで完璧に読み切って適切な環境を揃える事は並大抵の事ではできません。

一方でPushwooshのようなプッシュ通知解析・配信サービスは自前で環境を用意しなくて良いのでその辺は考える必要がありません。しかし高度な解析や解析やセグメント機能を使わない場合でもその分が加味されて費用が高くなることがあります。

その点Amazon SNSでは自前では難しいスケール性と、高い可用性を得ることができます。外部サービスと比較すればリッチな機能は無いかもしれませんがその代わりに低価格で利用することができます。ある種プッシュ通知を送る事に割り切って特化させたサービスだと考える事ができるでしょう。

アプリの規模やステージで考えると

Amazon SNSは単純な外部サービスに比べ開発は多少必要になります。ですがそれは完全に自前で実装する場合に比べれば少ない手間で済むでしょう。

よって初期の開発リソースが惜しいタイミングだとか、そんな気合い入れて解析にリソースをかけたく無いような小粒のアプリに関しては扱いづらい物でしょう。

一方で、長期的にガッツり調整して使い続けるようなアプリに関してはこの開発工数は欠点とは言い切れないと思います。むしろ利用する外部サービス(プッシュ通知・解析・実行環境)に重複が無くなり無駄が少なくなるのではないでしょうか?

まとめ

自前である程度のことができる場合、ユーザー数等に応じてスケールさせたいような部分だけ外部化して容易に低価格でスケールできる。かゆいところに手が届くAmazon SNSをぜひ活用しましょう!