$30 off During Our Annual Pro Sale. View Details »

気がついたらSagaパターンになっていた!? 少人数で運用するサーバレスバックエンド

気がついたらSagaパターンになっていた!? 少人数で運用するサーバレスバックエンド

#RejectDay2023

Kazuki Miura

June 24, 2023
Tweet

More Decks by Kazuki Miura

Other Decks in Technology

Transcript

  1. Reject Day 2023
    気がついたらSagaパターンになっていた!?
    少人数で運用するサーバレスバックエンド
    2023.06.24
    三浦一樹
    #RejectDay2023

    View Slide

  2. 自己紹介
    37歳
    秋田→東京→札幌
    サウナ大好き
    三浦一樹
    #RejectDay2023

    View Slide

  3. 自己紹介
    #RejectDay2023
    WithSecure Customer Ambassador
    を拝命しておりまして
    この間
    フィンランドはヘルシンキに行ってきました

    View Slide

  4. #AWSDevDay 楽しかった〜
    #RejectDay2023

    View Slide

  5. お仕事紹介
    北海道を対象とした特定地上基幹放送事業者
    #RejectDay2023

    View Slide

  6. みなさんテレビ見てます?
    #RejectDay2023

    View Slide

  7. みなさんテレビ見てます?
    #RejectDay2023

    View Slide

  8. みなさんテレビ見てます?
    今期は #だが情熱はある
    #RejectDay2023

    View Slide

  9. お仕事紹介
    BtoB事業 BtoC事業
    テレビのCMや番組提供
    番組関連のイベント事業
    放送収入
    番組の配信や
    関連グッズの販売など
    ファンの方に直接お届けする
    放送外収入
    北海道を対象とした特定地上基幹放送事業者
    01 02
    #RejectDay2023

    View Slide

  10. お仕事紹介
    動画配信事業 EC事業
    ネットデジタル事業部
    #RejectDay2023

    View Slide

  11. お仕事紹介
    動画配信事業 EC事業
    8人のチーム
    エンジニア3名
    (+SES 2名)
    ネットデジタル事業部
    #RejectDay2023

    View Slide

  12. OIDC
    OIDC
    OIDC
    ざっくりアーキテクチャ
    #RejectDay2023
    S3 MediaConvert S3
    DynamoDB
    DynamoDB
    DynamoDB
    AppSync
    Lambda
    API-GW
    Step Functions
    API-GW
    Amplify
    Amplify
    担当者向け
    CMS
    倉庫
    システム
    BFF
    Frontend Backend

    View Slide

  13. 今日の主役
    EC事業
    #RejectDay2023
    AWS Step Functions
    10
    +

    View Slide

  14. AWS Step Functions
    みなさん使ってます?
    #RejectDay2023

    View Slide

  15. 概要
    AWS Step Functions の簡単な説明
    ECでどのようにつかっているか
    エラーと戦う
    ステートマシンの分割
    Sagaパターンと出会う
    みんなのステートマシンがみたい!!
    #RejectDay2023

    View Slide

  16. AWS Step Functions
    基本情報
    #RejectDay2023

    View Slide

  17. 基本情報
    #RejectDay2023
    AWS Step Functions

    View Slide

  18. 基本情報
    #RejectDay2023
    AWS Step Functions
    ]
    半角スペース
    ]
    半角スペース

    View Slide

  19. 基本情報
    #RejectDay2023
    AWS Step Functions は、
    デベロッパーが AWS のサービスを利用して分散型アプリケー
    ションを構築し、プロセスを自動化し、マイクロサービスのオ
    ーケストレーション、データと機械学習のパイプラインを構築
    できるようにするビジュアルワークフローサービスです。
    AWS Step Functions
    ]
    半角スペース
    ]
    半角スペース

    View Slide

  20. 基本情報
    #RejectDay2023
    詳細な説明は今日はしないです。ごめんなさい
    ざっくりだけ
    AWS Step Functions
    ]
    半角スペース
    ]
    半角スペース

    View Slide

  21. 基本情報
    #RejectDay2023
    Input JSON Output JSON
    SDK

    View Slide

  22. 基本情報
    #RejectDay2023
    Workflow Studio
    最高!
    ステートマシンを
    GUIで作れる!

    View Slide

  23. https://aws.amazon.com/jp/builders-flash/202306/implement-step-functions-error-handling
    エラーハンドリング
    #RejectDay2023
    山口さんのbuilders.flash
    ステート遷移を利用したエラーハンドリング
    ステート内の処理リトライを利用したエラーハンドリング
    Choice フローを利用した処理ハンドリング
    EventBridge を利用したエラーハンドリング

    View Slide

  24. AWS Step Functions
    ECサイト
    #RejectDay2023

    View Slide

  25. ECの注文まで
    #RejectDay2023
    カート画面 情報入力 確認画面 購入完了

    View Slide

  26. #RejectDay2023
    カート画面 情報入力 確認画面 購入完了
    在庫チェック
    在庫 Table
    カート Table
    ECの注文まで

    View Slide

  27. #RejectDay2023
    カート画面 情報入力 確認画面 購入完了
    在庫チェック
    在庫 Table
    カート Table
    temp Table
    カート Table
    ECの注文まで
    送料計算

    View Slide

  28. #RejectDay2023
    カート画面 情報入力 確認画面 購入完了
    在庫チェック
    在庫 Table
    カート Table
    temp Table
    カート Table
    決済処理
    在庫 Table
    注文 Table
    配送 Table
    ECの注文まで
    送料計算

    View Slide

  29. #RejectDay2023
    カート画面 情報入力 確認画面 購入完了
    在庫チェック 送料計算
    在庫 Table
    カート Table
    temp Table
    カート Table
    決済処理
    在庫 Table
    注文 Table
    配送 Table
    2s 5s
    ECの注文まで

    View Slide

  30. 2s 5s
    #RejectDay2023
    カート画面 情報入力 確認画面 購入完了
    在庫チェック
    在庫 Table
    カート Table
    temp Table
    カート Table
    決済処理
    在庫 Table
    注文 Table
    配送 Table
    ECの注文まで
    送料計算

    View Slide

  31. エラーと戦う
    #RejectDay2023

    View Slide

  32. #RejectDay2023
    在庫確保できた
    決済成功

    View Slide

  33. #RejectDay2023
    在庫確保できた
    決済成功
    注文分の在庫をテーブルから引く
    失敗したら戻せばいい

    View Slide

  34. #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功

    View Slide

  35. #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功
    お金もらってる


    ここで失敗したら?

    View Slide

  36. #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功
    返金処理
    失敗
    こんな感じ?

    View Slide

  37. 決済失敗
    返金処理
    #RejectDay2023
    在庫確保できた
    決済成功
    失敗
    Stripe の手数料が発生
    大量発生したら金が、、、
    クレカの状態まで戻せない
    ユーザはどう思う?
    この方法を採用すると

    View Slide

  38. 決済失敗
    返金処理
    #RejectDay2023
    在庫確保できた
    決済成功
    失敗
    Stripe の手数料が発生
    大量発生したら金が、、、
    クレカの状態まで戻せない
    ユーザはどう思う?
    この方法を採用すると
    戻さない方が良さそう

    View Slide

  39. #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功
    これ以降は
    意地でも通す

    View Slide

  40. #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功
    カートの論理削除


    マイページの情報作成・完了メールの送信


    View Slide

  41. #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功
    まぁ、なんとかなりそう。
    最悪TTLで消えてくれる
    ここまでの状態を保持しつつ、再起する必要あり
    Step Functions の分割が必要

    View Slide

  42. ステートマシンの分割
    #RejectDay2023

    View Slide

  43. Step Functions は途中からの再実行ができない


    結果を待たず、
    別のStep Functions を起動だけすると
    その状態を保存した形で処理を渡せる
    #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功
    {
    "StateMachineArn": "arn:",
     "Input": {
      "tempOrderId.$": "$.tempOrderId",
      "AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$": "$$.Execution.Id"
     }
    }
    すぐ通したい

    View Slide

  44. #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功
    失敗
    SNS
    人が対応
    SNS
    コンソールから
    Step Functions
    再起
    失敗

    View Slide

  45. #RejectDay2023
    コンソールからボタン押したら
    途中から再開できる

    View Slide

  46. #RejectDay2023
    その他の分岐を追加して、、、

    View Slide

  47. #RejectDay2023
    ECの注文処理
    余裕があればデモ

    View Slide

  48. #RejectDay2023
    とりあえず大丈夫そうだけど
    答え合わせがしたい

    View Slide

  49. Saga パターンとは?
    #RejectDay2023

    View Slide

  50. #RejectDay2023
    https://speakerdeck.com/fatsushi/fen-san-sisutemuniokerusagapatanfalseaws-step-functions-niyorushi-zhuang-number-awsdevday
    AWS 福井さんの資料に出会う

    View Slide

  51. #RejectDay2023
    https://speakerdeck.com/fatsushi/fen-san-sisutemuniokerusagapatanfalseaws-step-functions-niyorushi-zhuang-number-awsdevday
    AWS 福井さんの資料に出会う

    View Slide

  52. #RejectDay2023
    https://speakerdeck.com/fatsushi/fen-san-sisutemuniokerusagapatanfalseaws-step-functions-niyorushi-zhuang-number-awsdevday
    オーケストレーションならStep Functions

    View Slide

  53. #RejectDay2023
    https://github.com/aws-samples/aws-step-functions-long-lived-transactions

    View Slide

  54. #RejectDay2023
    Saga パターンができてた!?

    View Slide

  55. #RejectDay2023
    在庫確保できた
    決済失敗
    決済成功
    失敗
    SNS
    人が対応
    SNS
    コンソールから
    Step Functions
    再起
    失敗
    補償トランザクション……?

    View Slide

  56. #RejectDay2023
    Saga パターンができてた!?
    みたいなもの?

    View Slide

  57. #RejectDay2023
    その他Sagaパターン資料
    #AWSDevDay 2023
    野村さんの資料
    12章が丸っと
    トランザクショナルサーガ

    View Slide

  58. ”決して最善のアーキテクチャを狙ってはいけない。
    むしろ
    少なくとも最悪ではないトレードオフの組み合わせを狙おう”
    ソフトウェアアーキテクチャ・ハードパーツ / P.2
    #RejectDay2023

    View Slide

  59. #RejectDay2023
    1年くらい無事だから
    1年くらい運用しておりますが、
    そもそも、かなり限定的な条件なので
    手動を動かしたのは10回くらい

    View Slide

  60. まとめ
    #RejectDay2023

    View Slide

  61. まとめ
    AWS Step Functions 便利!
    エラーハンドリングは悩ましい
    再起を考えると分割すると対応しやすい
    Sagaは先にちゃんと勉強しておくべきだった
    1年以上とりあえず安定運用
    理想との差分で大事なもの抜けてないか心配
    みんなのステートマシンを見てみたい!
    いろいろ議論したい!
    #RejectDay2023

    View Slide

  62. Thank You!
    #RejectDay2023
    来年はCfP通るように頑張っていきます

    View Slide