Amazon Mobile Analytics が Redshift への自動エクスポートに対応しました!
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」を選択します(または歯車マークから設定画面を開きます)。
アプリ設定画面でアプリの一覧が表示されるので、自動エクスポートしたいアプリのチェックボックスを有効化し「Enable Auto Export」をクリックします。
次に、自動エクスポート先を選択する画面が表示されます。「Amazon Redshift + Amazon S3」の「Get Started」をクリックします。
次に S3 と Redshift を連係させる設定画面が表示されます。今回の機能のメインディッシュですね。
各設定値の詳細は下記の通りです。
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分程度)。
Redshift クラスタの作成完了すると、次のように S3 + Redshift の自動エクスポートが有効化されていることが分かります。
また、Redshift の管理画面を開くと、Redshift クラスタが正常に起動していることが確認できます。
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 を見てみると、自動エクスポートのためのクエリが実行されていることが確認できます。
また、格納したデータは 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 クラスタを作成し起動してくれるので、とってもお手軽に始めることが出来ます。あとは煮るなり焼くなり自由自在ですね!皆さんもぜひ試してみてください。