Amazon EventBridgeのクイックスタートでStripeのWebhookイベントを簡単に処理できるようにする6Step


複数の決済手法をサポートすると、「どのタイミングで顧客が支払いを完了したか」を把握することが難しくなります。

その場で決済が完了するケースの多いクレジットカードやApple / Google Payに対し、銀行振込やコンビニ決済などでは入金が完了するまで数日かかるケースも存在します。

決済以外にも、サブスクリプションの契約更新やカード情報の有効期限切れ、トライアルの終了など様々なイベントがオンライン決済では発生します。

## 入金タイミングやサブスクリプションに関するイベントを、Webhookイベントとして一本化する

Stripeを利用する場合、このような決済に関するイベントを、Webhookイベントとして処理することをお勧めしています。

「決済方法ごとにステータスを確認するシステムを用意する」のではなく、「決済が完了したことを、Webhookイベントで受信したら処理を行う」形にすることで、様々な場面・決済方法をサポートできます。

## Amazon EventBridgeを利用した、Webhookイベント受信システムの簡単セットアップ

Webhookイベントの受信方法・処理方法にはいくつかの方法があります。

今回は、2022/08にAWSがリリースしたAmazon EventBridgeとの連携について紹介します。

https://aws.amazon.com/jp/about-aws/whats-new/2022/08/amazon-eventbridge-supports-receiving-events-github-stripe-twilio-using-webhooks/

### Step1: Stripeダッシュボードで、Webhook API用の署名シークレットを取得する

EventBridgeのStripe連携では、AWS CloudFormationを利用して必要なリソースをAWS上にデプロイします。

その際に設定パラメータとしてWebhook用の署名シークレットを入力する必要があるため、前もって取得しておきましょう。

![スクリーンショット 2022-09-08 15.40.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/2fbba1f5-67c0-4f4c-10c4-c04edd3c935f.png)

Stripeダッシュボードにアクセスし、[開発者 > Webhook]を開きましょう。

![スクリーンショット 2022-09-08 15.41.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/8dfc6f32-0415-de3c-734a-6e089b0448cb.png)
https://dashboard.stripe.com/test/webhooks

[エンドポイントを追加]をクリックし、新規登録画面を開きます。

ここでは、署名シークレットの取得だけが目的ですので、一旦[エンドポイントURL]にダミーのURL`https://example.com`を入力します。

![スクリーンショット 2022-09-08 15.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/66a0ccb2-bff5-278d-b742-9fafdbb5e835.png)

[リッスンするイベントの選択]の[イベントを選択]をクリックし、[全イベントを選択]をクリックします。

![スクリーンショット 2022-09-08 15.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/814e5966-bb71-9762-f46d-b85bce7f54d8.png)

[イベントを追加]ボタンをクリックすると、Webhookの設定詳細ページに移動します。

![スクリーンショット 2022-09-08 15.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/960e8c7f-3ff7-a58e-0b88-9b2384c7c605.png)

[署名シークレット]下にある[表示]をクリックすると、`whsec_`から始まる署名シークレットが表示されます。

![スクリーンショット 2022-09-08 15.47.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/6ed56243-e035-73a1-3e70-082a1bc83a65.png)

この値をコピーして、次のステップに進みます。

### Step2: Amazon EventBridge クイックスタートからStripe連携をセットアップする

続いてWebhookイベントをEventBridgeに送るためのAPIなどを作成します。

AWSマネージメントコンソールの[Amazon EventBridge]に移動し、　[デベロッパーリソース]の[クイックスタート]を開きましょう。

![スクリーンショット 2022-09-08 15.49.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/13e24c57-d825-1a4c-8e43-67ecb4e4b93d.png)

Stripeと連携できるリソースは、[Lambda fURL を使用したインバウンドウェブフック]からセットアップしますので、[使用を開始する]リンクをクリックしましょう。

![スクリーンショット 2022-09-08 16.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/20785588-b1c2-d2a9-68ee-687a9f9f982d.png)

現在利用できるテンプレートの候補が表示されます。ここから[Stripe]を探して、[設定]をクリックしましょう。

![スクリーンショット 2022-09-08 16.07.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/cb16e50e-cc70-8f62-c1bb-9e85590676cc.png)

設定方法のウィザードが立ち上がります。
イベントバスを選択する必要がありますが、現在稼働中のバスが特にない様子であれば、`default`のままで問題ありません。

![スクリーンショット 2022-09-08 16.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/cec64b5f-ce32-0492-9d71-2b1585a2ac26.png)

続けて[ステップ２]の[新しいStripeウェブフック]ボタンをクリックしましょう。

![スクリーンショット 2022-09-08 16.10.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/9f8ead1f-0b28-c88c-7768-3efdcf2af060.png)

URLに関する注意事項が表示されますので、チェックボックスをオンにして[確認]をクリックします。

クリックすると、CloudFormationの立ち上げ画面が起動します。

![スクリーンショット 2022-09-08 16.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/03d4b115-af04-9849-27be-711d712bf078.png)

`StripeWebhookSecret`に前のステップでコピーした`whsec_`から始まる署名シークレットを入力しましょう。

IAMなどのリソースを生成することへのチェックボックスが下部にありますので、全てチェックをつけて、[スタックの作成]をクリックします。

![スクリーンショット 2022-09-08 16.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/c022d5ab-3d84-d860-2974-d29a82724efa.png)

### 注意点: [スタックの名前]は重複NG

すでに一度同様のステップでCloudFormationスタックを立ち上げている場合、`Stack [StripeInboundWebhookStack] already exists`エラーが表示されることがあります。

これは[スタックの名前]が重複しているために表示されるエラーですので、[スタックの名前]に数字を足すなどして変更しましょう。

作成に成功すると、CloudFormationの管理画面に移動します。

![スクリーンショット 2022-09-08 16.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/9579e766-a488-e988-106c-69d447037e66.png)

ステータスが`CREATE_COMPLETE`に変われば、作成完了です。

![スクリーンショット 2022-09-08 16.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/e0b2ab09-7449-4741-db3a-4f2cbffafd3f.png)

[出力]タブをクリックし、`FunctionUrlEndpoint`のURLをコピーしましょう。このURLがStripeが呼び出すWebhookのエンドポイントとなります。

![スクリーンショット 2022-09-08 16.16.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/b92eecce-0d3f-a63d-7c26-a4138db8f414.png)

### Step3: Stripeダッシュボードで、WebhookのURLを変更する

URLのコピーができれば、Stripeダッシュボードに戻ります。

先ほど作成したWebhookの設定詳細画面に移動し、右上の[...]ボタンから[詳細情報の更新]をクリックしましょう。

![スクリーンショット 2022-09-08 16.17.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/744f8b99-fae7-5c3b-1c9b-2fa2c419bee2.png)

[エンドポイントURL]を入力する欄に、先ほどコピーしたURLを設定して、[エンドポイントを更新]をクリックします。

![スクリーンショット 2022-09-08 16.18.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/b90c0ccb-7086-c1c7-bcc6-10c434ec5a55.png)

これでStripe上で起きたイベントを、AWS Lambda経由でAmazon EvenrBridgeに送信できるようになりました。

### Step4: Amazon EventBridgeでStripeのイベントを受け付けるルールを作成する

次のステップでは、Amazon EventBridgeに送られてきたイベントから、特定の処理を実行するためのルールを作ります。

再びAWSのマネージメントコンソールに戻り、Amazon EventBridgeのページに移動しましょう。

[イベント]の[ルール]を選択し、[ルールを作成]ボタンをクリックします。

![スクリーンショット 2022-09-08 16.20.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ae49551a-282b-eb05-b8bb-e92914a55854.png)

ルール作成ウィザードが立ち上がります。

#### ルールの基本設定を行う

まず[名前]と[イベントバス]そして[ルールタイプ]を指定します。

![スクリーンショット 2022-09-08 16.23.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/4bdfa8c0-cdca-3e1c-c749-e22c892b8fa4.png)

[イベントバス]は、Step2でリソースを作成した時に指定したバスと同じもの（変更していなければ、`default`）を指定しましょう。

また、[ルールタイプ]では[イベントパターンを持つルール]を指定します。

[次へ]をクリックすると、イベントパターンの設定画面に移ります。

#### 受け付けるイベントの種類・パターンを設定する

次の設定画面では、どのイベントを受け付けるルールにするかを設定します。

はじめにイベントのソースを指定する必要があります。

Stripeの場合、[AWS イベントまたは EventBridge パートナーイベント]を選びましょう。

![スクリーンショット 2022-09-08 16.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/49d8c449-0d21-2932-ac2b-f5dec0f920cd.png)

ページを下にスクロールすると、[サンプルイベント - オプション]が表示されます。

これはオプションですが、この後設定する「イベントパターン]のテストに利用できますので、選択だけしておきましょう。

[EventBridgeパートナーイベント]を選択し、[サンプルイベント]から[charge.succeeded]を選びます。

