SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

池澤あやかさんにお願い! AWS Summit Tokyo 2015「デベロッパーカンファレンス」を盛り上げるアプリを一緒につくってください!

【制作2日目】池澤あやかさん、イベント会場中のスマホが振られた量を集計する処理に挑む、もちろん処理はイベントドリブンで ~ AWS Lambda登場

池澤あやかさんにお願い!AWS Summit Tokyo 2015「デベロッパーカンファレンス」を盛り上げるサービスを一緒につくってください! 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

ここまできたぞ! 集計処理のコーディング

西谷:

Lambda関数のコードは、zipファイルにまとめてアップロードすることができます。

でも、今回は関数が1つだけなので、インラインエディターを使いましょう。

池澤:

了解です。

西谷:

[Lambda: Function list]で先ほど作成したLambda関数を選択し、[Actions]→[Edit/Test]を選択してください。

Lambda関数の編集

 

池澤:

選択しました。[Function code]にコードが表示されていますね。

西谷:

表示されているコードを削除して、Amazon Kinesisからデータを取得してAmazon DynamoDBへと反映するコードを書いていきます。

Lambda関数のコード

 

Lambda関数では、Handler Nameで指定したモジュールが呼び出されます。今回はデフォルトのままなのでhandlerとなります。

exports.handler = function(event, context) {
    // ...
};
池澤:

Kinesisにデータが入ってきたら、handlerモジュールが呼び出されるんですね。

西谷:

そうです。handlerには、引数としてeventcontextが渡されます。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日以降)に公開します。入手したい方、ご興味のある方は開催後に本連載を再度ご覧ください。

次のページ
Lambda関数を実行するためのイベントソースを指定しよう

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
池澤あやかさんにお願い! AWS Summit Tokyo 2015「デベロッパーカンファレンス」を盛り上げるアプリを一緒につくってください!連載記事一覧

もっと読む

この記事の著者

坂井 直美(サカイ ナオミ)

SE、通信教育講座の編集、IT系出版社の書籍編集を経てフリーランスへ。IT分野で原稿を書いたり編集したり翻訳したり。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8643 2015/07/13 22:12

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング