StripeのWebhookイベントをAmazon EventBridgeで受け取る


## AWSのEventBridgeにStripe連携のクイックスタートが追加された
https://aws.amazon.com/jp/about-aws/whats-new/2022/08/amazon-eventbridge-supports-receiving-events-github-stripe-twilio-using-webhooks/

EventBridgeで一部のSaaSサービスとの連携を簡単に構築できるようになりました（GitHub、Stripe、Twillio）

どんな感じでできるのかStripe連携を試してみたので、記事に残します。
あくまで作業の記録ですので、各サービスの詳細な説明は割愛します。

なお、作業は↓の記事を参照しながらやりました。
https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-saas-furls.html


## Step 1: StripeのWebhookエンドポイントを追加する
StripeのダッシュボードからWebhookのエンドポイントを追加します。※テスト環境でやりました
今回は顧客が追加されたときのイベント `customer.created` をリッスンします。
エンドポイントURLは現時点ではまだ分からないので適当に入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/f2b2f50a-b5ba-130f-20c6-39c433f86b6c.png)

エンドポイントを追加したら、`whsec_` から始まる署名シークレットをメモします。後のステップで必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/ac08f3cb-84c1-29c1-65d2-5fb3c87b14ab.png)

## Step 2：EventBridgeのセットアップ
[EventBridgeのコンソール画面](https://console.aws.amazon.com/events/)を開いて、左側のペインにある「クイックスタート」をクリックします。
※リージョンに注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/2cb69ad9-638c-4317-afab-2cbbbabb7439.png)
「Lambda fURL を使用したインバウンドウェブフック」を選択します。
最近登場した [Lambda Function URLs](https://aws.amazon.com/jp/blogs/news/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/) は **Lambda fURL** と略すようです。誤植かと思いましたが、このように略すのが正しいようです。
<img width="80%" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/a5e66cf6-2ff1-f58a-4af3-c7e00ad62783.png">
下にスクロールしていくとStripe用の設定ボタンがあるので、そちらをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/357abd5a-1d39-670d-2c8a-83355b3e60df.png)

使用するイベントバスを指定します。今回はStripe用のイベントバスを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/cd56e407-884f-1058-6273-c9125e925fe9.png)

「新しいStripeウェブフック」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/2d6a4cf1-ebec-9bee-a5c0-ab4940e82200.png)

作成されるLambda fURLがパブリックに公開されますよ、いいですか？という内容の警告が出ます。チェックを入れて次に進みます。
<img width="80%" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/a09c81c1-63bb-9320-86d8-a0f21c51f618.png">

テンプレートから作成するCloudFormationのスタック名、パラメータをそれぞれ入力します。
StripeWebhookSecretの欄がありますので、そこに Step1 でメモしていたStripeの署名シークレットを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/a8c547e3-9265-387f-a2f7-63ac15d4611f.png)

IAMリソースの作成とCFが要求する権限についての注意書きにチェックを入れて、スタックの作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/61cdf327-5f77-1079-73f7-269d66bf6680.png)

[CloudFormationのコンソール画面](https://ap-northeast-1.console.aws.amazon.com/cloudformation/home) を開いて先ほどのスタックのステータスが **<font color="MediumSeaGreen">✔CREATE_COMPLETE</font>** となれば作成完了です。
作成したスタックの詳細を開き、「出力」タブからWebhook先のURLを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/8984590d-405a-6d21-6e23-05c1479eb388.png)

再度[Stripeのコンソール](https://dashboard.stripe.com/test/webhooks/)を開き、Step1で作成したWebhookのURLを上書きします。
以上でEventBridgeとの連携は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/72d74e9e-1cb0-4c87-996e-2c69ab1ca6bd.png)

## Webhookの内容をCloudWatch Logsに出力してみる
EventBridgeで受け取ったイベントはルールを定義して他のAWSサービスに連携できます。
今回はその一例として、CloudWatch Logsにデータを流す構成を作ってみます。
↓イメージ図は以下の通りです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/23d19f66-8c55-55e8-e0c3-f4092952ea0f.png)

まずは [EventBridgeのコンソール画面](https://ap-northeast-1.console.aws.amazon.com/events/home?region=ap-northeast-1#/) からルールを作成します。
ルールはStripe用に作ったイベントバスと紐づけて作成してください。
- イベントバスの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/d6eb6dae-ca5f-5aea-431b-256a4563f846.png)

- ルールの詳細を定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/c5f370ce-dbd0-2fba-df63-ce281e208d00.png)

- イベントパターンを構築
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/c346bc9e-c1e0-fa40-2e8c-cd89d684b1b6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/3ec507fb-df8c-ea53-37ed-7767ba34578e.png)

- ターゲットを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/56009212-19b2-997a-6c22-5b6ef9ef9e3c.png)

- タグを設定
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/637adc41-2bf1-194c-571b-76a86786d4e7.png)


CloudWatch Logsへの連携設定は以上です。
Stripe CLIで顧客を作成してWebhookイベントを受け取ってみましょう。

:::note info
ブラウザから [stripe.sh](https://stripe.sh) を開くと簡単にCLIを使えます。
<br><img width="100%" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/1bef2077-9318-9a63-ffd2-bcf69c2baebb.png">
:::


- 実行結果
CloudWatch Logsのコンソールを確認すると、しっかりとイベントの内容が出力されています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594998/9329c63e-4d14-7244-7eae-79dab5e94fc3.png)


今回は分かりやすい例としてCloudWatchに連携しましたが、他にもStepFunctionsでワークフローを流したりLambda関数で外部サービスを連携したり、EventBridge経由で他のAWSアカウントにイベント連携したりも可能です。

## CloudFormationで作成されるAWSリソース
作成されるAWSリソースは以下の通りです。
|タイプ  |用途  |
|---|---|
|AWS::CloudWatch::Alarm  |アラート、5分間あたりの実行回数の閾値を監視  |
|AWS::Lambda::Function  |Lambda関数  |
|AWS::IAM::Role  |IAMロール  |
|AWS::Lambda::Url  |Lambda関数のHTTPエンドポイント  |
|AWS::Lambda::Permission  |Lambda関数をパブリック公開する許可  |
|AWS::SecretsManager::Secret  |Webhookの署名シークレットをSecretsManagerに保存  |

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