Amazon Mobile Analytics が Redshift への自動エクスポートに対応しました!

2015.03.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Redshift への自動エクスポートに対応

本日、Amazon Mobile Analytics で Redshift への自動エクスポートに対応するアップデートがリリースされました!

これまでは S3 バケットに対しての自動エクスポートしか利用できなかったため、こちらに書かれているような方法で実現する必要がありました。今回のアップデートにより Redshift までサポートされたため、簡単に自動エクスポートできるようになりました。

ということで本記事では、Redshift への自動エクスポート機能を早速使ってみたいと思います。

事前に必要なこと (Mobile Analytics の初期設定)

Mobile Analytics を利用するためには、AWS Management Console から Mobile Analytics App の作成、モバイルアプリ側への AWS Mobile SDK の組み込みが必要です。Mobile Analytics の導入方法については以下の記事にまとめていますので、こちらをご参照ください。

Redshift への自動エクスポートを有効にする

Mobile Analytics の初期設定が済んだら、いよいよ Redshift への自動エクスポートを有効化できます。まず AWS Management Console の Mobile Analytics のダッシュボード画面のアプリ切り替えドロップダウンメニューから「Auto Export to S3/Redshift」を選択します(または歯車マークから設定画面を開きます)。

mobile-analytics01

アプリ設定画面でアプリの一覧が表示されるので、自動エクスポートしたいアプリのチェックボックスを有効化し「Enable Auto Export」をクリックします。

mobile-analytics02

次に、自動エクスポート先を選択する画面が表示されます。「Amazon Redshift + Amazon S3」の「Get Started」をクリックします。

mobile-analytics03

次に S3 と Redshift を連係させる設定画面が表示されます。今回の機能のメインディッシュですね。

mobile-analytics04

各設定値の詳細は下記の通りです。

Configure an Amazon S3 bucket

出力する S3 バケットの設定です。このウィザード内で新規作成するか、既存バケットを利用するか選択できます。

IAM Role Information

S3 と Redshift への自動エクスポートで使用する IAM Role を設定(または新規作成)します。「Amazon S3 access role」は Mobile Analytics のサービスが S3 に自動エクスポートするとき、「Amazon S3 to Redshift access role」は S3 に格納したファイルを元に Redshift に自動エクスポートするときに使われます。

Amazon S3 access role は以下のような IAM Role が必要です。

