DynamoDB Streamを使った リアルタイム分析 
クラスメソッド株式会社 
横田 慎介 
classmethod.jp 
1 
DEVIO-MTUP11-TOKYO-009 
2014/12/16
DynamoDB Stream(Preview) 
•テーブルの更新ログ 
–MySQLのbinlogのようなもの 
•更新内容をリアルタイムに取得できる 
classmethod.jp 
2
リアルタイム分析 
classmethod.jp 
3 
Amazon Lambda
DynamoDB 
•NoSQLデータベース 
•スキーマレス 
–ユーザ定義プライマリキー + 任意の項目 
classmethod.jp 
4
DynamoDBテーブル例 
classmethod.jp 
5 
user_id 
created_at 
action 
means 
points 
0 
1418638175 
register 
0 
1418638260 
get_point 
tutorial 
100 
1 
1418642914 
register 
user_history
DynamoDBテーブル作成 
classmethod.jp 
6
DynamoDB Stream 
classmethod.jp 
7
DynamoDB Stream有効化 
classmethod.jp 
8
DynamoDB Stream 
classmethod.jp 
9
DynamoDBアイテム登録 
classmethod.jp 
10 
{“user_id”: “0”, 
“created_at”:1418638175, 
“action”: “register”}
DynamoDB Streamレコード 
{ 
"Records": [ 
{ 
"awsRegion": "us-east-1", 
"dynamodb": { 
"Keys": 
{ 
"user_id" : { "S": "0" }, 
"created_at" : { "N": "1418638175" } 
}, 
"NewImage": 
{ 
"user_id" : { "S": "0" }, 
"created_at" : { "N": "1418638175" }, 
"action" : { "S": "register" } 
}, 
"SequenceNumber": "3758000000000000010265650", 
"SizeBytes": 62, 
"StreamViewType": "NEW_AND_OLD_IMAGES" 
}, 
"eventID": ” cae695c863e891e573b710d101d4a72a", 
"eventName": "INSERT", 
"eventSource": "aws:dynamodb", 
"eventVersion": "1.0" 
} 
] 
} 
classmethod.jp 
11 
DynamoDB更新情報 
イベント情報
DynamoDB Streamレコード 
"NewImage": 
{ 
"user_id" : { "S": "0" }, 
"created_at" : { "N": "1418638175" }, 
"action" : { "S": "register" } 
}, 
classmethod.jp 
12
LambdaでレコードをNorikraへ 
classmethod.jp 
13 
Amazon Lambda
Lambda(Preview) 
•コード実行サービス 
–イベントを検知し、 
–Lambda Functionを実行する 
•処理すべきイベント数に応じて自動でス ケール 
classmethod.jp 
14
Lambda 
classmethod.jp 
15 
①Lambda Functionの登録 
②DynamoDB Streamをイベントソースと して登録 
① 
②
Lambda Function 
classmethod.jp 
16
Lambda Function作成 
classmethod.jp 
17
Lambda Function内容 
exports.handler = function(event, context) { 
// DynamoDB StreamイベントのデータをNorikraで扱いやすいように整形 
async.series( 
[ 
function (callback) { Norikraにターゲット作成; callback(null, true);}, 
function (callback) { Norikraにイベント送信; callback(null, true);} 
], 
function (err, results) { 
if (err) {context.done('error', err);} else {context.done(null, results);} 
} 
); 
} 
classmethod.jp 
18 
https://github.com/yokota-shinsuke/aws-lambda-dynamodbstream-to-norikra
Lambda Function登録 
classmethod.jp 
19
Lambda Function登録 
classmethod.jp 
20
Lambdaへのイベント登録 
classmethod.jp 
21 
①Lambda Functionの登録 
②DynamoDB Streamをイベントソースと して登録 
②
Lambdaへのイベント登録 
classmethod.jp 
22
Lambdaへのイベント登録 
classmethod.jp 
23
Norikra 
•イベントストリームプロセッサ 
•SQLライクな言語でイベントの集計方法 を記述できる 
–例:直近1時間に新規登録したユーザ数 
http://norikra.github.io/index.html 
classmethod.jp 
24 
SELECT COUNT(*) AS new_users 
FROM user_history.win:time_batch(1 hour) 
WHERE action = ‘register’
user_id: 0 action: register 
Norikra 
classmethod.jp 
25 
user_id: 1 
action: register 
user_histor 
user_id: 0 action: get_point 
new_user: 1 
SELECT COUNT(*) AS new_users 
FROM user_history.win:time_batch(1 hour) 
WHERE action = ‘register’
Norikra 
classmethod.jp 
26 
user_histor 
user_id: 0 action: get_point 
new_user: 2 
user_id: 1 
action: register 
SELECT COUNT(*) AS new_users 
FROM user_history.win:time_batch(1 hour) 
WHERE action = ‘register’
Norikra WebUI 
classmethod.jp 
27
Norikra Target 
classmethod.jp 
28
Norikra Query 
classmethod.jp 
29
Norikra Output 
classmethod.jp 
30 
1418713623, {“new_user” : 3} 
1418713683, {“new_user” : 1}
経路ごとのユーザ登録数 
classmethod.jp 
31 
{“user_id” : 3, “created_at” : 1418713623, 
“action” : “register”, “entry_from” : “ad01”} 
SELECT entry_from, COUNT(*) AS new_users 
FROM user_history.win:time_batch(1 hour) 
WHERE action = ‘register’ 
GROUP BY entry_from 
{“entry_from” : “ad01” ,“new_user” : 3} 
{“entry_from” : “ad02” ,“new_user” : 1}
#cmdevio 
ご清聴ありがとうございました。 
このスライドは後日公開いたします。 
reGrowth-001

DynamoDB Streamを使ったリアルタイム分析