LESSON 40分

ストーリー

佐藤CTO
データアーキテクチャの次はインフラの設計だ。NexPayの要件を思い出してほしい

佐藤CTOがホワイトボードに書き出します。

佐藤CTO
99.99%可用性、10,000 TPS、PCI DSS、マルチリージョン — これらをすべてインフラで支える必要がある。AWSの東京リージョン単一から、マルチAZ・マルチリージョン構成への進化が求められる
あなた
既存の単一リージョン構成からの移行も考慮する必要がありますね
佐藤CTO
その通り。最終形だけでなく、そこに至るまでの移行パスも設計の一部だ

マルチリージョン設計

リージョン構成

graph TD
    R53["Route 53<br/>(Latency-based Routing)"] --> TKY
    R53 --> OSK

    subgraph TKY["Tokyo Region (Primary)"]
        T_AZ["AZ-a / AZ-c / AZ-d"]
        T_EKS["EKS Cluster"]
        T_AUR["Aurora Primary"]
        T_EC["ElastiCache"]
        T_MSK["MSK Cluster"]
    end

    subgraph OSK["Osaka Region (Secondary)"]
        O_AZ["AZ-a / AZ-c / AZ-d"]
        O_EKS["EKS Cluster"]
        O_AUR["Aurora Replica"]
        O_EC["ElastiCache"]
        O_MSK["MSK Cluster"]
    end

    T_AUR -->|"レプリケーション"| O_AUR

    TKY --> CF["CloudFront<br/>(Global CDN)"]
    OSK --> CF

    classDef dns fill:#9b59b6,stroke:#8e44ad,color:#fff
    classDef primary fill:#3498db,stroke:#2980b9,color:#fff
    classDef secondary fill:#e67e22,stroke:#d35400,color:#fff
    classDef cdn fill:#27ae60,stroke:#1e8449,color:#fff
    class R53 dns
    class T_AZ,T_EKS,T_AUR,T_EC,T_MSK primary
    class O_AZ,O_EKS,O_AUR,O_EC,O_MSK secondary
    class CF cdn

リージョン間のデータレプリケーション

データ種別レプリケーション方式RPO備考
決済データAurora Global Database(同期)~1秒決済の一貫性を担保
ユーザーデータAurora Cross-Region Replica~1秒読み取り負荷の分散
キャッシュElastiCache Global Datastore~1秒残高キャッシュの同期
イベントストリームMSK Cross-Cluster Replication~数秒非同期レプリケーション
静的コンテンツS3 Cross-Region Replication~15分非同期で十分

Kubernetes クラスタ設計

EKS クラスタトポロジー

# EKS クラスタ設計
cluster:
  name: nexpay-production
  version: "1.28"
  region: ap-northeast-1

  nodeGroups:
    # 決済ワークロード(高優先度)
    payment-nodes:
      instanceType: c6i.2xlarge  # 8 vCPU, 16 GB
      minSize: 6
      maxSize: 30
      labels:
        workload-type: payment
        pci-scope: "true"
      taints:
        - key: pci-scope
          value: "true"
          effect: NoSchedule

    # 一般ワークロード
    general-nodes:
      instanceType: m6i.xlarge  # 4 vCPU, 16 GB
      minSize: 9
      maxSize: 45
      labels:
        workload-type: general

    # バッチ/分析ワークロード
    batch-nodes:
      instanceType: r6i.xlarge  # 4 vCPU, 32 GB
      minSize: 3
      maxSize: 20
      labels:
        workload-type: batch

  namespaces:
    - name: payment-cde        # CDE環境(PCI DSSスコープ)
      networkPolicy: strict     # Ingress/Egress制限
    - name: financial-services  # 送金・投資
      networkPolicy: standard
    - name: platform-services   # Account, KYC, Notification
      networkPolicy: standard
    - name: observability       # 監視・ログ
      networkPolicy: monitoring

PCI DSS対応のネットワーク分離

# CDE用NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: cde-isolation
  namespace: payment-cde
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
  ingress:
    # API Gatewayからのみ受信
    - from:
        - namespaceSelector:
            matchLabels:
              name: api-gateway
      ports:
        - port: 8443
          protocol: TCP
  egress:
    # Aurora(CDE用)のみ
    - to:
        - ipBlock:
            cidr: 10.0.100.0/24  # CDE DB subnet
      ports:
        - port: 5432
          protocol: TCP
    # HSM/KMSへのアクセス
    - to:
        - ipBlock:
            cidr: 10.0.200.0/24  # HSM subnet
      ports:
        - port: 443
          protocol: TCP

VPC 設計

ネットワークアーキテクチャ

