はじめに
ゲームなみなさんこんにちは、Game Solutions Architect の Leng (@msian.in.japan) と Game Solutions Architect の渡邉 (@nabesh1n) です。
この記事ではモバイルゲームやオンラインゲームといった運営型のゲームにおいて簡単にゲーム分析を始める手段として、Amazon Aurora MySQL と Amazon Redshift の Zero-ETL (※) 統合をご紹介します。
※ ETL とはデータの抽出 (Extract)、変換 (Transform)、ロード (Load) というデータ統合に関わる各プロセスの頭文字を取った用語です。様々なデータソースのデータを分析の中心となるリポジトリにまとめるための一連のプロセスを指しています。ここではゲームのバックエンドシステムのデータベースに存在するデータを抽出し、分析用途に応じて事前に変換を行い、データ分析環境のデータウェアハウスに格納するという一連の処理を ETL 処理としています。
builders.flash メールメンバー登録
AWS for Games

なぜゲーム分析が必要なのか
Zero-ETL 統合を使ったゲーム分析をご紹介する前に、なぜゲーム分析が必要なのかご説明します。ゲームビジネスにおいてゲーム分析が必要となる理由は、ゲームビジネスを成長させ継続的に収益を拡大させるためです。
昨今のゲームビジネスは、「Free-to-play」と呼ばれる基本プレイ無料で、ユーザーが必要に応じて有料のゲーム内アイテムを購入するものや、売り切り型ゲームでも発売後に有料の追加コンテンツを販売するものが多くなっています。
このようなゲームビジネスにおいては、ゲームのリリース後もユーザーを飽きさせないようにサービスとしてゲームを運営し、様々な施策を打ってユーザー規模と収益を維持・拡大していくことが求められます。
すなわち、ゲームをサービスとして運営する中で的確な施策を打つことがゲームビジネスにおいて重要であり、その施策はユーザーのニーズに応えるものでなければなりません。そして、施策を立案するにあたってはゲームプランナーのひらめきや経験則に基づいたアイディアも重要ですが、同時に現在のユーザーの動向を正確に把握しユーザーのニーズに対する正しい仮説を立てることも重要です。そこで、ゲーム分析を導入することでデータを元にゲームビジネスの現状を正しく把握し、求められる施策についてより確度の高い仮説を立てることができます。
また、ゲーム分析は一度きりの取り組みではなく、ゲームの運営が続く限り継続して取り組んで、ゲームビジネスの発展とともに成長させていくことが望ましいです。
ゲームの収益を拡大させるサイクル
図はゲーム分析を導入しデータ活用の拡大とともにゲームの収益を拡大させるサイクルを示したものです。
ゲームからデータを収集し、データに基づいてゲームデザインやビジネス面の改善につながる仮説を立て、より優れたゲーム体験を作り出すことでより多くのユーザーを獲得し、より多くのユーザーからデータを得て次の改善に繋げる、というサイクルを回してゲームビジネスの規模と収益を拡大していくことが理想的なゲームビジネスとデータ活用の関係となります。
しかし、実際にはこのようなサイクルを回し始めるためにデータ分析の仕組みを取り入れることのハードルが高く、なかなかゲーム分析を始めることができないことも多いかと思います。
そこで、今回はデータベース上にあるデータの分析を簡単に始めるための方法として、 Amazon Aurora MySQL と Amazon Redshift の Zero-ETL 統合をご紹介します。

Amazon Aurora MySQL と Amazon Redshift の Zero-ETL 統合
モバイルゲームやオンラインゲームといった運営型のゲームではゲームクライアントから API 越しに接続されるバックエンドシステムが存在し、そのバックエンドシステムのデータベースにユーザーの様々なデータが保存されているかと思います。
そして、データベースに保存されているデータを分析するとなると、本番データベースの分析系統を用意しデータ分析の要求がある度に SQL に熟達したエンジニアがその分析系統のデータベースに対してクエリを発行する運用が発生するかと思います。あるいはバックエンドシステムと分離されたデータ分析環境を用意し、その間を繋ぐデータパイプラインを構築して ETL 処理を行うことで、データベースに保存されているデータをデータ分析環境に転送しデータ分析をすることが考えられます。
しかし、本番データベースの分析系統にクエリを発行する場合は本番データベースに影響を与えないように細心の注意を払う必要があり、独立した分析環境を用意するためには複雑なデータパイプラインの構築と運用に多くのコストがかかります。
そこで、今回ご紹介する Amazon Aurora MySQL と Amazon Redshift の Zero-ETL 統合を使うことで、バックエンドシステムのデータベースに保存されているデータがそのまま Amazon Redshift にコピーされることとなり、お客様はデータベースとデータ分析環境の間でデータを転送するデータバイプラインの構築や運用をすることなく、すぐにデータ分析をはじめることができます。
それでは、ゲーム内アイテムの売上データを模したサンプルデータを Amazon Aurora MySQL データベースに保存し、Amazon Redshift Serverless と Zero-ETL 統合をして Amazon Redshift Serverless 上でデータ分析を試してみましょう。
※2023 年 9 月 1 日現在、Zero-ETL 統合は Public Preview で提供されています。
us-east-1, us-east-2, us-west-2, ap-northeast-1, eu-west-1 のいずれかのリージョンでご利用ください。
※Public Preview における制約事項は下記ページに詳細が記載されております。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/zero-etl.html#zero-etl.reqs-lims

