[ワークショップ資料] コードを書かずにデジタルコンテンツを販売する仕組みをAWS上に構築してみよう

この記事は、コードを書かずにオンライン決済の注文フローをAWS上に実装する方法を体験するワークショップ資料です。デジタルコンテンツを販売するサイトを例に、イベント駆動型のシステムを作る方法やAWSのサーバーレスな製品を組み合わせる方法などを体験できます。

## ワークショップで体験できること

このワークショップでは、「商品が注文された後」のワークフローにフォーカスして、業務フローの自動化に挑戦します。事前に用意されたStripeアカウントと、商品注文リンクを利用して、購入されたデジタルコンテンツの提供や社内への通知などを実装します。

:::note warn
**プライベートベータ機能を利用します**

本資料公開時点では、StripeとAmazon EventBridgeを連携させる機能は招待制のベータ機能です。ご自身のStripeアカウントで試されたい方は、以下のドキュメントにあるフォームから、ベータ版の参加申請を実施してください。

https://docs.stripe.com/event-destinations/eventbridge
:::

## ワークショップの流れ

このワークショップは、以下の流れで進みます。

- StripeとAmazon EventBridgeを連携する
- Amazon EventBridgeのルールを作成して、Stripeからのイベントを受信する
- SNSを利用して、未払いや注文の通知を社内に送信する
- Step FunctionsとSESで、顧客にメールを送信する
- Step FunctionsとEventBridgeで、クーポンの自動発行を行う
- 後片付け


:::note
緑の背景で書かれているテキストは、補助コンテンツです。「ワークショップでは触らないけれども、実案件で採用する際には知っておくと便利な情報」について紹介しています。
:::

:::note warn
黄色の背景は、注意文です。「イベント当日のみ行うステップ」や「ベータ版の機能を利用するステップ」、または「セキュリティ上の問題が発生しやすいステップ」などで、**注意すべき点**を紹介しています。
:::

## Step1: StripeとAmazon EventBridgeを連携する

まずはじめに、StripeとAWSを連携させる方法を体験します。

https://qiita.com/hideokamoto/private/8750d9b9b6e675074979

## Step2: Amazon EventBridgeのルールを作成して、Stripeからのイベントを受信する

続いてStripeから送信されたイベントを、Amazon EventBridgeでどのように処理するのかを学びます。このステップでは、EventBridgeのルール作成方法を体験できます。

https://qiita.com/hideokamoto/private/61c30ef9c0aa137ac020

## Step3: SNSを利用して、未払いや注文の通知を社内に送信する

ルールの作り方を理解した後は、簡単な社内通知用のワークロードを実装してみましょう。SNSを利用したメール通知と、EventBridgeへの連携方法を紹介します。

https://qiita.com/hideokamoto/private/74f242a0b4f4442bb572

## Step4: Step Functionsを利用して、商品ダウンロードリンクを送信する流れを体験する

送信されたデータの加工や、EventBridgeがサポートしていないAWSサービスを使う方法をこのステップで体験します。Step Functionsのステートマシンを作成し、SNSで実際のメール文章に近い内容のメッセージを配信する方法を体験します。

https://qiita.com/hideokamoto/private/bef67b4320a3b2295c91

## Step5: Step FunctionsとDynamo DBを使って「冪等性」を担保する

EventBridgeなどを利用した「イベント駆動アーキテクチャ」では、「複数回イベントが送信される可能性」に備える必要があります。このことを**冪等性の担保**とよびます。

https://qiita.com/hideokamoto/items/4c32ebc29bd8d8460c65

このステップでは、DynamoDBを利用した冪等性の担保を行う方法を体験します。

https://qiita.com/hideokamoto/private/15eaa5e64a46933f8639

:::note
**キャプチャだけとって力尽きた資料**

Amazon SESをStep Functionsから利用する
https://qiita.com/hideokamoto/private/793bdef0c0e54c5f62f7

:::

## Step6: 後片付け

### EventBridgeルールの削除

このリソース単独で課金が発生することはありません。しかしStep Functionsなどの課金が発生するリソースをターゲットにしたルールが残っていると、意図しない課金のリスクがあります。そのため、**少なくともルールの無効化**を行うことをお勧めします。

### CloudWatch ロググループの削除

こちらも無料枠などが存在するサービスではあります。しかしロググループは増えやすく、必要なロググループを探す際のノイズなどにもなる恐れがありますので、不要なロググループは削除しておきましょう。

### SNSトピックの削除

SNSについても無料枠が存在します。ただし不必要な通知が飛んでくることで、業務や個人開発のノイズになる恐れがありますので、不要になったリソースは削除しておきましょう。

### DynamoDBテーブルの削除

### Step Functionsステートマシンの削除



## [Appendix] Stripeと連携する際の、イベントパターンサンプル集

### Stripe Checkout / Payment Linksで、「支払いが完了している」場合

銀行振込やコンビニ決済など、その場で支払いまで完了しない決済手段でも注文を受け付ける場合に使用します。
支払いステータスのチェックと、「後日入金があった時、送信されるイベント」のサポートを行うことで、「支払いが完了した時のみ」ワークロードを実行できるようにします。

```json
{
  "source": [{
    "prefix": "aws.partner/stripe.com"
  }],
  "detail-type": ["checkout.session.completed", "checkout.session.async_payment_succeeded"],
  "detail": {
    "data": {
      "object": {
        "payment_status": ["paid"]
      }
    }
  }
}
```

### Stripe Checkout / Payment Linksで、「30000円以上の注文が完了した」場合

一定以上の金額で注文があった場合に実行したいワークロードがある場合に使用できます。

```json
{
  "source": [{
    "prefix": "aws.partner/stripe.com"
  }],
  "detail-type": ["checkout.session.completed"],
  "detail": {
    "data": {
      "object": {
        "amount_total": [{
          "numeric": [">=", 30000]
        }],
        "currency": ["jpy"]
      }
    }
  }
}
```



## [読み物] 実案件で導入する際のTips
### EventBridgeのルールをテストする際の、Stripeイベントデータ取得方法

テストに利用したい場合は、Stripeから送信されるWebhookイベントのJSONファイルを設定しましょう。このデータは、Stripeダッシュボードに用意されている[Stripe Shell]機能か、ローカル環境にStripe CLIをインストールすることで取得できます。

![スクリーンショット 2024-07-24 17.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/4c655c87-c4aa-39f5-ba78-312e4d181f77.png)

送信されるデータの構造については、StripeのAPIドキュメントで確認しましょう。

https://docs.stripe.com/api/events/object