Slide 1

Slide 1 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. サーバーレス流のちょっぴりお得な デザインパターン講座 Kensuke Shimokawa ち ょ っ ぴ り D I V E D E E P Snr. Serverless Specialist Amazon Web Services Japan

Slide 2

Slide 2 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. 2 Kensuke Shimokawa Amazon Web Services Japan Snr. Serverless Specialist Slides https://speakerdeck.com/_kensh/ Qiita https://qiita.com/_kensh

Slide 3

Slide 3 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. Agenda • サーバーレスサービスの紹介 • サーバーレスな Webアプリケーション • モノリスとの付き合い⽅ • サーバーレスな ファイル変換処理 • サーバーレスな マルチテナント管理 3

Slide 4

Slide 4 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. これからお話すること • サーバーレスサービスの特徴を⽤いたアプリケーションの考え⽅ • ビジネスロジックにフォーカスするアーキテクチャの導⼊ • イベント駆動に処理をすることの⼤切さ 4

Slide 5

Slide 5 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. サーバーレスサービスの紹介 5

Slide 6

Slide 6 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. サーバーレスの効能 6 インフラ 構築 監視 設計工数の削減 運用工数の削減 生産性へのシフト インフラ関連の工数を減らし 市場投入スピードを短縮 人員を生産的な施策に 重点的に配置可能 運用工数の削減によって 利益増加に貢献 売上 運用 経費 売上 運用 経費 利益 要件 定義 インフラ 設計・構築 アプリ 設計・構築 インフラ 再調整 結合 テスト 障害 テスト アプリ 開発 監視 インフラ 構築 監視 アプリ 開発 監視 要件 定義 アプリ 設計・構築 結合 テスト 障害 テスト

Slide 7

Slide 7 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. AWS Lambda におけるコーディング 7 • 対応⾔語 • Node.js、Python 、Java、Go、Ruby、C# 、PowerShell • サポートされていない⾔語は、カスタムランタイムを実装することで利⽤可能 • ハンドラーで呼び出す関数を指定する • Python のデフォルトでは lambda_function.lambda_handler

Slide 8

Slide 8 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. AWS Lambda のスケールの仕組み 8 f(x) = {…} g(x) = {…} h(x) = {…} f(x) g(x) h(x) リソース管理 (cpu/ memory/ version) f(x) リトライ管理 ログ出力 トレース管理 g(x) h(x) API呼び出し イベント データ変更 イベント ファイル配置 イベント デプロイメント 管理 Amazon API Gateway Amazon DynamoDB Amazon S3

Slide 9

Slide 9 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. Amazon API Gateway の豊富なバックエンド統合 9 Lambda関数 EC2 その他AWSサービス バックエンド 外部リソース Amazon API Gateway クライアント REST

Slide 10

Slide 10 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. サーバーレスなWebアプリケーション 10

Slide 11

Slide 11 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 形で考えるサーバーレス設計 11 https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/

Slide 12

Slide 12 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. よくある実装 12 クライアント マイクロサービス マイクロサービス マイクロサービス DB DB DB REST REST REST REST

Slide 13

Slide 13 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. よくある実装 13 クライアント マイクロサービス マイクロサービス マイクロサービス DB DB DB Queue REST Stream Event クライアントは、REST や Queue、Streamで マイクロサービス と直接会話すると クライアントが知るべきマイクロサービス が どんどん増えて⾏く

Slide 14

Slide 14 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課題 • マイクロサービス 分割には成功したが、サービス が増えて行くにつれて クライアントがサービス エンドポイントに直接アクセスするのがつらい • 連携先への接続方式が千差万別 • クライアント側がバックエンドの能力を個々に把握する必要がある • 可用性、回復性、スループットなど • サービス 側の REST 契約が破棄されると直接クライアント影響が出る 14

Slide 15

Slide 15 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. API ゲートウェイパターンを導⼊ 15 クライアント マイクロサービス マイクロサービス マイクロサービス DB DB DB Queue REST Stream Event ゲートウェイ層によって、さまざまなバックエンド サービスの呼び出しを統⼀された APIで統合 > API ゲートウェイ パターン Amazon API Gateway

Slide 16

Slide 16 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. API ゲートウェイパターンを導⼊ 16 クライアント DB DB DB 連携先の接続方式が多種に渡っても、 クライアントからは REST でアクセス可能とする > Amazon API Gateway Amazon SQS AWS Lambda ELB AWS Fargate AWS Lambda REST

Slide 17

