3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[AWS]土日をフルに使ってLambdaで遊べるようにしてみた!!![WEBアプリが作りたい:実装編]

Last updated at Posted at 2015-09-26

続きです。
Lambdaの実装をしていきたいと思います。
AWS_Lambda_1.png


Lambdaファンクションの定義

AWS_Lambda_2.png

・よく使うシーンのテンプレートが用意されていますので今回は"dynamodb-process-stream"を選択することとします。
AWS_Lambda_3.png
.Lambdaを発火させるイベントのソースに何を使うかを指定することができます。
今回の構成ではSNSの通知をトリガーにしてスクリプトを実行するためSNSを選択します。
なお、その他に選択できるイベントとしてはS3バケットへのオブジェクトの追加やDynamoDBへの書き込み、HTTP/HTTPS経由のリクエストなどが選択できます。
AWS_Lambda_4.png
AWS_Lambda_5.png
・Functionの設定を行います。
lambdaファンクションの名前や説明などを入力します。
イベントハンドラは今回いじりません。Roleには前回作成したlambda用の権限を指定します。

・今回使用するスクリプトは下記のスクリプトを使用します。

index.js

console.log('Loading function');
var aws = require('aws-sdk');

exports.handler = function(event, context) {
var dynamodb = new aws.DynamoDB({region: 'ap-northeast-1'});
var ec2 = new aws.EC2();

var msgid = event.Records[0].Sns.MessageId;
var msg = event.Records[0].Sns.Message;

var bstart = new Buffer('<base64_文字列>', 'base64');
var start = bstart.toString();

var bstop = new Buffer('<base64_文字列>', 'base64');
var stop = bstop.toString();


    console.log('msgid:', msgid);
    console.log('msg:', msg);
    console.log('start:', start);
    console.log('stop', stop);
    
var params ={"TableName":"sampleOPI",
                "Item":{
                        "MessageId":{"S":msgid},
                        "Message":{"S":msg}
        }
};

var ec2params = {
  InstanceIds:['i-xxxxxxxx']
};

dynamodb.putItem(params, function(err, data) {
                if(err) { console.log(err); }
                else { 
                        console.log("data insert successfully," + msg);
                       context.done(null,'');
                }
        });

if (msg == start) {
    ec2.startInstances(ec2params, function(err, data) {
    if (err) console.log(err, err.stack); 
    else     console.log(data);           
    });
}

if (msg == stop) {
    ec2.stopInstances(ec2params, function(err, data) {
    if (err) console.log(err, err.stack); 
        else     console.log(data);           
            });
}

};

スクリプトの仕様としては、SNSで飛んできたJSONメッセージの中から任意の値を取得し、DynamoDBへ下記身を行います。
また、受け取ったメッセージと指定した文字列を比較し、指定した文字列と同じだった場合、インスタンスの起動・停止処理が走るようになっています。
文字列の使用にbase64を使用しているのは、lambdaファンクションの中に直接日本語文字列を書き込むと文字化けを起こし、正常に動作しないためです。

AWS_Lambda_6.png


テスト

ここまででlambdaを使用するための準備は全て完了しました。
あとは実際に動くかテストしてみましょう。

テストタブの中からテストの項目を選択し新しく作ります。

AWS_Lambda_8.png

Test項目の中からSNSを選択し実行してみます。

AWS_Lambda_11.png

実行後、DynamoDBで確認してみましょう。ストリームにテスト文字列が表示されていれば正しく格納されています。
また、自分のgmailアドレスを確認してみてください。
SNSによる更新通知が入っているはずです。

実行ログ

AWS_Lambda_12.png


完成!.png

以上で、イベントドリブンなコードを実装することができました。
どうでしょうか、今回大したことはしていません。
しかし、今回の構成は少し応用するだけで実際に「使える」構成に化けるものです。
また、Dynamo、Lambda、SNS、S3など可溶性を考える必要のないサービスを組み合わせて作っているためアクセスが集中しても耐えることができます。

便利な仕組みです。
APIGatewayと組み合わせることで更に、更に応用範囲が広げることができます。
夢があり楽しlambda、みなさんもこの機会にぜひ試してみてはいかがでしょうか。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?