1. Amazon Aurora MySQL の準備
2. Amazon Redshift Serverless の準備
3. IAM ポリシーの作成
Zero-ETL 統合を使用するためには専用の IAM ポリシーを作成する必要があります。
AWS コンソールから IAM コンソール を開き、以下の内容で新規ポリシーを作成します。
- {region} : 使用リージョンのコード
- {account-id} : ご利用中の AWS アカウント ID
- {source-cluster} : 先ほど作成した Amazon Aurora MySQL クラスターのクラスター識別子
- {namespace-uuid} : 先ほど作成した Amazon Redshift Serverless の名前空間 ID
新規ポリシーを作成
以下の JSON をポリシーエディタに貼り付けます。
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"rds:CreateIntegration"
],
"Resource": [
"arn:aws:rds:{region}:{account-id}:cluster:{source-cluster}",
"arn:aws:rds:{region}:{account-id}:integration:*"
]
},
{
"Effect": "Allow",
"Action": [
"rds:DescribeIntegration"
],
"Resource": ["*"]
},
{
"Effect": "Allow",
"Action": [
"rds:DeleteIntegration"
],
"Resource": [
"arn:aws:rds:{region}:{account-id}:integration:*"
]
},
{
"Effect": "Allow",
"Action": [
"redshift:CreateInboundIntegration"
],
"Resource": [
"arn:aws:redshift-serverless:{region}:{account-id}:namespace/{namespace-uuid}"
]
}]
}
ポリシーのアタッチ
IAM ポリシーが作成されたら現在利用している IAM ロール / ユーザーにアタッチします。
4. Zero-ETL 統合の作成
5. サンプルデータの追加と Amazon Redshift での分析
以下の SQL とスクリプトを実行してゲーム内アイテムの売上データを模したサンプルデータをデータベースに追加します。
データベースへの接続
データベースにアクセスできたら以下の SQL を実行し、products テーブルと payments テーブルを作成します。
CREATE DATABASE sampledb;
CREATE TABLE sampledb.payments (
id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
order_id varchar(255),
platform_product_id varchar(255),
purchase_time int,
purchase_state int
);
CREATE TABLE sampledb.products (
id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
platform_product_id varchar(255),
price int
);
サンプルデータについて
今回のサンプルでは AppStore や GooglePlay、Steam などのゲーム配信プラットフォームにおける有料アイテムの購入データを模したデータを payments テーブルに保存し、それらの有料アイテムの価格情報を products テーブルに保存します。
PyMySQL のインストール
テーブルの作成が完了したら、以下のコマンドでスクリプトの実行に必要な PyMySQL をインストールします。
pip install PyMySQL
サンプルデータの追加
PyMySQL がインストールできたら、スクリプトを実行しサンプルデータを追加します。
import pymysql.cursors
import random
import uuid
import time
PAYMENT_RECORDS_NUM = 1000
PURCHASE_STATE_LIST = [
0, # 決済待ち
1, # 決済済み
2 # 上記以外の例外的な決済状態
]
PLATFORM_PRODUCTS = [
["item_1", 100],
["item_2", 200],
["item_3", 300],
["item_4", 400]
]
platform_product_ids = list(map(lambda x: x[0], PLATFORM_PRODUCTS))
connection = pymysql.connect(
host = "{Aurora MySQL ライターエンドポイント}",
user = "{DB ユーザー名}",
password = "{DB パスワード}",
database = "sampledb",
cursorclass = pymysql.cursors.DictCursor
)
with connection:
with connection.cursor() as cursor:
sql = "INSERT INTO products (platform_product_id, price) VALUES (%s, %s)"
cursor.executemany(sql, PLATFORM_PRODUCTS)
current_timestamp = int(time.time())
payments = []
for i in range(PAYMENT_RECORDS_NUM):
order_id = uuid.uuid4()
platform_product_id = random.choice(platform_product_ids)
purchase_time = random.randint(current_timestamp - 86400, current_timestamp)
purchase_state = random.choices(PURCHASE_STATE_LIST, [1, 100, 1])
payments.append([order_id, platform_product_id, purchase_time, purchase_state])
sql = "INSERT INTO payments (order_id, platform_product_id, purchase_time, purchase_state) VALUES (%s, %s, %s, %s)"
cursor.executemany(sql, payments)
connection.commit()
スクリプトの実行
以下のコマンドでスクリプトを実行します。
python insert_sample_data.py
データの確認

クエリを実行 - products テーブルの確認
以下のクエリを実行し、products テーブルの中身が登録されていることも確認します。
SELECT * FROM sampledb.products ORDER BY id;