graph TD
    VPC["VPC: 10.0.0.0/16"]
    subgraph PUB["Public Subnets
10.0.0.0/20"] ALB["ALB"] NATGWA["NAT GW-a"] NATGWC["NAT GW-c"] end subgraph PRIV["Private App Subnets
10.0.16.0/20"] EKS_GEN["EKS Nodes - general
Account, Transfer, Invest"] end subgraph CDE_APP["CDE App Subnets
10.0.64.0/20"] EKS_CDE["EKS Nodes - payment-cde
Payment, Tokenization"] end subgraph PRIVDB["Private DB Subnets
10.0.96.0/20"] AUR_CDE["Aurora
CDE"] AUR_GEN["Aurora
General"] ELASTI["ElastiCache"] end subgraph CDEDB["CDE DB Subnets
10.0.100.0/24"] VAULT["Card Vault"] HSM["HSM"] end VPC --- PUB VPC --- PRIV VPC --- CDE_APP VPC --- PRIVDB VPC --- CDEDB style VPC fill:#1e293b,stroke:#475569,color:#f8fafc style PUB fill:#d1fae5,stroke:#059669,color:#065f46 style PRIV fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#1e40af style CDE_APP fill:#fee2e2,stroke:#dc2626,color:#991b1b style PRIVDB fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#92400e style CDEDB fill:#fee2e2,stroke:#dc2626,color:#991b1b style ALB fill:#d1fae5,stroke:#059669,color:#065f46 style NATGWA fill:#d1fae5,stroke:#059669,color:#065f46 style NATGWC fill:#d1fae5,stroke:#059669,color:#065f46 style EKS_GEN fill:#dbeafe,stroke:#2563eb,color:#1e40af style EKS_CDE fill:#fee2e2,stroke:#dc2626,color:#991b1b style AUR_CDE fill:#fef3c7,stroke:#d97706,color:#92400e style AUR_GEN fill:#fef3c7,stroke:#d97706,color:#92400e style ELASTI fill:#fef3c7,stroke:#d97706,color:#92400e style VAULT fill:#fee2e2,stroke:#dc2626,color:#991b1b style HSM fill:#fee2e2,stroke:#dc2626,color:#991b1b

災害復旧設計

DR戦略

サービス層DR方式RPORTO備考
決済処理Active-Standby(Hot)~1秒5分Aurora Global DB
残高照会Active-Active00両リージョンで読み取り可能
送金処理Active-Standby(Warm)~1秒15分フェイルオーバー後に再開
投資処理Active-Standby(Cold)1時間1時間証券APIの接続先切替が必要
管理画面Active-Standby(Cold)1時間2時間優先度低

フェイルオーバーの手順

自動フェイルオーバー条件:
  1. ヘルスチェック失敗が3回連続(15秒間隔)
  2. 決済成功率が95%を下回る(1分間の移動平均)
  3. リージョン全体のAZ障害を検知

フェイルオーバー手順:
  Step 1: Route 53のヘルスチェックが失敗を検知(自動)
  Step 2: DNSフェイルオーバーで大阪リージョンにルーティング(30秒)
  Step 3: Aurora Global DBのフェイルオーバー実行(60秒)
  Step 4: 大阪リージョンのEKSクラスタがトラフィック受入開始
  Step 5: 処理中のトランザクションの整合性チェック(自動)
  Step 6: アラート通知 → SREチーム確認

  合計RTO: 約5分
フェイルオーバー訓練計画

ゲームデイ(DR訓練)

頻度訓練内容参加者
月次個別サービスのフェイルオーバー各チーム
四半期AZ障害シミュレーションSRE + 全チーム
年次リージョンフェイルオーバー(全体)全社

訓練のルール:

  • 本番環境で実施(カナリアトラフィックで確認後)
  • 訓練結果はポストモーテムとして記録
  • 発見された問題は次回訓練までに修正

インフラコスト概算

月額コスト見積もり

カテゴリサービス月額コスト(万円)備考
コンピューティングEKS + EC2(東京)800RI 1年
コンピューティングEKS + EC2(大阪)400RI 1年、東京の50%
データベースAurora Global(2リージョン)600RI 1年
キャッシュElastiCache(2リージョン)200
メッセージングMSK(2リージョン)300
ネットワークCloudFront + ALB + NAT200
セキュリティWAF + Shield + KMS + HSM150
監視CloudWatch + Datadog100
ストレージS3 + EBS50
その他Route 53 + Secrets Manager等50
合計2,850年間約3.4億円

「予算3億円に対して概算3.4億円。約13%のオーバーだ。ここからコスト最適化が必要になる。リザーブドインスタンスの3年契約、Savings Plans、大阪リージョンの規模縮小 — CFOと交渉する材料を準備しておけ」 — 佐藤CTO


まとめ

ポイント内容
マルチリージョン東京(Primary)+ 大阪(Secondary)の2リージョン構成
Kubernetes3つのノードグループ(決済CDE/一般/バッチ)で分離
ネットワークCDE専用サブネット、NetworkPolicyによる厳格な分離
DR決済はRPO~1秒/RTO5分、ティアード戦略
コスト月額約2,850万円(年間約3.4億円)、最適化が必要

チェックリスト

  • マルチリージョン構成とデータレプリケーション方式を理解した
  • EKSクラスタのノードグループ分離戦略を把握した
  • PCI DSS対応のVPC/ネットワーク設計を理解した
  • DR戦略のティアード方式(RPO/RTOの差別化)を把握した
  • インフラコスト概算と最適化の必要性を認識した

次のステップへ

次はStep 2の演習です。ここまで学んだシステムコンテキスト、サービス分解、データアーキテクチャ、インフラ設計を統合して、NexPayのアーキテクチャ設計ドキュメントを作成しましょう。


推定読了時間: 40分