AWS のアプリケーションアーキテクチャパターン

AWS へのアプリケーションデプロイ

Dunieski Otano

Amazon Web Services Solutions Architect

講師紹介

講師のDunieski Otano。AWS Solutions Architectとして約10年のクラウド経験を持つ

AWS へのアプリケーションデプロイ

適切なアーキテクチャが重要な理由

ライトテーマの意思決定図。アーキテクチャ選択のノードが結合度、状態、通信の3つの要素に分岐し、下部にトレードオフを示す天秤アイコンが表示されている

  • アーキテクチャはトレードオフの集合であり、唯一の正解はありません
    • 設計の選択を左右する3つの問い:
      • コンポーネント間の結合度はどの程度か
      • 状態はどこで管理するか
      • 通信は同期か非同期か
    • 流行ではなく、ワークロードに合ったパターンを選ぶ
AWS へのアプリケーションデプロイ

金曜夜の連鎖障害

  • 決済 API の遅延がチェックアウト全体をブロックした
  • すべてのサービスがその API を同期的に待機していた
  • 解決策はより速い API ではなく、アーキテクチャの見直し

密結合によって停止するサービスと、メッセージキューで疎結合化されたサービスの比較図

AWS へのアプリケーションデプロイ

アーキテクチャの選択がデプロイを左右する理由

1つのサービス障害が全体に波及する脆弱な密結合アーキテクチャと、キューバッファが障害を隔離して他サービスは稼働し続ける堅牢な設計の比較図

  • 選択したパターンがアプリのスケーリングと障害挙動を決定します
    • 密結合の設計は高負荷時に破綻します
  • 適切なパターンがデプロイを予測可能にします
    • 同じコードでも、本番環境での挙動は大きく異なります
AWS へのアプリケーションデプロイ

主要なアーキテクチャパターン

  • モノリシック:単一のデプロイ単位。導入がシンプル
  • マイクロサービス:独立したサービスを個別にデプロイ
  • イベント駆動:直接呼び出しではなく、イベントに反応するコンポーネント
    • ファンアウトはイベント駆動のサブパターンで、1つのイベントを複数のコンシューマーに配信

 

3つのアプリケーションアーキテクチャパターンの比較図。モノリシックは単一の積み重なったブロック、マイクロサービスは独立してデプロイ可能なサービス群、イベント駆動はイベントバスを使用し、ファンアウトがイベント駆動パネル内のサブパターンとして1つのイベントを複数のコンシューマーに発行する様子を示す

AWS へのアプリケーションデプロイ

ステートフルとステートレス

  • ステートレス:リクエスト間でクライアントデータを保持しない
    • どのインスタンスでも任意のリクエストを処理できる
  • ステートフル:インスタンスが過去のやり取りを記憶する
  • ステートレス設計が水平スケーリングを可能にします
    • 共有状態はDynamoDBまたはElastiCacheに移行する

任意のリクエストに対応できる左側のステートレス関数インスタンスと、特定のクライアントセッションに紐付いた右側のステートフルインスタンスの比較図

AWS へのアプリケーションデプロイ

密結合と疎結合

呼び出し元が低速な呼び出し先を待機する密結合と、SQSキューがメッセージをバッファリングしてプロデューサーが処理を継続できる疎結合の比較図

  • 密結合:呼び出し元は呼び出し先のレスポンスを待機します
  • 1つのサービスが遅いと、連鎖全体が停止します
  • 疎結合:サービス間にAmazon SQSキューを配置します
  • コンシューマーが停止中でも、プロデューサーは処理を継続できます
AWS へのアプリケーションデプロイ

同期と非同期

  • 同期:呼び出し元は結果が返るまでブロックします
  • 呼び出し元が即座に結果を必要とする場合に使用します
  • 非同期:呼び出し元は処理を渡してすぐに戻ります
  • 低速、バースト的、または緊急性の低い処理に使用します

 

左側はレスポンスが届くまで呼び出し元がブロックする同期呼び出し、右側はすぐに返してバックグラウンドで処理が続く非同期ハンドオフの比較図

AWS へのアプリケーションデプロイ

サードパーティ呼び出しの耐障害性パターン

  • 指数バックオフによるリトライ:再試行間隔を徐々に延ばします
  • サーキットブレーカー:障害中のサービスへの呼び出しを一時停止します
  • デッドレターキュー:繰り返し失敗するメッセージを隔離します
  • これらを組み合わせて使用します。無制限のリトライは障害を悪化させます

3つの耐障害性パターンの図。指数バックオフのリトライ曲線、障害中サービスへの呼び出しを停止するサーキットブレーカー、リトライを使い切ったメッセージを捕捉するデッドレターキュー

AWS へのアプリケーションデプロイ

練習しましょう!

AWS へのアプリケーションデプロイ

Preparing Video For Download...