![スクリーンショット 2022-09-08 16.54.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/e820d42c-a464-b550-5ec0-8ced9f1f41cb.png)

さらにスクロールして、[イベントパターン]の設定を行います。

Stripeの場合、[イベントソース]を[EventBridgeパートナー]設定し、[パートナー]で[Stripe]を選択しましょう。

![スクリーンショット 2022-09-08 16.56.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/0ca88c77-fa1d-cbae-566e-6a0d812d7398.png)

[イベントタイプ]を[すべてのイベント]にすると、Stripeから送られてきたイベント全てが対象になります。

もし絞り込みをしたい場合は、該当するイベントをセレクトボックスから選ぶか、[カスタムパターン（JSONエディタ）]を利用して個別に指定しましょう。　JSONエディタで指定するJSONのサンプルは、本記事の最後の方で紹介します。

![スクリーンショット 2022-09-08 16.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/4580da4d-55c1-0f70-d251-89dd14b3dd6b.png)

イベントパターンの設定が終われば、[テストパターン]ボタンをクリックしてルールのテストができます。
上の段で指定したサンプルイベントと、設定したイベントパターンが一致すれば成功メッセージが表示されます。

![スクリーンショット 2022-09-08 16.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/825a3230-8ffc-c739-03bb-9e3dfe3b8abd.png)

[次へ]をクリックすると、ルールに該当した時に実行する処理を選択する画面に移動します。

### Step5: ルールに応じてAWS上で実行する設定を行う

[ターゲットを選択]では、イベントパターン・ルールに一致した場合に呼び出すAPI・リソースの指定ができます。

![スクリーンショット 2022-09-08 17.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/d8375b21-be5e-f169-5ecb-dab438850cc7.png)

AWS LambdaやStep Functionsを指定することで、任意のコードを実行することができます。

動きの確認・デバッグが目的の場合は、[CloudWatch　ロググループ]を選択しましょう。

送られてきたデータを記録するためのロググループ名の入力が求められますので、`stripe-webhook`など「Stripeからのデータであること」がわかるグループ名を設定しましょう。

![スクリーンショット 2022-09-08 17.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/285c7f81-0e3a-b500-4c0b-a248d0ae2e80.png)

設定が終わると、リソースの識別に使用するタグの設定画面を経て確認画面に移動します。

![スクリーンショット 2022-09-08 17.05.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/1a4a12d6-0b52-98ee-5ab8-6fa9ab985be6.png)

ルールの作成が完了すれば、EventBridgeのルール一覧画面に移動し、先ほど作成したルールが一覧に追加されています。

![スクリーンショット 2022-09-08 17.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/eb5c5382-f7d0-81d9-d266-202dbd7cbd59.png)


### Step6: Stripeドキュメントサイト（Stripe Shell）を使った簡単テスト・デバッグ

特定のイベントを手動で発火させたい場合、Stripe CLIを利用すると簡単です。

Stripe CLIは簡単な用途であれば、ブラウザからも利用できます。

Stripeダッシュボードにログインした状態で、Stripeのドキュメントサイトにアクセスしましょう。

![スクリーンショット 2022-09-08 15.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/fcff6c2f-661f-bcbc-e2f2-8d5b45231bd9.png)
https://stripe.com/docs

ページ右下にある、上向き矢印のついたアイコンをクリックすると、Stripe CLIを実行するための画面（Stripe Shell）が起動します。

![スクリーンショット 2022-09-08 15.18.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/e8d06dc7-94a5-cd9a-f0cf-ae292ff7da39.png)

ここで`stripe trigger`と入力しましょう。するとCLIから実行できるイベントの候補が表示されます。

![スクリーンショット 2022-09-08 15.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/351599a9-0ee0-2890-1744-a34783cb2dfc.png)

コマンドを実行すると、そのイベントを発火させるために必要な処理をCLIが自動で実行します。

![スクリーンショット 2022-09-08 15.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/a14e843b-7f2a-d85f-9d9a-a94cf400cd36.png)

EventBridgeでの実行に成功しているかは、AWSマネージメントコンソールのルール詳細ページにある[モニタリング]から確認できます。

![スクリーンショット 2022-09-08 17.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/7f6b5134-caa2-d21c-958e-789fd1d0f61c.png)

`TriggeredRules`の数値が０のままの場合や、`FailedInvocations`の数値が増えている場合は、ルールやトリガーの設定を確認する必要があります。

