ここまできたぞ! 集計処理のコーディング
Lambda関数のコードは、zipファイルにまとめてアップロードすることができます。
でも、今回は関数が1つだけなので、インラインエディターを使いましょう。
了解です。
選択しました。[Function code]にコードが表示されていますね。
表示されているコードを削除して、Amazon Kinesisからデータを取得してAmazon DynamoDBへと反映するコードを書いていきます。
Lambda関数では、Handler Nameで指定したモジュールが呼び出されます。今回はデフォルトのままなのでhandlerとなります。
exports.handler = function(event, context) {
// ...
};
Kinesisにデータが入ってきたら、handlerモジュールが呼び出されるんですね。
そうです。handlerには、引数としてeventとcontextが渡されます。eventには、Amazon Kinesisのデータが格納されています。
contextのほうは?
AWS Lambdaに関する情報です。
最初に、eventからAmazon Kinesisのデータを取り出します。今回はひとまずAmazon Kinesisのレコード1件につきLambda関数を1回起動するようにしますが、ここは本番に向けて調整する必要があります。また、送られてきたデータ部分はBase64エンコードされているため、デコードした上でASCII形式に変換し、さらにJSON形式にパースします。
JSON形式にして使いやすくするんですね。
encodedPayload = event.Records[0].kinesis.data;
payload = new Buffer(encodedPayload, 'base64').toString('ascii');
data = JSON.parse(payload);
続いて、Amazon Kinesisに送られてきたデータに含まれるX座標の現在値(Current)と前回値(Previous)の絶対値を取得します。ただし、1回目のデータは前回値がないので、0とします。
今回は、現在値と前回値の差が1以上であれば、スマホが振られたとみなすようにしていますが、この閾(しきい)値は本番に向けて調整をする必要があります。
var threashold = 1; //閾値
var current_x_abs = Math.abs(data.Motion.Current.x);
var previous_x_abs;
if(typeof data.Motion.Previous === "undefined"){
previous_x_abs = 0;
}else{
previous_x_abs = Math.abs(data.Motion.Previous.x);
}
var abs = current_x_abs + previous_x_abs;
次に、データから選択された言語名を取り出します。Amazon DynamoDBのテーブルの各項目には属性が含まれていることを覚えてますか?
はい。
Amazon DynamoDBはスキーマレスなので、1つの項目に自由に属性を追加できます。そこで、取り出した“Ruby”などの言語名を属性、集計値を値とした項目をcounterテーブルに追加します。
スマホが振られたとみなされた場合、その言語名の値を1ずつ加算することで、集計していきます。これを言語ごとに行います。成功時にはLambda関数が正常終了したことを示すcontext.succeed()を実行します。また、失敗時にはcontext.fail()を実行します。それぞれ引数として成功もしくは失敗した旨のメッセージ文字列を指定しています。
var lang = data.Lang;
var updateExpression = "add " + lang + " :i";
if(abs > threashold){
var params = {
TableName: 'counter',
Key: {
'event_id':{
N: '1'
}
},
UpdateExpression: updateExpression,
ExpressionAttributeValues: {':i': {'N': '1'}},
ReturnValues: 'UPDATED_NEW'
}
dynamodb.updateItem(params,function(err,data){
if(err){
console.log(err,err.stack);
context.fail(err);
}else{
context.succeed(lang + ' is shaked.');
}
});
}else{
context.succeed(lang + ' is not shaked.');
}
はい、わかりました。
最後に、[Save]をクリックしてください[3]。
[3] 本連載で作成している「スマホフレーフレー言語応援アプリ」の全コードは、AWS Summit Tokyo 2015 デベロッパーカンファレンスの開催後(6月3日以降)に公開します。入手したい方、ご興味のある方は開催後に本連載を再度ご覧ください。
