お久しぶりです。
ルームクリップ株式会社でエンジニアをしています、仲本です。
当社は、2018-05-02をもちまして、ルームクリップ株式会社になりました。 今後ともなにとぞよろしくお願いいたします。
今回は、RubyのSDKでPinpointを使ったので、ポストしたいと思います。 (ここ最近社内でWEBアプリケーションの言語はRubyで統一しようという流れになっているのもあり)
やること
- PUSH通知対象のJSONを作成
- S3にJSONをアップロード
- セグメントを作成
- キャンペーンを作成
- PUSH送信
PUSH通知対象のJSONを作成
Pinpointでは、セグメントに登録するエンドポイント(device_tokenとかの事ですね)をJSON形式でS3にアップロードしておいて、それをセグメント作成時に読み込ませる事が出来ます。
サンプルとして次のようなJSONを作成します。
xxxxxxxxxxxにはテスト端末のdevice token(iOS)もしくはregistration id(Android)を入力してください。
test.json
{"ChannelType":"APNS","Address":"xxxxxxxxxxx","Demographic":{"Platform":"iOS","Make":"Apple"},"Attributes":{"userName":["taro"]}}
{"ChannelType":"GCM","Address":"xxxxxxxxxxx","Demographic":{"Platform":"Android","Make":"Google"},"Attributes":{"userName":["jiro"]}}
S3にJSONをアップロード
Endpointを固めたJSONをS3にアップロードする処理を追加していきます。
AWS-SDKを使います
Gemfileに追加します
gem 'aws-sdk-s3', require: false
実際に使うソースで読み込みます
require 'aws-sdk'
s3のインスタンス生成
s3 = Aws::S3::Resource.new(
region: 'us-east-1',
credentials: Aws::Credentials.new('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY')
)
JSONをアップロード
こんなエンドポイントになる想定
s3://YOUR_BUCKET_NAME/pinpoint/test.json
file_path = 'test.json'
key = 'pinpoint/test.json'
File.open(file_path, 'rb') do |file|
s3.client.put_object(bucket: 'YOUR_BUCKET_NAME', key: key, body: file)
end
's3://YOUR_BUCKET_NAME/' + key
セグメントを作成
Pinpointインスタンス生成
pinpoint = Aws::Pinpoint::Resource.new(
region: 'us-east-1',
credentials: Aws::Credentials.new('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY')
)
create_import_jobでセグメント作成リクエスト
create_import_jobをすると、AWSコンソールのセグメント一覧にYOUR_SEGMENT_NAMEとして作ったものが出てきます。今回のサンプルは小さいのですぐにインポートが完了します。
pinpoint.client.create_import_job(
application_id: 'YOUR_APPLICATION_ID'
import_job_request: {
define_segment: true,
format: 'JSON',
register_endpoints: false,
role_arn: 'arn:aws:iam::xxxxxxxxxx:role/xxxxxxxxxx',
s3_url: s3_url,
segment_name: 'YOUR_SEGMENT_NAME'
}
)
パラメータ
- application_id
PinpointのProjects一覧にIDが記載されています - define_segment
trueにしてセグメント取り込みで新規作成します - format
JSONとCSVが選べます。今回はJSONです。 - register_endpoints
取り込みと同時にエンドポイントを保存する場合はTRUE - role_arn
S3に読み書き出来るARNを指定 - s3_url
先程アップロードしたS3エンドポイントです。
s3://YOUR_BUCKET_NAME/pinpoint/test.json - segment_name
セグメントに付ける名前
キャンペーンを作成
セグメントが完成したら、セグメントIDを使ってキャンペーンを作成します。
resp = pinpoint.client.create_campaign(
application_id: 'YOUR_APPLICATION_ID',
write_campaign_request: {
holdout_percent: 0,
is_paused: false,
limits: {
daily: 100,
maximum_duration: 60,
messages_per_second: 400,
total: 1000000
},
message_configuration: {
default_message: {
action: 'OPEN_APP', # accepts OPEN_APP, DEEP_LINK, URL
body: '{{Attributes.userName}}さんにお知らせ♪'
},
},
name: 'YOUR_CAMPAIN_NAME',
schedule: {
frequency: 'ONCE', # accepts ONCE, HOURLY, DAILY, WEEKLY, MONTHLY
is_local_time: false,
start_time: (Time.now + 1.minutes).iso8601,
timezone: 'UTC+09'
},
segment_id: 'YOUR SEGMENT ID',
segment_version: 1
}
)
パラメータ
- holdout_percent
PUSHを送信しない確率 - is_paused
停止状態でTRUE - limits
- daily
1日に送信出来る件数 - maximum_duration
キャンペーン終了後に送信出来るようになる時間(秒) - messages_per_second
秒間送信数 - total
最大送信数
- daily
- message_configuration
PUSH通知の内容を定義。APNS、GCMなど細かく分ける事が出来ますが、今回は最低限。
{{Attributes.userName}}はテンプレート変数で、最初に作ったJSONに指定した、メッセージ毎のパラメータ。 - schedule
- frequency
1ショットなのか、どういう頻度で繰り返すのか - is_local_time
時刻のローカライズを行うか - start_time
送信開始日時(iso8601)
今回は1分後に設定 - timezone
タイムゾーン
- frequency
- segment_id
先程作成したセグメントID - segment_version
セグメントに付けられるバージョン。
抽出軸は同じだが抽出するタイミングで変わる類のものの時に使えそう。
PUSH送信
各々のスタイルでPUSHを待つ。
実際にやってみて
- SDKの仕様書ではパラメータの仕様が細かいところまで理解しにくかったため、REST APIの仕様書をよく使いました。
- create_import_jobが完了するまで時間がかかる場合があるため、キャンペーン作成前にwaitした方が良さそうです。
以上となります。ありがとうございました。
参考

この記事を書いた人:仲本
ルームクリップ株式会社のエンジニア 社内SE・サーバーサイド・インフラ周りを中心に担当。 味のあるオッサンを目指して頑張っている。 夜は酒場に居る事が多い。