【AWS】AmazonSNSをRubyスクリプトから叩いてプッシュ通知をしてみる

  • Pocket
  • このエントリーをはてなブックマークに追加
  • 162 follow us in feedly

まえがき

最近iPhoneアプリのプッシュ通知を色々と試しているのですが、今回はAWSのサービスの一つであるAmazonSNS(Amazon Simple Notifier Service)を使ってみました。

サーバーサイドからAWSのAPIを叩いてプッシュできるようにすると色々やりたいことができるので、簡単例をメモシておこうと思う。

事前準備・検証環境

事前準備としては、あたりまえだけど、AWSのアカウントと取って、AmazonSNSをアクティブにしておく必要がある。あと、AmazonSNSのアプリケーションも作成しておく。

あと、APIを叩くのにアクセスキーとシークレットキーが必要になるので取得しておく。

今回試してみた環境は

  • OS MacOSX
  • Ruby 2.1
  • aws-sdk 1.32.0
  • 通知先クライアント iPhone

必要なGemをインストール

必要なGemというか『aws-sdk』が必要。このSDKひとつでAWSのインスタンスをいじりたおせるからすごい。

gem install aws-sdk

サンプルコード

AmazonSNSクライアントのインスタンス作成

まず、アクセスキーとかで認証まわりをおわらせてSNSのクライアントインスタンスを作る

aws.ymlみたいな設定ファイルでアクセスキーとか書いておく。

development:
    access_key_id: YOUR_ACCESS_KEY_ID
    secret_access_key: YOUR_SECRET_ACCESS_KEY
    region: YOUR_REGION

test:
    access_key_id: YOUR_ACCESS_KEY_ID
    secret_access_key: YOUR_SECRET_ACCESS_KEY
    region: YOUR_REGION

production:
    access_key_id: YOUR_ACCESS_KEY_ID
    secret_access_key: YOUR_SECRET_ACCESS_KEY
    region: YOUR_REGIONuire

ほいでこの設定ファイルを読み込んでインスタンス作成。

require 'yaml'
require 'aws-sdk'

AWS.config(YAML.load_file('./aws.yml')['development'])

sns = AWS::SNS.new
client = sns.client

端末にプッシュする

端末にプッシュするには『ターゲットのEndpointArn』と『メッセージ』を渡す必要がある。なのでこんなかんじになる。

client.publish(
  target_arn: 'arn:aws:sns:ap-northeast-1:88984761446294:endpoint/APNS_SANDBOX/memoblog.ios.development/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  message: 'from amazon sns'
)

エンドポイントを作成してプッシュする

上記のプッシュ例では予めエンドポイントを登録しておく必要があるので実用的ではない。なので今回はエンドポイントを作成して、その作成したエンドポイントにプッシュする

エンドポイントを作成するには『PlatformApplicationArnの文字列』と『クライアントアプリのユーザートークン』が必要になる。

# 存在しない場合は作成する
response = client.create_platform_endpoint(
  platform_application_arn: 'arn:aws:sns:ap-northeast-1:477336294:app/APNS_SANDBOX/memoblog.ios.development/xxxxxxxxxxxxxxxxxx',
  token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx8b6b0831eee34585'
)

# endpointを取得して通知を送る
endpoint_arn = response[:endpoint_arn]
client.publish(
  target_arn: endpoint_arn,
  message: 'from amazon sns create endpoint'
)

これでOK。ユーザートークンが既に存在する場合は新しく追加されることはない。ただエンドポイントはちゃんと取得できるので。既にユーザートークンが登録されているかをチェックする必要がない。

特定アプリのエンドポイントをすべて取得して全端末にプッシュ

最後は特定のアプリに登録されているエンドポイント(端末)すべてにプッシュつ通知をしてみる。結構利用するケースがあると思う。

『list_endpoints_by_platform_application』でエンドポイントを取得できる

ただ、エンドポイントの数によっては捌ききれるのか不安。

# 特定のアプリのEndpointを全て取得して、すべての端末にプッシュ通知
endpoints = client.list_endpoints_by_platform_application(
  platform_application_arn: 'arn:aws:sns:ap-northeast-1:8655647334984994:app/APNS_SANDBOX/xxxxxxxxxxxxxxxxx',
)
endpoints[:endpoints].each do |endpoint|
  client.publish(
    target_arn: endpoint[:endpoint_arn],
    message: 'yahooooooooooooo!!'
  )
end

ちなみに登録されているアプリをすべて取得するには『list_platform_applications』メソッドで取得できる。

おすすめ書籍

Amazon Web Services クラウドデザインパターン実装ガイド
大澤 文孝
日経BP社
売り上げランキング: 3,774

関連記事

rails runnerでRailアプリのバッチスクリプトを作る。

まえがき Railsで開発している時にちょっとしたバッチスクリプトな...

記事を読む

403711327265

Rubyのポケモン図鑑をバージョンアップ&バグ修正しました。

まえがき 最新版の情報はこちら!! [browser-shot u...

記事を読む

Railsアプリをクロスドメインに対応したAPIサーバーにする

まえがき 外部に立てたRailsのサーバーをAPIサーバー化して、ロー...

記事を読む

はじめてのHaml、インストールから基本構文まとめ

まえがき Hamlを使ってみよう!ということで今回はインストールから...

記事を読む

半沢直樹gemを公開しました。

まえがき 先日、はじめてGemを公開してみました。 サンプル用に半...

記事を読む

新着記事

no image

PHPでRubyのirbっぽいインタラクティブなスクリプトが実行できる「boris」

まえがき PHPでもRubyのirbみたいなことがしたくて探してみたと...

記事を読む

2015年の抱負と去年の振り返り〜よちよちWEB業界1年経験して〜

まえがき あけましておめでとうございます。今年もどうぞよろしくお願いし...

記事を読む

Java SE 7 Bronze試験(1Z0-802)を受けてきました

まえがき 以前から少し受けてみたかった試験『Java SE 7 Bro...

記事を読む

HubotでJenkinsのジョブを実行する

まえがき HubotをつかってJenkinsのジョブをじっこうしてみた...

記事を読む

no image

Hubotをforeverでデーモン化する

まえがき 今回はHubotをforeverを使ってデーモン化してみた時...

記事を読む

スポンサーリンク

  • Sorry. No data so far.

PAGE TOP ↑