会員登録機能をサーバレスアーキテクチャで実装する

##本記事を読む前の注意事項
現在ではAWSにUser Poolsという機能があります。

そちらを利用して会員登録機能を実装したほうが遥かに効率が良いです。[Amazon Cognito User Poolsを使って、webサイトにユーザ認証基盤を作る](http://qiita.com/horike37/items/1d522f66452d3abe1203)をご参照ください

## 概要
フォームから会員情報を登録。登録完了の旨をユーザに通知する仕組みをサーバレスで作ってみます

## アーキテクチャ
![会員登録.png](https://qiita-image-store.s3.amazonaws.com/0/65478/0704602f-fd38-3ce7-249c-6eb77a812e6b.png)


## API Gateway → Lmabda → DynamoDB
### POSTのデータをLambda側でjsonで扱えるよう設定
``` register.html
<form method="post" action="API Gatewayエンドポイント">
  <input type="text" name="email" value=""/>
  <input type="password" name="password" value=""/>
  <input type="submit" value="Send">
</form>
```
フォームの送信先にAPI Gatewayをセットします。[HTMLフォームからAPIGatewayを使ってAWS LambdaにPOSTする](http://qiita.com/satetsu888/items/40fc387735192b794da8)を参考にして、POSTのデータをLambda側でjsonで扱えるように設定します。

### 正常に処理が終了すればサンキューページにリダイレクト
DynamoDBにデータが登録できれば、サンキューページにリダイレクトするようにAPI Gatewayを設定しましょう。

<img width="778" alt="スクリーンショット 2016-04-13 9.53.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/c1ff28fd-659a-a8e0-29be-75d59e27a4b7.png">
Method Responseをクリックして302ヘッダの設定をします。

<img width="742" alt="スクリーンショット 2016-04-13 10.09.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/551b6d48-1c02-fca3-637e-23cec874cfcf.png">
302のステータスコードを作り、Locationヘッダを設定します。

<img width="776" alt="スクリーンショット 2016-04-13 10.10.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/04afa391-b033-26ac-3e42-4286dff5a1ba.png">

Integration Responseの画面をクリックして、Header Mappingにて`integration.response.body.location`を入力します。

```js:formtest.js
dynamo.putItem(dynamoRequest, function(err, data){
      if (err) {
        console.log(err);
      } else {
        context.succeed({location:"リダイレクト先URL"});
      }
    });
```
こうしてAPI Gatewayの処理するLambdaファンクションのcontextにマッピングさせたlocationを渡すことで処理成功時に302リダイレクトします。ここにサンキューページのURLを設定すればOKです。

## DynamoDB → Lmabda → SES
DynamoDBトリガーの設定をします。そしてそのLambdaファンクションからSESへサンキューメールを送信します。

```js
'use strict';
console.log('Loading function');
var aws = require('aws-sdk');
aws.config.update({region: "us-east-1"});
var ses = new aws.SES();

exports.handler = (event, context, callback) => {
    event.Records.forEach((record) => {
        console.log(record.eventID);
        console.log(record.eventName);
        console.log('DynamoDB Record: %j', record.dynamodb);


        var params = {
                Destination: {
                    ToAddresses: [
                        record.dynamodb.Keys.email.S
                    ]
                },
                Message: {
                    
                    Subject: {
                        Data: 'Thank you for subscribing our site'
                    },
                    
                    Body: {
                        Text: {
                            Data: 'Thank you!Thank you!PanPanPan!'
                        }
                    }
                },
                Source: '<your from address>'
            };
         ses.sendEmail(params, function (err, data) {
                if (err) {
                    console.log(err, err.stack);
                    context.fail('Internal Error: The email could not be sent.');
                } else {
                    console.log(data);           // successful response
                    context.succeed('The email was successfully sent to ' + event.email);
                }
            });
    });
};
```

フォームからの登録後以下のようにちゃんとメール届いてました
<img width="350" alt="スクリーンショット 2016-04-13 10.07.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/65478/98ea5171-df67-275e-6b94-13ac034ed21b.png">

会員登録しただけじゃなにもならんので、次回はサーバレスでのログイン、ログアウト処理を紹介します。