AWS Step FunctionsとAmazon Event Bridgeを使って、プログラムコードを書かずにStripeと連携する

2023年11月26日に、AWSがStep Functionsから外部のHTTPS APIをよびだせるようになったとのアナウンスがありました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-step-functions-https-endpoints-teststate-api/

ユースケースなどを紹介するブログに、Stripeが紹介されおり、SNSでも「Stripeと連携できる」と話題になっていました。

https://aws.amazon.com/jp/blogs/aws/external-endpoints-and-testing-of-task-states-now-available-in-aws-step-functions/

https://twitter.com/miu_crescent/status/1728981792550781437

## Stripeと連携するワークフローを手軽に試す

この機能とStripe連携を簡単に試すには、Step Functionsのテンプレートを利用しましょう。

### テンプレートからステートマシンを作成する

Step Functionsトップページの[今すぐ始める]をクリックします。

![スクリーンショット 2023-11-28 14.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/0371f0bc-e4ad-92b7-aad3-6ff07d59783b.png)

Step Functionsのステートマシーン（ワークフロー）を作る方法が選べますので、[テンプレートを選択]を選びましょう。

![スクリーンショット 2023-11-28 14.58.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/449969b5-4fc1-6778-7743-854be3492491.png)

[Stripe]を含むテンプレートが公開されています。今回は[Generate Invoices using Stripe]を選びました。

![スクリーンショット 2023-11-28 14.58.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/02ade74d-f787-5a55-9b0e-5af56cfea352.png)

テンプレートでどんなワークフローが実行できるかをプレビューできます。内容を見る限り、次のような作業を自動化しています。

- 顧客データをまとめて取得（10件）
- Map Stateで、１顧客ごとに「登録されているカードが有効か」を確認
- 確認した結果を元に、「請求書を発行するフロー」「カード情報が登録されていないことを知らせるフロー」そして「カードの有効期限が切れていることを知らせるフロー」の３つに分岐
- 請求書を発行する

![スクリーンショット 2023-11-28 15.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/de7426c5-25aa-fc51-d283-b39a452ba506.png)

[デモの実行]を選択した状態で、[テンプレートの使用]ボタンをクリックすると、ワークフロースタジオが読み取り専用で立ち上がります。

![スクリーンショット 2023-11-28 15.04.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/fc48df07-398b-4422-d9c2-429f55d8b191.png)

[デプロイと実行]をクリックすると、CloudFormationを利用して、以下の３リソースが生成されます。

- IAM Role: Step FunctionsのState Machineを実行するためのロール
- Step FunctionsのState Machine: ワークフローを実行するためのステートマシーン
- EventBridgeのConnection: デモ用のStripe APIキーを設定したAPI接続リソース

![スクリーンショット 2023-11-28 15.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/3d5c8f43-726b-4807-1723-ec929cdb8690.png)

### ステートマシンを実行して、動作を確認する

CloudFormationの立ち上げが完了すると、ステートマシンの実行画面が開きます。

![スクリーンショット 2023-11-28 15.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/262e2af3-b3fd-bc95-4848-436213896edf.png)

デモ用のステートマシンは引数を必要としません。そのため、入力の中身などは特に変更せず[実行を開始]ボタンをクリックしましょう。実行中のワークフローを確認する画面に移動します。

![スクリーンショット 2023-11-28 15.09.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/39297e81-af1a-1dae-3181-1aadfa9ea975.png)

テストデータの中には、カード情報が登録されていないか、有効期限が切れている顧客データが含まれていることがあります。そのため、[VerifyPaymentMethod]ステップを1件ずつ調べると、`card_status`が`expired`になっているものなどが確認できます。

![スクリーンショット 2023-11-28 15.11.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/6a6734f1-7254-f65e-5f3d-28573765c8a4.png)

## ステートマシンを変更して、カスタマイズしてみる

[ステートマシンの編集]ボタンをクリックすると、作成済みのステートマシンを編集することができます。ステートマシンを編集して、Stripe APIへのリクエスト内容をカスタマイズしてみましょう。

![スクリーンショット 2023-11-28 15.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/a59b0267-f4fa-3b6e-4650-ebbfefb7441c.png)

[ListCustomers]ステップを選択すると、右側のパネルにStripeへのAPIリクエスト内容が表示されます。

![スクリーンショット 2023-11-28 15.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/23fb2f1e-e64b-1ecd-aeb3-70c43f6f88ba.png)

### StripeへのGETリクエストをカスタマイズする

