ここまできたぞ! 集計処理のコーディング
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日以降)に公開します。入手したい方、ご興味のある方は開催後に本連載を再度ご覧ください。