メインコンテンツへスキップ
見出し画像
Photo byskomeda

サーバーレス構成:全体構成のまとめ


    現在の構成要素

    使用しているAWSサービス

    フロントエンド層:

    • S3 - Reactの静的ファイル(HTML、CSS、JS)をホスティング

    • CloudFront - CDN、フロントエンドの配信

    バックエンド層:

    • API Gateway - RESTful APIのエントリーポイント

    • Lambda - ビジネスロジックの実行(バックエンド処理のみ)

    認証・認可層:

    • Cognito User Pool - ユーザー認証、JWTトークン発行

    • IAM - AWSリソースへのアクセス制御

    運用・監視層:

    • CloudWatch - ログ収集、メトリクス監視、アラート

    • Systems Manager - パラメータストア(設定値、シークレット管理)

    全体アーキテクチャ図

    【クライアント層】
    ユーザー(ブラウザ)
        ↓
        
    【CDN層】
    CloudFront
        ↓
        ├─────────────┬─────────────┐
        ↓             ↓             ↓
        
    【フロントエンド層】    【認証層】        【バックエンドAPI層】
    S3(React)      Cognito User Pool   API Gateway
                          ↓                  ↓
                      JWTトークン発行       Lambda(バックエンド処理)
                                            ↓
                                         データベース
                                         
    【横断的サービス】
    - IAM(全体のアクセス制御)
    - Systems Manager(設定管理)
    - CloudWatch(ログ・監視)

    詳細な構成と役割

    1. フロントエンド配信フロー

    ユーザー
      ↓
    CloudFront(エッジロケーション)
      ↓
    S3バケット(Reactアプリの静的ファイル)
      ↓
    ブラウザでReactが実行

    CloudFrontの役割:

    • 静的ファイルのキャッシュと高速配信

    • HTTPS終端

    • パスベースルーティング(/api/* → API Gateway、それ以外 → S3)

    S3の役割:

    • Reactのビルド成果物(HTML、CSS、JS)を保存

    • 静的ウェブサイトホスティング

    • CloudFrontのオリジンとして機能

    2. 認証フロー

    ユーザー(ログイン)
      ↓
    CloudFront
      ↓
    Cognito User Pool(Hosted UIまたはカスタムUI)
      ↓
    認証成功
      ↓
    JWTトークン(IDトークン、アクセストークン、リフレッシュトークン)
      ↓
    Reactアプリ(localStorageに保存)

    Cognito User Poolの役割:

    • ユーザー登録・管理

    • パスワード認証

    • MFA(多要素認証)対応

    • JWTトークンの発行・検証

    IAMの役割(認証関連):

    • Cognitoの実行ロール

    • Lambdaがトークンを検証する際の権限

    3. API呼び出しフロー

    Reactアプリ(ブラウザ上で実行)
      ↓(JWTトークン付きリクエスト)
    CloudFront
      ↓(パス: /api/*)
    API Gateway
      ↓(Cognito Authorizer)
    JWTトークン検証
      ↓(認可成功)
    Lambda関数(バックエンド処理)
      ↓(必要に応じて)
    データベース(RDS PostgreSQL等)
      ↓
    レスポンス

    API Gatewayの役割:

    • RESTful APIのエンドポイント提供

    • Cognito Authorizerによる認証・認可

    • リクエストの検証

    • レート制限(スロットリング)

    • Lambdaへのプロキシ

    Lambda(バックエンド)の役割:

    • ビジネスロジックの実行

    • データベース操作

    • 外部API連携

    • Systems Managerからの設定取得

    4. 設定管理とシークレット管理

    Lambda関数
      ↓
    Systems Manager Parameter Store
      ├─ 環境変数(dev/staging/prod)
      ├─ APIキー
      ├─ データベース接続情報
      └─ 外部サービスの認証情報

    Systems Managerの役割:

    • 環境別の設定値管理

    • シークレット情報の暗号化保存

    • Lambda関数から動的に設定を取得

    • バージョン管理

    IAMの役割(設定管理関連):

    • Lambdaが Parameter Store にアクセスする権限

    • KMSによる暗号化・復号化の権限

    5. 監視とログ管理

    各AWSサービス
      ↓
    CloudWatch Logs
      ├─ CloudFront アクセスログ
      ├─ API Gateway 実行ログ
      ├─ Lambda 関数ログ
      └─ Cognito ログ
      
    CloudWatch Metrics
      ├─ API呼び出し回数
      ├─ Lambda実行時間
      └─ エラー率
      
    CloudWatch Alarms
      ├─ エラー率しきい値超過
      └─ レイテンシ上昇

    CloudWatchの役割:

    • 集中ログ管理

    • メトリクスの可視化

    • アラート通知

    • ログ検索・分析(CloudWatch Insights)

    IAMロールとポリシー構成

    Lambda実行ロール

    Lambda関数
      ↓
    IAM実行ロール
      ├─ CloudWatch Logsへの書き込み権限
      ├─ Systems Manager Parameter Store読み取り権限
      ├─ KMS復号化権限(暗号化されたパラメータ用)
      ├─ RDS接続権限(必要に応じて)
      └─ 他のAWSサービスへのアクセス権限

    Cognito認証後のロール

    認証済みユーザー
      ↓
    Cognito Identity Pool(必要に応じて)
      ↓
    IAM認証ロール
      └─ S3の特定バケットへのアクセス(ユーザーアップロード等)

    API Gateway実行ロール

    API Gateway
      ↓
    IAM実行ロール
      ├─ Lambda呼び出し権限
      └─ CloudWatch Logsへの書き込み権限

    データフロー例:ユーザーがAPIを呼ぶケース

    ステップバイステップ

    1. ユーザーがブラウザでアクセス
       ↓
       
    2. CloudFront → S3 → Reactアプリ(HTML/CSS/JS)がロード
       ↓
       
    3. ブラウザ上でReactが実行開始
       ↓
       
    4. ユーザーがログインボタンをクリック
       ↓
       
    5. CloudFront → Cognito User Pool → 認証
       ↓
       
    6. JWTトークンがReactに返される
       ↓
       
    7. ReactがlocalStorageにトークンを保存
       ↓
       
    8. ユーザーがデータ取得ボタンをクリック
       ↓
       
    9. Reactが fetch('/api/users/me', { headers: { Authorization: 'Bearer <token>' }})
       ↓
       
    10. CloudFront → API Gateway
        ↓
        
    11. API Gateway
        ├─ Cognito Authorizer → トークン検証 → OK
        └─ Lambda呼び出し
        ↓
        
    12. Lambda関数(バックエンド処理)
        ├─ Systems Manager → DB接続情報取得
        ├─ データベースクエリ実行
        └─ レスポンス生成
        ↓
        
    13. CloudWatch Logs
        ├─ Lambda実行ログ記録
        └─ API Gateway ログ記録
        ↓
        
    14. レスポンスがReactに返される
        ↓
        
    15. ブラウザに結果表示

    監視とアラート設計

    CloudWatch Logs構成

    ロググループ:

    • /aws/cloudfront/distribution-id - CloudFrontアクセスログ

    • /aws/api-gateway/api-name - API Gateway実行ログ

    • /aws/lambda/function-name - Lambda関数ログ

    • /aws/cognito/userpools/pool-id - Cognito認証ログ

    ログ保持期間:

    • 開発環境: 7日

    • 本番環境: 30日〜90日

    CloudWatch Alarms

    重要なアラート:

    1. API Gateway 5xxエラー率

      • しきい値: 5%以上

      • 期間: 5分間

      • アクション: SNS通知

    2. Lambda関数エラー率

      • しきい値: 10%以上

      • 期間: 5分間

      • アクション: SNS通知

    3. Cognito認証失敗率

      • しきい値: 30%以上

      • 期間: 5分間

      • アクション: SNS通知

    4. Lambda実行時間

      • しきい値: 3秒以上

      • 期間: 5分間

      • アクション: SNS通知(パフォーマンス劣化)

    セキュリティ設計のポイント

    1. 多層防御

    レイヤー1: CloudFront
      └─ HTTPS終端、DDoS保護(AWS Shield Standard)
    
    レイヤー2: API Gateway
      ├─ Cognito Authorizerで認証・認可
      ├─ リクエストバリデーション
      └─ スロットリング
    
    レイヤー3: Lambda
      ├─ IAMロールで最小権限の原則
      ├─ 入力値の再検証
      └─ 出力のサニタイズ
    
    レイヤー4: データベース
      ├─ VPC内に配置(プライベートサブネット)
      ├─ セキュリティグループで制限
      └─ 暗号化(保管時・転送時)

    2. 認証・認可フロー

    1. Cognito User Pool
       ├─ パスワードポリシー(強度要件)
       ├─ MFA(多要素認証)対応
       └─ アカウントロック機能
    
    2. JWTトークン
       ├─ 有効期限(IDトークン: 1時間、アクセストークン: 1時間)
       ├─ リフレッシュトークン(30日)
       └─ 署名検証(RS256)
    
    3. API Gateway Authorizer
       ├─ トークンの有効性検証
       ├─ スコープ・クレーム確認
       └─ キャッシュ(5分、パフォーマンス最適化)

    3. シークレット管理

    Systems Manager Parameter Store
      ├─ /dev/db/password(SecureString、KMS暗号化)
      ├─ /dev/api/external-service-key(SecureString)
      ├─ /prod/db/password(SecureString、KMS暗号化)
      └─ /prod/api/external-service-key(SecureString)
    
    Lambda関数
      ↓(IAM権限で制御)
    Parameter Store(環境別に取得)
      ↓(KMS復号化)
    平文として使用

    ベストプラクティス:

    • 環境変数には直接シークレットを入れない

    • 実行時にParameter Storeから動的取得

    • KMSで暗号化

    • IAMポリシーで最小権限

    コスト見積もり

    月額コスト試算(小規模構成)

    前提条件:

    • リクエスト数: 月間1000万リクエスト

    • データ転送: 月間100GB

    • Lambda実行時間: 平均200ms

    各サービスのコスト:

    サービス用途月額コスト(USD)CloudFrontデータ転送100GB$8.50S3静的ホスティング$0.50API Gateway1000万リクエスト$35.00Lambda実行時間$5.00Cognitoアクティブユーザー1000人$5.00CloudWatchログ保存・メトリクス$3.00Systems ManagerParameter Store$0.00(無料枠)合計約$57.00

    スケール時の変動要素:

    • リクエスト数増加 → API Gateway、Lambdaのコスト増

    • ユーザー数増加 → Cognitoのコスト増

    • ログ量増加 → CloudWatchのコスト増

    サーバーレス構成のメリット

    1. 運用コストの削減

    • サーバー管理不要 - EC2インスタンスの管理、パッチ適用、スケーリング設定が不要

    • 従量課金 - 使った分だけ支払い、アイドル時のコストゼロ

    • 自動スケール - トラフィック増減に自動対応

    2. 開発効率の向上

    • インフラ管理の最小化 - アプリケーションロジックに集中

    • デプロイの高速化 - Lambda関数の更新は数秒

    • 環境構築の簡素化 - マネージドサービスの活用

    3. 可用性と耐障害性

    • マルチAZ自動配置 - AWSが自動的に冗長化

    • グローバル配信 - CloudFrontのエッジロケーション

    • 障害時の自動復旧 - AWSが管理

    まとめ

    現在の構成の特徴

    フロントエンド:

    • S3 + CloudFrontでReactを高速配信

    • 静的ファイルのグローバルキャッシュ

    バックエンド:

    • API Gateway + Lambdaで完全サーバーレス

    • Cognito User Poolで堅牢な認証基盤

    運用:

    • CloudWatchで集中監視

    • Systems Managerで設定管理

    • IAMで最小権限の原則

    アーキテクチャ全体像

    【完成形】
    クライアント
      ↓
    CloudFront
      ├→ S3(React - 静的ファイル)
      ├→ API Gateway(Cognito Authorizer)→ Lambda(バックエンド処理)
      └→ Cognito User Pool(認証)
      
    【横断的サービス】
    - IAM(最小権限の原則)
    - Systems Manager(シークレット管理)
    - CloudWatch(ログ・監視・アラート)

    この構成により:

    • 完全なサーバーレスアーキテクチャを実現

    • 運用負荷の最小化

    • コスト効率の最大化

    • スケーラビリティの確保

     
     

    けい

     
     
    96/名古屋/Webエンジニア 旅行、銭湯サウナ。 ラーメン、そば、バームクーヘン、プレッツェル、 J-HIPHOP、ILLIT

    あなたへのおすすめ