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


続きです。
Lambdaの実装をしていきたいと思います。
![AWS_Lambda_1.png](https://qiita-image-store.s3.amazonaws.com/0/52141/4b599695-3715-adf8-de0e-b5a8513491ef.png "AWS_Lambda_1.png")

---
###Lambdaファンクションの定義
![AWS_Lambda_2.png](https://qiita-image-store.s3.amazonaws.com/0/52141/220fea75-6f90-7dd1-651b-98ed40b50108.png "AWS_Lambda_2.png")

・よく使うシーンのテンプレートが用意されていますので今回は"dynamodb-process-stream"を選択することとします。
![AWS_Lambda_3.png](https://qiita-image-store.s3.amazonaws.com/0/52141/061b19e9-752b-0c40-108a-b2e96a5dd339.png "AWS_Lambda_3.png")
.Lambdaを発火させるイベントのソースに何を使うかを指定することができます。
今回の構成ではSNSの通知をトリガーにしてスクリプトを実行するためSNSを選択します。
なお、その他に選択できるイベントとしてはS3バケットへのオブジェクトの追加やDynamoDBへの書き込み、HTTP/HTTPS経由のリクエストなどが選択できます。
![AWS_Lambda_4.png](https://qiita-image-store.s3.amazonaws.com/0/52141/ad1d5ae7-c3dd-f107-2a44-554886ca543d.png "AWS_Lambda_4.png")
![AWS_Lambda_5.png](https://qiita-image-store.s3.amazonaws.com/0/52141/d0081305-6bd3-2efc-dfd2-eba95b505c1b.png "AWS_Lambda_5.png")
・Functionの設定を行います。
lambdaファンクションの名前や説明などを入力します。
イベントハンドラは今回いじりません。Roleには前回作成したlambda用の権限を指定します。

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

```Node.js: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](https://qiita-image-store.s3.amazonaws.com/0/52141/cd8a1ece-978a-08cf-c812-6ae650f8e665.png "AWS_Lambda_6.png")


---

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

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

![AWS_Lambda_8.png](https://qiita-image-store.s3.amazonaws.com/0/52141/8f6264cf-5088-ca89-016c-1e6f4f6468d1.png "AWS_Lambda_8.png")

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

![AWS_Lambda_11.png](https://qiita-image-store.s3.amazonaws.com/0/52141/cac6ec3f-d6c7-dba0-bd84-0603c81b07f7.png "AWS_Lambda_11.png")

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


###実行ログ
![AWS_Lambda_12.png](https://qiita-image-store.s3.amazonaws.com/0/52141/09867334-4d51-724b-c08e-01bca97855b6.png "AWS_Lambda_12.png")

---

![完成！.png](https://qiita-image-store.s3.amazonaws.com/0/52141/e9a0b8f1-28d3-e131-a400-448ba62022dc.png "完成！.png")


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

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