[stripe][AWS] Stripe の Webhook を API Gateway で受け取って Lambda で処理する

[Serverless Framework](https://serverless.com/) 使って [Stripe](https://stripe.com/) の Webhook からのメッセージを処理するサンプル書いたので、使い方とか解説。
コード自体は [Serverless Examples](https://github.com/serverless/examples/) にプルリクしてマージしてもらってあるので、そちらを取ってきてください。
https://github.com/serverless/examples/tree/master/aws-node-stripe-integration

これは Stripe の [Webhook](https://stripe.com/docs/webhooks) から投げられるメッセージを AWS API Gateway 経由で AWS Lambda で処理したい時に使います。

# セットアップ
Serverless Framework のインストール方法は割愛。
[Installing The Serverless Framework](https://serverless.com/framework/docs/providers/aws/guide/installation/) を参考にしてね。

## サンプルコードの取得
https://github.com/serverless/examples/ を git clone するなりしてから、aws-node-stripe-integration ディレクトリを持ってきてください。

追記: GitHub 上のプロジェクトは `serverless install` で一発コピーできるそうです。thx @horike37 

```bash
$ serverless install --url https://github.com/serverless/examples/tree/master/aws-node-stripe-integration
Serverless: Downloading and installing "aws-node-stripe-integration"...
Serverless: Successfully installed "aws-node-stripe-integration"
```

## 依存 npm パッケージのインストール
この example では、npm パッケージ config, js-yaml, stripe を使ってるので、まずは `npm install` で依存パッケージをインストール。

```bash:npmパッケージのインストール
$ npm install
```

## Stripe API Key の書き換え
Stripe の API Key を `config/local.yaml` ってファイルに書いてください。
ソースを GitHub 等で公開しないのであれば、`config/default.yaml` の中身を書き換えてもいいよ。

```yaml:config/local.yaml
stripe:
    test_sk: 'Stripe_Test_Secret_Key_here'
    live_sk: 'Stripe_Live_Secret_Key_here'
```

# サンプルコードの解説

## event object の取得
実際に Webhook から送られたデータを処理しているのは [handler.js](https://github.com/serverless/examples/blob/master/aws-node-stripe-integration/handler.js) です。
Webhook 経由で event object が投げられると `event.body` に JSON 形式でセットされてくるので、最初にそれを `JSON.parse()` してます。
https://github.com/serverless/examples/blob/master/aws-node-stripe-integration/handler.js#L18

event object の構造は、Stripe API リファレンスを参考にしてください。
https://stripe.com/docs/api#event_object

## event object の正当性チェック
[`events.retrieve()`](https://stripe.com/docs/api#retrieve_event) で、受け取った event object が正当なものかをチェックしてます。
https://github.com/serverless/examples/blob/master/aws-node-stripe-integration/handler.js#L22

`events.retrieve()` から呼び出される callback 関数内では err だった場合の処理を入れてないので、これは実装してください。

## event type ごとの処理
受け取った event の種類は `stripeEvent.type` を見ればわかります。
それに合わせて Slack 通知するなりなんなりの処理を実装してくださいね。
https://github.com/serverless/examples/blob/master/aws-node-stripe-integration/handler.js#L33-L40

event type のリストは、Stripe API リファレンスを参考にしてください。
https://stripe.com/docs/api#event_types

# デプロイ！

## AWS API Gateway エンドポイントの作成
まずは、そのまま `sls deploy` すると Test 環境用の一式がデプロイされます。

```bash:Test環境用
$ serverless deploy
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (2.15 MB)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.....
Serverless: Stack update finished...
Serverless: Removing old service versions...
Service Information
service: aws-node-stripe-integration
stage: development
region: us-east-1
api keys:
  None
endpoints:
  POST - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/test/stripe/incoming
functions:
  incoming: aws-node-stripe-integration-test-incoming

Stack Outputs
ServiceEndpoint: https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/test
ServerlessDeploymentBucketName: aws-node-stripe-integration-serverlessdeploymentbuck-xxxxxxxxxxxx
IncomingLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:000000000000:function:aws-node-stripe-integration-test-incoming:20
```

endpoints ってのが、API Gateway の endpoint になります。

本番環境( Live )用の API Gateway endpoint を作成するには `--stage live` をつけてデプロイ

```bash:Live環境用
$ serverless deploy --stage live
```

## Stripe Webhook の設定
Stripe の管理画面から Webhook URL を設定します。
https://dashboard.stripe.com/account/webhooks の「Add endpoint」をクリック。
<img width="435" alt="Screen Shot 2017-04-07 at 12.58.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/25964/568bb093-e01f-ee40-03a3-74c608749930.png">

Test 環境用の Webhook を設定したい場合は「Mode」Test を、Live 環境用の Webhook を設定したい場合は「Mode」Live を選択して「URL」欄に先ほど `serverless deploy` した時に作成された API Gateway の endpoint を入力して「Create endpoint」をクリックするだけです。

Serverless Framework のおかげで、簡単にできちゃいますねー。
現場からは以上です。