Skip to content

課題7: 旅行予約サイトのサーバーレスAPI基盤

難易度: 🟢 初級


分類情報

項目内容
難易度初級
カテゴリマイクロサービス・API
処理タイプ非同期
使用IaCSAM
想定所要時間4-5時間

学習するAWSサービス

この演習では以下のAWSサービスを実践的に学習します。

メインサービス

サービス役割学習ポイント
Amazon API GatewayREST APIエンドポイントリソース設計、メソッド設定、キャッシュ
AWS Lambdaビジネスロジック実行コールドスタート対策、メモリ最適化
Amazon DynamoDB検索結果キャッシュ、予約データTTL、GSI、パーティション設計
Amazon SQS非同期処理キュー予約確認メール送信の分離

補助サービス

サービス役割
Amazon CloudFrontAPI キャッシング、WAF連携
Amazon CloudWatchログ・メトリクス監視
AWS X-Ray分散トレーシング
AWS WAFAPI保護
AWS IAMサービス間の権限管理

最終構成図

コンポーネント役割
User旅行予約サイトのユーザー
CloudFrontCDN + WAF連携でAPI保護・キャッシュ
API GatewayREST APIエンドポイント
Lambda Hotelホテル検索処理
Lambda Flightフライト検索処理
Lambda Booking予約作成処理
DynamoDB Cache検索結果キャッシュ
DynamoDB Bookings予約データ保存
SQS非同期処理キュー
Lambda Confirm予約確認メール送信
SESメール配信

API エンドポイント設計

メソッドパス説明
GET/hotels/searchホテル検索
GET/hotels/ホテル詳細取得
GET/flights/searchフライト検索
GET/flights/フライト詳細取得
POST/bookings予約作成
GET/bookings/予約詳細取得
DELETE/bookings/予約キャンセル

シナリオ

企業プロフィール

〇〇株式会社は、ホテルと航空券を組み合わせたパッケージ旅行の予約サービスを提供しています。日次約10万リクエストを処理し、ゴールデンウィークや年末年始にはピーク時5倍のトラフィックが発生します。

現状の課題

既存のモノリシックなAPIサーバーでは、ピーク時の対応に問題が発生しています:

  1. スケーリングの遅延:EC2のオートスケーリングに5-10分かかる
  2. コスト非効率:通常時もピーク対応用のキャパシティを維持
  3. 検索のレイテンシ:複数の外部APIを順次呼び出しており、応答が遅い
  4. キャッシュ効率の悪さ:同一検索が繰り返されているが、毎回外部APIを叩いている

数値で見る問題

  • 通常時リクエスト数:10万件/日(平均 1.2 req/sec)
  • ピーク時リクエスト数:50万件/日(平均 6 req/sec、瞬間最大 50 req/sec)
  • 検索API応答時間:平均 3秒(外部API呼び出し含む)
  • インフラコスト:月額 $3,000(常時稼働EC2)
  • ピーク時のエラー率:5%

成功指標(KPI)

指標現状目標
検索API応答時間3秒1秒以内
ピーク時エラー率5%0.1%以下
インフラコスト$3,000/月$1,000/月
スケーリング時間5-10分即時

達成目標

この演習で習得できるスキル:

技術的な学習ポイント

  1. API GatewayとLambdaによるサーバーレスAPI構築
  2. DynamoDBを使った高速な検索結果キャッシュ
  3. 非同期処理による外部API呼び出しの並列化
  4. SAMを使ったサーバーレスアプリケーションのIaC

実務で活かせる知識

  • サーバーレスAPIの設計パターン
  • キャッシュ戦略によるパフォーマンス改善
  • 非同期処理による応答時間短縮
  • Infrastructure as Codeによるデプロイ自動化


前提条件

必要な知識

  • REST APIの基本概念
  • Python または Node.js の基礎
  • DynamoDBの基本操作

事前準備

  1. AWSアカウント
  2. AWS CLI v2
  3. AWS SAM CLI
  4. Python 3.11 または Node.js 18.x

環境要件

bash
# SAM CLIインストール
pip install aws-sam-cli

# バージョン確認
sam --version  # 1.90.0以上

トラブルシューティング課題

Challenge 1: Lambda コールドスタートが遅い