イベントの中身を確認したい場合は、[CloudWatch ロググループ]をトリガーに追加して、CloudWatch Logsの[ロググループ]からログを確認しましょう。

![スクリーンショット 2022-09-08 17.10.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ef98eaef-916e-59d3-84e1-9bd1031be76a.png)


なお、`detail`のフィルターを設定している場合はフィルター条件に一致するイベントを発火できないことがあります。もしその場合は、ダッシュボードからの手動操作やAPI呼び出しによるテストをお試しください。

## EventBridge運用Tips

### サブスクや決済など、特定のイベントのみで実行できるようにする

EventBridgeでは、ルールのフィルターを設定することで、特定のイベントのみ処理するルールを作れます。

例えば以下の画像では、「請求書の支払いが完了した場合」のみ処理を実行させることができます。

![スクリーンショット 2022-09-08 15.06.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/c50eab61-29c9-870a-eba6-fe362a73e22b.png)

```json
{
  "source": [{
    "prefix": "stripe.com"
  }],
  "detail-type": ["invoice.paid"]
}
```

`detail-type`では、「XXから始まるイベント」のような条件も設定できます。そのため、以下のように書くことで、「請求書に関する処理全てのみ」を受け付けることも可能です。

```json
{
  "source": [{
    "prefix": "stripe.com"
  }],
  "detail-type": [{
    "prefix": "invoice"
  }]
}
```

さらに複数のデータを登録することもできます。
ですので、「顧客データの作成・更新時のみ」のようなルールも指定できます。

```json
{
  "source": [{
    "prefix": "stripe.com"
  }],
  "detail-type": ["customer.created", "customer.updated"]
}
```


### 金額や契約期間など、特定の条件でのみ実行できるルールを作る

また、EventBridgeでは`detail`を利用してより詳細なフィルタールールも設定できます。

`detail`の中にはStripeが送信するWebhookイベントのJSONが含まれています。

```json
{
    "version": "0",
    "id": "123-456-789",
    "detail-type": "invoice.updated",
    "source": "stripe.com",
    "account": "0123456789",
    "time": "2022-09-07T06:23:31Z",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "id": "evt_xxxxxxxxxxx",
        "object": "event",
        "api_version": "2020-08-27",
        "created": 1662531810,
        "data": {
            "object": {
                "id": "in_xxxxxxxxxx",
                "object": "invoice",
                "account_country": "JP",
                "account_name": "テストアカウント",
```

このデータに対応する形で条件を定義しましょう。
以下の例では、「（割引・課税後の）合計金額が5,000円を超える請求書」のみを受け付けます。


```json
{
  "source": [{
    "prefix": "stripe.com"
  }],
  "detail-type": [{
    "prefix": "invoice"
  }],
  "detail": {
    "data": {
      "object": {
        "total": [{
          "numeric": [">", 5000]
        }]
      }
    }
  }
}

```

フィルタリングのルールについては、AWSのドキュメントを参考にお試しください。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html

### AWSのコストやスロットリングを回避するため、送信するイベントを限定する

今回紹介した方法では、EventBridgeにイベントを送信する際に、AWS Lambdaを利用します。

そのためEventBridgeで利用する予定のないイベントは、StripeダッシュボードのWebhook設定で送信対象から外すことをお勧めします。

![スクリーンショット 2022-09-08 17.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/9dc441df-9408-61dd-f5fd-27a62db064a9.png)


必要のないイベントの送信を停止することで、Lambdaの利用料金を節約することができます。

また、問題が発生した際の調査をしやすくなることや、大量のイベントが送信されることでスロットリングされる恐れを回避することなども期待できます。

どのようなイベントが、いつStripeから送信されているかを確認したい場合は、Stripe CLIまたはStripe Shellで`stripe listen`コマンドを実行してみましょう。

## おわりに: StripeとAWSを利用した「イベント駆動」なサービス開発をはじめよう

デプロイされたLambdaのコードを確認すると、Stripeから送られるWebhookイベントの検証や処理・エラーハンドルなどが実装されていることがうかがえます。ちなみにランタイムはPythonでした。

これらのハンドリングを自前で実装・運用するコストと比較すると、AWSでサービスを構築している場合には非常に便利なツールではないかと思います。

さまざまな決済方法や契約パターンに対応できるシステムを作るため、Stripe WebhookとEventBridgeを利用したイベント駆動なサービス開発を、ぜひお試しください。

## ドキュメント

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-saas-furls.html#furls-connection-stripe

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html

https://stripe.com/docs/webhooks

https://stripe.com/docs/webhooks/best-practices

---

## [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)