StripeへのGETリクエストをカスタマイズするには、[APIドキュメント](https://stripe.com/docs/api)に記載されているパラメータを**クエリパラメータ**で設定します。[ListCustomers(HTTP Endpointステップ)]のパネル下部にある[詳細パラメータ]を開きましょう。

![スクリーンショット 2023-11-28 15.18.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/592340c6-f12f-4839-6b85-13fbd5f76a6b.png)

クエリパラメータをJSON形式で入力できますので、`{"limit": 5}`を入力し、[保存]をクリックしましょう。

![スクリーンショット 2023-11-28 15.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/2f8552e8-8d93-6e2a-9500-fd42d1d0ff2d.png)

この状態でステートマシンを実行すると、後続の`VerifyPaymentMethod`ステップの実行数が10から5に変わっていることが確認できます。

![スクリーンショット 2023-11-28 15.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/24da98df-dec1-5203-6104-8cec2a9f76dc.png)

### StripeへのPOST / PUTリクエストをカスタマイズする

POSTやPUTリクエストについては、[リクエスト本文]に[APIドキュメント](https://stripe.com/docs/api)に記載されているパラメータを設定します。テンプレートの[CreateInvoiceAPI]ステップを見てみましょう。このステップには、３つのパラメータが設定されています。

![スクリーンショット 2023-11-28 15.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/8580c3b2-ab50-5a4c-ed0d-33da73d2b4d5.png)

呼び出すAPIメソッドによって、パラメータを設定する場所が異なることに注意しましょう。

## Stripeアカウントを変更する方法

最後にStripeアカウントをデモ用アカウントから変更する方法を紹介します。Stripe APIを呼び出している、[CreateInvoiceAPI]や[ListCUstomers]、[GetPaymentMethod]ステップのどれかを選択しましょう。選択すると表示される右側のパネルに、[Authentication]セクションがあります。ここにある[View connection]ボタンをクリックすると、API接続設定画面に移動できます。

![スクリーンショット 2023-11-28 15.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/002f5cb0-a754-bfde-2c2f-7126f4e5df19.png)

Amazon EventBridgeの[APIの送信先]ページに移動します。Stripeなどの外部APIをStep Functionsから呼び出す場合、この機能を利用して認証情報の管理などが行われています。

![スクリーンショット 2023-11-28 15.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/ce7e06af-56a5-7493-ed79-07785a0db8ba.png)

APIキーを変更するには、[編集ボタン」をクリックしましょう。BASIC認証での[ユーザー名]と[パスワード]を設定する画面が開きます。

![スクリーンショット 2023-11-28 15.29.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/5145b692-deda-3d85-c48e-53705d6e79bc.png)

Stripeのv1 APIは、[`skから始まるシークレットAPIキー:`]で認証を行います。そのため、**[ユーザー名]の情報をシークレットAPIキーに変更し、[パスワード]は空欄**で更新しましょう。

接続設定を変更した後にステートマシンを実行すると、APIキーを設定したStripeアカウントに対してAPIリクエストが届くようになります。

![スクリーンショット 2023-11-28 15.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/64399f99-b8f5-c45c-c64b-f16619586823.png)

## Stripe APIを呼び出すだけのLambda関数を削減しよう

例えばHTB社のECサイトのように、Step Functionsで在庫や注文・発送管理のワークフローを管理している場合、「在庫の確保・割り当てが出来次第、請求を行う」などのフローが発生します。

![スクリーンショット 2023-11-28 15.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/2a48ac03-c63a-92bc-8ab0-344eaf28580b.png)
https://speakerdeck.com/miu_crescent/ecsabisudenostripeshi-zhuang-ling?slide=26

これまでは、「Stripe APIを呼び出すためのLambda関数」を用意して、ステートマシンに追加する必要がありました。しかし今回のアップデートからは、「Stripeなどの外部APIを呼び出すだけの処理」についてもStep Functions (+ EventBridge)にて完結できます。

## 決済が関係する業務フローを、AWSの力で、より柔軟かつ手軽に自動化しよう

ほとんどの業務において、決済処理・請求処理は欠かすことができない存在です。「依頼された作業の請求処理」や「提供しているAPIの利用量を計測」・「ECサイトの注文・発送処理」など、さまざまな場面で決済やそれに関連する処理・情報が必要です。

StripeとAWSを利用することで、決済が関わる業務や業務フローを、少ないコードでより手軽に自動化・カスタマイズできます。

今回のケースだけでなく、Amazon Redshiftとの連携を行う「Stripe Data Pipeline」など、今後もStripeとAWSを組み合わせて使うことができる製品やユースケースを紹介してまいります。

https://stripe.com/jp/newsroom/news/stripe-data-pipeline

## [Appendix] テンプレートを使わずに、Stripe APIを呼び出す際は、「ヘッダー」に注意

Stripe API(v1)はAPIリクエストを`Content-Type: application/x-www-form-urlencoded`で受け付けます。しかしStep Functions / EventBridgeから外部APIを呼び出す場合、`Content-Type: application/json`でリクエストが送信されます。そのため、Stripe APIをStep Functionsから呼び出す場合は、[詳細パラメーター > ヘッダー]で**Content-Type**の設定を必ず行いましょう。

![スクリーンショット 2023-11-28 15.49.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/90aee0f6-a63a-5b4b-dcd9-deac6eeef191.png)

```json
{
  "Content-Type": "application/x-www-form-urlencoded"
}
```