{
  "Statement": [
    {
      "Resource": [
        "arn:aws:s3:::mobile-analytics-12-31-2014-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "arn:aws:s3:::mobile-analytics-12-31-2014-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/*"
      ],
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectVersionAcl"
      ],
      "Effect": "Allow"
    }
  ],
  "Version": "2012-10-17"
}

続いて、Amazon S3 to Redshift access role は以下のような IAM Role が必要です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Resource": [
        "arn:aws:s3:::mobile-analytics-12-31-2014-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "arn:aws:s3:::mobile-analytics-12-31-2014-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/*"
      ],
      "Action": [
        "s3:ListBucket",
        "s3:GetObject"
      ],
      "Effect": "Allow"
    },
    {
      "Resource": [
        "*"
      ],
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Effect": "Allow"
    },
    {
      "Resource": [
        "arn:aws:logs:*:*:*"
      ],
      "Action": [
        "logs:*"
      ],
      "Effect": "Allow"
    },
    {
      "Resource": [
        "arn:aws:s3:::mobile-analytics-12-31-2014-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/jsonpaths/*"
      ],
      "Action": [
        "s3:PutObject*"
      ],
      "Effect": "Allow"
    }
  ]
}

Configure Auto Export to Amazon Redshift

Redshift の設定情報です。このウィザード内で Redshift の自動エクスポートを設定すると、Mobile Analytics は CloudFormation テンプレートを利用して Redshift クラスタ (EC2) を起動します。ここでセットした設定値を元に CloudFormation テンプレートが生成されます。

Master User Password

Redshift クラスタへのすべての権限を持ったユーザー (master) のパスワードです。

Read User Password

Redshift クラスタへの読み取り権限を持ったユーザー (eventreader) のパスワードです。

Custom Events Attributes & Metrics (Optional)

Mobile Analytics で扱うイベントはカスタムの属性(またはメトリクス)を利用することが出来ますが、カスタム属性またはメトリクスをセットしている場合、そのキーをこの欄に列挙する必要があります。各キーはカンマ区切り(または改行区切り)で入力します。

CloudWatch Metrics & Logs (Optional)

CloudWatch を利用して S3 及び Redshift への自動エクスポートをモニタリングしたい場合、チェックを入れます。

Advanced Options

拡張設定です。

IP Access Rule

Redshift クラスタにアクセス可能にする IP アドレスを指定します。

Port Number

Redshift クラスタにアクセスするポート番号を指定します。

Load User Password

S3 から Redshift のデータを読むためのユーザー (etl_user) のパスワードを指定します。デフォルトでセキュアなパスワードが自動生成されていますが、自分で入力することも出来ます。

Amazon EC2 Key Pair

Redshift クラスタの EC2 インスタンスに SSH 接続するときに使用するキーペアを指定します。キーペアは事前に作成しておく必要があります。

ここまでの設定が終わったら「Create Export」をクリックします。すると、Redshift クラスタの作成が始まります。少し時間がかかります(15分〜20分程度)。

mobile-analytics05

Redshift クラスタの作成完了すると、次のように S3 + Redshift の自動エクスポートが有効化されていることが分かります。

mobile-analytics06

また、Redshift の管理画面を開くと、Redshift クラスタが正常に起動していることが確認できます。

mobile-analytics07

Mobile Analytics から自動生成される Redshift クラスタのスペックは下記の通りです。

Cluster Properties

Cluster Type Single Node
Node Type dw2.large
Nodes 1

Capacity Details

CPU 7 EC2 Compute Units (2 virtual cores) per node
Memory 15 GiB per node
Storage 160GB SSD storage per node
I/O Performance Moderate
Platform 64-bit

自動エクスポートが正常に動作しているか確認してみましょう。Queries を見てみると、自動エクスポートのためのクエリが実行されていることが確認できます。

mobile-analytics08

また、格納したデータは psql などのような PostgreSQL 管理ツールを使って確認することができます。

events=# SELECT * FROM AWSMA.event;
   event_type   |     event_timestamp     |    arrival_timestamp    | event_version |        application_app_id        |           application_package_name           | application_version_name | application_version_code | application_title |      application_cognito_identity_pool_id      | application_sdk_name | application_sdk_version |              client_id               |               client_cognito_id                | device_model | device_make | device_platform_name | device_platform_version | device_locale_code | device_locale_language | device_locale_country |              session_id              | session_start_timestamp | session_stop_timestamp  | monetization_transaction_id | monetization_transaction_store | monetization_transaction_item_id | monetization_transaction_quantity | monetization_transaction_price_reported | monetization_transaction_price_amount | monetization_transaction_price_currency_code | monetization_transaction_price_currency_symbol | a_button | m_launchcount 
----------------+-------------------------+-------------------------+---------------+----------------------------------+----------------------------------------------+--------------------------+--------------------------+-------------------+------------------------------------------------+----------------------+-------------------------+--------------------------------------+------------------------------------------------+--------------+-------------+----------------------+-------------------------+--------------------+------------------------+-----------------------+--------------------------------------+-------------------------+-------------------------+-----------------------------+--------------------------------+----------------------------------+-----------------------------------+-----------------------------------------+---------------------------------------+----------------------------------------------+------------------------------------------------+----------+---------------
 _session.start | 2015-03-04 01:50:23.192 | 2015-03-04 01:50:44.618 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:50:23.187 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 Button         | 2015-03-04 01:50:23.193 | 2015-03-04 01:50:44.618 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:50:23.187 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 _session.start | 2015-03-04 01:50:43.253 | 2015-03-04 01:50:44.618 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:50:43.248 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 Button         | 2015-03-04 01:50:43.254 | 2015-03-04 01:50:44.618 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:50:43.248 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 _session.start | 2015-03-04 01:51:57.662 | 2015-03-04 01:51:59.002 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:51:57.657 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 Button         | 2015-03-04 01:51:57.663 | 2015-03-04 01:51:59.002 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:51:57.657 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 _session.stop  | 2015-03-04 01:53:02.832 | 2015-03-04 01:53:04.307 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:51:57.657 | 2015-03-04 01:52:57.643 |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 _session.start | 2015-03-04 01:54:30.221 | 2015-03-04 01:54:53.903 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:54:30.215 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 _session.start | 2015-03-04 01:54:52.604 | 2015-03-04 01:54:53.903 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:54:52.60  |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 Button         | 2015-03-04 01:54:52.605 | 2015-03-04 01:54:53.903 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:54:52.60  |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 _session.stop  | 2015-03-04 01:56:45.823 | 2015-03-04 01:56:46.934 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 01:54:52.60  | 2015-03-04 01:56:40.767 |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 _session.start | 2015-03-04 02:09:43.884 | 2015-03-04 02:09:45.304 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0.0                    | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.15                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 02:09:43.879 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 Application    | 2015-03-04 02:09:43.886 | 2015-03-04 02:09:45.304 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0.0                    | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.15                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 02:09:43.879 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 _session.start | 2015-03-04 05:33:02.11  | 2015-03-04 05:33:06.201 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 05:33:02.104 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
 Button         | 2015-03-04 05:33:02.112 | 2015-03-04 05:33:06.201 | 3.0           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | jp.classmethod.sample.Sample                 | 1                        | 1.0                      | Unknown           | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | aws-sdk-iOS          | 2.0.14                  | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | iPod touch   | apple       | iPhone OS            | 8.1.3                   | ja_JP              | ja                     | JP                    | xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxxx | 2015-03-04 05:33:02.104 |                         |                             |                                |                                  |                                   |                                         |                                       |                                              |                                                |          |              
(15 rows)

ツールについて詳しくは以下をご覧ください。

まとめ

Mobile Analytics から簡単な設定を行うだけで Redshift クラスタを作成し起動してくれるので、とってもお手軽に始めることが出来ます。あとは煮るなり焼くなり自由自在ですね!皆さんもぜひ試してみてください。

参考