状況: 初回リクエストで3秒以上のレイテンシが発生

調査ポイント:

  1. CloudWatch Logs で Init Duration を確認
  2. Lambda のメモリサイズを確認
  3. 依存パッケージのサイズを確認

解決策:

yaml
# Provisioned Concurrency の設定
HotelSearchFunction:
  Type: AWS::Serverless::Function
  Properties:
    # ... 既存の設定 ...
    ProvisionedConcurrencyConfig:
      ProvisionedConcurrentExecutions: 5

Challenge 2: DynamoDB の読み取り容量超過

状況: ピーク時に ProvisionedThroughputExceededException が発生

調査ポイント:

  1. CloudWatch で ConsumedReadCapacityUnits を確認
  2. ホットパーティションの有無を確認
  3. キャッシュヒット率を確認

Challenge 3: 外部API呼び出しタイムアウト

状況: パートナーAPIの応答が遅く、Lambdaがタイムアウト

調査ポイント:

  1. X-Ray でボトルネックを特定
  2. 各外部APIの応答時間を確認
  3. 並列呼び出しが正しく動作しているか確認

設計の考察ポイント

ディスカッション1: キャッシュ戦略

テーマ: TTL設定とキャッシュ無効化

パターンメリットデメリット
短いTTL(1-5分)鮮度が高いキャッシュヒット率低下
長いTTL(30分以上)ヒット率向上古いデータを返すリスク
明示的無効化精度が高い実装が複雑

ディスカッション2: API Gateway vs ALB + Lambda

テーマ: エントリーポイントの選択

観点API GatewayALB + Lambda
コスト(高トラフィック)高い安い
機能豊富(認証、スロットリング等)基本的
WebSocket対応非対応

ディスカッション3: 同期 vs 非同期処理

テーマ: 予約確定処理のパターン

選択肢:

  1. 完全同期: 予約→決済→確認メールを1リクエストで
  2. 部分非同期: 予約→決済は同期、確認メールは非同期
  3. Saga パターン: 全処理を非同期で、補償トランザクション

発展課題

Advanced 1: GraphQL API への移行

課題: AppSync を使って GraphQL API を構築し、クライアントが必要なデータのみを取得

Advanced 2: リアルタイム価格更新

課題: WebSocket API と DynamoDB Streams を使って、価格変動をリアルタイムにクライアントへプッシュ

Advanced 3: マルチリージョン対応

課題: Route 53 ヘルスチェックと DynamoDB Global Tables を使った災害対策


想定コストと削減方法

月額コスト概算

サービス使用量月額コスト
API Gateway300万リクエスト$10.50
Lambda300万リクエスト × 500ms × 256MB$6.25
DynamoDB (SearchCache)10GB + 300万WCU + 300万RCU$50
DynamoDB (Bookings)5GB + 10万WCU + 50万RCU$15
SQS50万メッセージ$0.20
CloudWatch Logs10GB$5
X-Ray100万トレース$5
WAF1 WebACL + 300万リクエスト$8

合計: 約 $100/月(約15,000円)

従来構成との比較: $3,000 → $100(約97%削減)

コスト削減のヒント

  1. Provisioned Concurrencyの最適化: 本当に必要な時間帯のみ設定
  2. DynamoDB On-demand: 予測可能なトラフィックならProvisioned Mode
  3. Lambda メモリ最適化: Power Tuning で最適なメモリサイズを特定

学習のポイント

重要な概念の整理

  1. サーバーレスの特性

    • 自動スケーリング
    • 従量課金
    • コールドスタート
  2. DynamoDBキャッシュパターン

    • TTLによる自動削除
    • 一貫性のトレードオフ
    • パーティションキー設計
  3. 非同期処理のメリット

    • レスポンス時間の短縮
    • 障害の分離
    • リトライの容易さ

GCPとの比較

概念AWSGCP
API GatewayAPI GatewayCloud Endpoints / API Gateway
サーバーレス関数LambdaCloud Functions
NoSQL DBDynamoDBFirestore / Bigtable
メッセージキューSQSCloud Tasks / Pub/Sub
WAFWAFCloud Armor

次のステップ

  1. 認証・認可の追加(Cognito)
  2. キャッシュ層の追加(CloudFront、ElastiCache)
  3. CI/CD パイプラインの構築