
サーバーレス構成:全体構成のまとめ
現在の構成要素
使用している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
重要なアラート:
API Gateway 5xxエラー率
しきい値: 5%以上
期間: 5分間
アクション: SNS通知
Lambda関数エラー率
しきい値: 10%以上
期間: 5分間
アクション: SNS通知
Cognito認証失敗率
しきい値: 30%以上
期間: 5分間
アクション: SNS通知
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(ログ・監視・アラート)この構成により:
完全なサーバーレスアーキテクチャを実現
運用負荷の最小化
コスト効率の最大化
スケーラビリティの確保