ストーリー
佐藤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方式 | RPO | RTO | 備考 |
|---|---|---|---|---|
| 決済処理 | Active-Standby(Hot) | ~1秒 | 5分 | Aurora Global DB |
| 残高照会 | Active-Active | 0 | 0 | 両リージョンで読み取り可能 |
| 送金処理 | 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(東京) | 800 | RI 1年 |
| コンピューティング | EKS + EC2(大阪) | 400 | RI 1年、東京の50% |
| データベース | Aurora Global(2リージョン) | 600 | RI 1年 |
| キャッシュ | ElastiCache(2リージョン) | 200 | |
| メッセージング | MSK(2リージョン) | 300 | |
| ネットワーク | CloudFront + ALB + NAT | 200 | |
| セキュリティ | WAF + Shield + KMS + HSM | 150 | |
| 監視 | CloudWatch + Datadog | 100 | |
| ストレージ | S3 + EBS | 50 | |
| その他 | Route 53 + Secrets Manager等 | 50 | |
| 合計 | 2,850 | 年間約3.4億円 |
「予算3億円に対して概算3.4億円。約13%のオーバーだ。ここからコスト最適化が必要になる。リザーブドインスタンスの3年契約、Savings Plans、大阪リージョンの規模縮小 — CFOと交渉する材料を準備しておけ」 — 佐藤CTO
まとめ
| ポイント | 内容 |
|---|---|
| マルチリージョン | 東京(Primary)+ 大阪(Secondary)の2リージョン構成 |
| Kubernetes | 3つのノードグループ(決済CDE/一般/バッチ)で分離 |
| ネットワーク | CDE専用サブネット、NetworkPolicyによる厳格な分離 |
| DR | 決済はRPO~1秒/RTO5分、ティアード戦略 |
| コスト | 月額約2,850万円(年間約3.4億円)、最適化が必要 |
チェックリスト
- マルチリージョン構成とデータレプリケーション方式を理解した
- EKSクラスタのノードグループ分離戦略を把握した
- PCI DSS対応のVPC/ネットワーク設計を理解した
- DR戦略のティアード方式(RPO/RTOの差別化)を把握した
- インフラコスト概算と最適化の必要性を認識した
次のステップへ
次はStep 2の演習です。ここまで学んだシステムコンテキスト、サービス分解、データアーキテクチャ、インフラ設計を統合して、NexPayのアーキテクチャ設計ドキュメントを作成しましょう。
推定読了時間: 40分