Slide 17 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課題の改善策 • マイクロサービス 分割には成功したが、サービス が増えて行くにつれてク ライアントがサービス エンドポイントに直接アクセスするのがつらい • 連携先の接続方式が千差万別 • API Gateway は多種多様なサービスと統合 • クライアント側がバックエンドの能力を個々に把握する必要がある • 連携先の能力に応じて、API Gateway のスループットを調整できる • サービス 側の REST 契約が破棄されると直接クライアント影響が出る • API Gateway 層で(ある程度)影響を吸収できる(e.g. template利用) 17

Slide 18

Slide 18 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. モノリスとの付き合い方 18

Slide 19

Slide 19 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. モノリス 19 クライアント 既存のモノリスをどのようにモダンにしていくか︖ REST DB モノリス

Slide 20

Slide 20 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課題 • 既存資産(モノリス)があり、全てをマイクロサービス に置き換えること はできない • モノリスとマイクロサービス を共存させたい 20

Slide 21

Slide 21 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. モノリスを分割 21 クライアント DB 既存のモノリスの前段に API Gateway を配置し て、クライアントとモノリスやマイクロサービス との繋がりを疎結合にすることができる > Amazon API Gateway AWS Lambda REST DB モノリス

Slide 22

Slide 22 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. モノリスを分割 22 クライアント DB > Amazon API Gateway REST DB モノリス Lambda関数⾃体を モノリシック にデザイン するのも、、、 AWS Lambda Lambda 関数の実装が複雑になってきたら WEB フレームワークを利⽤する︖

Slide 23

Slide 23 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. モノリスを分割 23 クライアント 処理が複雑になってきても、Lambda関数実⾏を 直列にするのはバッドプラクティス > Amazon API Gateway AWS Lambda REST DB モノリス AWS Lambda AWS Lambda DB

Slide 24

Slide 24 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. モノリスを分割 24 クライアント サーバーレスなワークフローを利⽤するのは︖ > Amazon API Gateway REST DB モノリス AWS Step Functions DB

Slide 25

Slide 25 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. サーバーレス ワークフロー / AWS Step Functions Step Functions Workflow Studio によ るワークフローの構築 ※ Express Workflow では、実⾏開始レートは毎秒 100,000 以上 をサポート

Slide 26

Slide 26 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課題の改善策 • 既存資産(モノリス)があり、全てをマイクロサービス に置き換えること はできない • モノリスとマイクロサービス を共存させたい • API Gateway でバックエンドを抽象化する • クライアントからはモノリスを意識させない 26

Slide 27

Slide 27 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. サーバーレスな ファイル変換処理 27

Slide 28

Slide 28 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 形で考えるサーバーレス設計 28 https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/

Slide 29

Slide 29 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. よくある実装 29 Bucket AWS Lambda Amazon API Gateway クライアント リクエスト毎に ファイル変換 raw data resize: 300x300 png → jpg *.zip GET

Slide 30

Slide 30 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課題 • リクエストごとに処理結果を返すと処理時間や処理回数が増える • 多数の変換バリエーションがあり、今後増える可能性もある 30

Slide 31

Slide 31 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. イベント駆動に 31 Bucket AWS Lambda クライアント PUT クライアント Bucket Amazon SNS resize: 300x300 png → jpg *.zip Object Key GET PUT GET

Slide 32

Slide 32 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課題の改善策 • リクエストごとに処理結果を返すと処理時間や処理回数が増える • ファイルが⽣成されたタイミングで処理する • 多数の変換バリエーションがあり、今後増える可能性もある • 多数のバリエーションは ファン・アウト で処理する 32

Slide 33

Slide 33 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. © 2022, Amazon Web Services, Inc. or its affiliates. サーバーレスな マルチテナント管理 33

Slide 34

Slide 34 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 形で考えるサーバーレス設計 34 https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/

Slide 35

Slide 35 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課題 • あるテナントが別のテナントの UX に影響を与えないようにしたい • 様々なテナントに、異なるレベルのパフォーマンスを提供したい • インバウンドのリクエストレートを適切に制限したい 35

Slide 36

Slide 36 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. ソリューション となる二つのパーツ 36 Throttling • 処理するリクエストの最大数/秒 を制限 • リクエストスパイクから バック エンドを保護 Quota • 時間あたりの API の全体的な使用量 を制限 • テナントによるシステムの過剰使用 から サービス を保護

Slide 37

Slide 37 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. Throttling をどこで発生させるか? 37 API Application Services Backend Resources Microservice Microservice 1 2 3 Tenant 1 Tenant 2 1 「フロントドア」でスロットル 2 マイクロサービスでのスロットル 3 リソースへのアクセスを制限

Slide 38

Slide 38 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. Amazon API Gateway の場合どうするか 38 Amazon API Gateway API Key 使用量プラン API Stage 1 2 3 • API キーは、クライアント リクエ ストを識別するための一意のキー • 使用量プランは、デプロイされた API ステージ/メソッドに誰がアク セスできるか、およびアクセスでき る量と速度を指定可能 • API ステージは、デプロイされた API の独立した環境 2 1 3

Slide 39

Slide 39 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. API x ステージ (default) Rate: ( ) rps Burst ( ) req メソッド x RESTリソース Rate: ( ) rps Burst ( ) req ステージ 上書き設定(任意) 使用量プランと Throttling の関係 39 API Gateway サーバー側 Throttling 設定 アカウント x リージョン Rate: 10000rps Burst 5000req 緩和可能 ※ Throttling と Quota 制限は、使用量プランのすべての API ステージ について集約される個々の API キーのリクエストに適用されます 使用量プラン Throttling 設定 (任意) メソッド x RESTリソース API x ステージ Rate: ( ) rps Burst ( ) req Rate: ( ) rps Burst ( ) req 使用量プランを 設定したリクエスト Quota 呼び出し回数制限 x-api-key: A x-api-key: B x-api-key: C 使用量プランを 設定していないリクエスト バックエンドリソース

Slide 40

Slide 40 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 使用量プランと API Key の関係 40 EC2上の エンドポイント AWS Lambd a AWSサービス インターネット リソース API Gateway 使用量プラン プレミアム 使用量プラン スタンダード Rate: ( 1000 ) rps Burst ( 500 ) req Quota Throttoling 100,000 / day Rate: ( 10 ) rps Burst ( 5 ) req Quota Throttoling 1,000 / day プレミアムを 設定したリクエスト x-api-key: A x-api-key: B x-api-key: C x-api-key: X x-api-key: Y スタンダードを 設定したリクエスト 例) 顧客ごとに API Keyを払い出す ※ThrottlingとQuota制限は、使用プランのすべての API ステージ について集約される個々の API キーのリクエストに適用されます

Slide 41

Slide 41 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課金モデル (料金プラン課金) • 初期利用は無料でサービス提供、サービス認知向上やサービスの 機能向上を行う(フィードバックを得る) • さらなる機能利用に対しては有料プランに誘導(フリーミアム) 41 使用量プラン プレミアム 使用量プラン スタンダード Free! ¥1,600/月 API Keys API Keys サービス利用者 例 ) ※単一のAPI Keyで複数のAPI販売に利用できます。

Slide 42

Slide 42 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課金モデル (Pay as you go = 従量課金) 42 aws apigateway get-usage \ --usage-plan-id 0qrdhs \ --key-id tn3gh64l3b \ --start-date "2022-10-01" \ --end-date "2022-10-31" \ --no-paginate 使用実績の確認 ( CLI ) { "usagePlanId": "0qrdhs", "startDate": "2022-10-01", "endDate": "2022-10-31", "items": { "tn3gh64l3b": [ [0, 100], [0, 100], (snipped) [10, 90], [80, 20], [80, 20] ] } API Key単位 Dailyの使用量グラフ [Dailyの使用量, Dailyの残量] 使用実績の確認 ( Management Console) ※直近の最長90日までの実績が取得可能

Slide 43

Slide 43 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. API KeyごとにQuota拡張できる 例) 月単位で Quota を設定し払い出した API Key を利用している顧客が、当月 の使用量を使い果たした場合など • ビジネスによっては追加費用を払え ば、月内の利用 Quota を確保する オプションを設置することもできる 43

Slide 44

Slide 44 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. AWS Lambda の無料利用枠 44 フリーミアムを 設計しやすい

Slide 45

Slide 45 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. 課題の改善策 • あるテナントが別のテナントの UX に影響を与えないようにしたい • API Key を分離することにより、テナント間の独立レベルをコントロール • 様々なテナントに、様々なレベルのパフォーマンスを提供したい • 使用量プランを使い、プランごとに異なるパフォーマンス量を定義 • インバウンドのリクエストレートを適切に制限したい • API Key を含むリクエスト以外を拒否できる 45

Slide 46

Slide 46 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. まとめ • AWS Lambda や Amazon API Gateway といったサーバーレスサービスを使う ことで、ユーザーはインフラストラクチャー管理のことを意識することなく、 ビジネスに直結したロジックの開発に集中することが可能に • サーバーレスならではのアーキテクチャデザインを考え、アーキテクチャの パターンを組み合わせることで、より現実的なサービス構築が可能に 46 Happy Coding !

Slide 47

Slide 47 text

ちょっぴり DIVE DEEP © 2022, Amazon Web Services, Inc. or its affiliates. Thank you! © 2022, Amazon Web Services, Inc. or its affiliates. Kensuke Shimokawa Slides https://speakerdeck.com/_kensh/ Qiita https://qiita.com/_kensh