クエリを実行 - payments テーブルの確認
以下のクエリを実行し、payments テーブルの中身が登録されていることも確認します。
SELECT * FROM sampledb.payments ORDER BY id;

売上を集計
ここからは実際の分析を想定して簡単な集計を行ってみます。
まず以下のクエリで商品別の売上を集計します。

商品別の売上を集計
クエリ
SELECT sampledb.products.platform_product_id, SUM(sampledb.products.price)
FROM sampledb.payments, sampledb.products
WHERE sampledb.payments.platform_product_id = sampledb.products.platform_product_id
AND sampledb.payments.purchase_state = 1
GROUP BY sampledb.products.platform_product_id
ORDER BY sampledb.products.platform_product_id;
集計グラフ
サンプルデータの生成において、payments テーブルの内容は購入された商品、決済ステータス (purchase_state) はランダムなものとなっているため集計結果の数値は画像とは異なるかと思いますが、商品別の売上の合計値が集計できているかと思います。
Redshift query editor v2 では集計した結果をそのままグラフ化することができ、Result 1 (集計結果タブ) の右側にある Chart と書かれたトグルを on にします。
するとグラフが表示されますので、Type を Bar にし、X を platform_product_id、Y を sum にすると売上の合計値を棒グラフで可視化することができます。

1 時間毎の商品別の売上を集計
そこで、1 時間毎の商品別の売上を集計し、その推移を可視化したいと思います。 以下のクエリを実行します。
SELECT
sampledb.products.platform_product_id,
SUM(sampledb.products.price),
DATE_TRUNC('HOUR', TIMESTAMP 'epoch' + sampledb.payments.purchase_time * INTERVAL '1 second') as purchase_hour
FROM sampledb.payments, sampledb.products
WHERE sampledb.payments.platform_product_id = sampledb.products.platform_product_id
AND sampledb.payments.purchase_state = 1
GROUP BY sampledb.products.platform_product_id, purchase_hour
ORDER BY sampledb.products.platform_product_id, purchase_hour;
出力結果
するとこのような結果が出力されます。

集計グラフ
売上の合計値を可視化した時と同様に Chart を有効にして可視化します。
trace 0 の Type で「Line」を選択し、X に purchase_hour、Y に sum を選択します。
すると商品別の折れ線グラフがまとめて一つの色で出力されるかと思います。

グラフのフィルタリング
これでは商品別の売上の変動を確認することが難しいので、左側の「Transforms」タブをクリックし、「+ Transform」というボタンから「Filter」を選択、Target を platform_product_id、Operator を Include Values、Values を item_1 とします。

フィルタリング結果
すると図のように item_1 のみの時間別売上高の推移を確認することができます。

複数商品のグラフ表示
他の商品の折れ線グラフを追加するためには、Traces のタブから「+ Trace」ボタンをクリックし、新しく作成された trace 1 に trace 0 と同じ設定を行います。
そして Transforms で、trace 1 のタブに対して trace 0 (item_1) と同様の設定をし、Values のみ item_2 とします。
item_3、item_4 についても同様に Trace の作成と Transform の設定を行うと以下のようなグラフが作成されます。

分析の結論
簡単ではありますが、サンプルデータの追加と Amazon Redshift での分析について紹介しました。
このグラフではあくまでランダムに生成された売上データであるため売上の増減から読み取れる情報はほとんどありません。しかし、運営型のゲームにおける実際のデータであれば、例えばゲーム内イベントを開始されたタイミングでそのイベントで有利に働くアイテムの売上が増えたことを観測できたり、その売上の増加が想定通りのものであるか否かを確認することも可能です。
6. リソースの削除
最後に不要になったリソースの削除をしておきましょう。
まず、Amazon RDS コンソールからゼロ ETL 統合を削除します。
そして Amazon Aurora MySQL のデータベースと Amazon Redshift Serverless のワークグループ、名前空間を削除します。
まとめ
Amazon Aurora と Amazon Redshift の Zero-ETL 統合を使うことで Amazon Aurora MySQL データベースに保存されているデータをデータパイプラインを構築することなく Amazon Redshift Serverless にコピーし、すぐにデータ分析をはじめられることをご紹介しました。
これまでデータパイプラインの構築が難しくゲーム分析に取り組むことがなかなかできなかった方や、これからゲーム分析に取り組むことをお考えで、まずデータベース上のデータを分析したいと考えている方のお役に立てば幸いです。
筆者プロフィール

Sheng Hsia Leng
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
ゲーム業界に特化したソリューションアーキテクトとしてお客様を支援しております。
RPG とドット絵ゲームが好きです。オフモードの時はインスタでバイリンガル漫画を投稿しています。

渡邉 真太郎
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト
モバイルゲームの開発会社2社でサーバーサイドエンジニアとして従事し現職。
普段はゲーム業界向けのソリューションアーキテクトとしてゲーム開発に携わるお客様をご支援しております。
Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages