RoomClip 開発者ブログ

AWS SDK for Ruby V3 Pinpointを試した

お久しぶりです。

ルームクリップ株式会社でエンジニアをしています、仲本です。

当社は、2018-05-02をもちまして、ルームクリップ株式会社になりました。 今後ともなにとぞよろしくお願いいたします。

今回は、RubyのSDKでPinpointを使ったので、ポストしたいと思います。 (ここ最近社内でWEBアプリケーションの言語はRubyで統一しようという流れになっているのもあり)

やること

  1. PUSH通知対象のJSONを作成
  2. S3にJSONをアップロード
  3. セグメントを作成
  4. キャンペーンを作成
  5. 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
      最大送信数
  • message_configuration
    PUSH通知の内容を定義。APNS、GCMなど細かく分ける事が出来ますが、今回は最低限。
    {{Attributes.userName}}はテンプレート変数で、最初に作ったJSONに指定した、メッセージ毎のパラメータ。
  • schedule
    • frequency
      1ショットなのか、どういう頻度で繰り返すのか
    • is_local_time
      時刻のローカライズを行うか
    • start_time
      送信開始日時(iso8601)
      今回は1分後に設定
    • timezone
      タイムゾーン
  • segment_id
    先程作成したセグメントID
  • segment_version
    セグメントに付けられるバージョン。
    抽出軸は同じだが抽出するタイミングで変わる類のものの時に使えそう。

PUSH送信

各々のスタイルでPUSHを待つ。

実際にやってみて

  • SDKの仕様書ではパラメータの仕様が細かいところまで理解しにくかったため、REST APIの仕様書をよく使いました。
  • create_import_jobが完了するまで時間がかかる場合があるため、キャンペーン作成前にwaitした方が良さそうです。

以上となります。ありがとうございました。

参考


この記事を書いた人:仲本

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