EXERCISE 90分

ストーリー

佐藤CTO
理論は十分だ。ここからは実際のシステムで非機能要件を定義してみよう
佐藤CTO
新規ECプラットフォームの構築プロジェクトが始まる。ビジネス側からは『とにかく速くて落ちないシステムを』と言われているが、それでは要件として不十分だ。定量的な非機能要件を定義してほしい

あなたは、ビジネス要件をもとに、具体的で計測可能な非機能要件を策定することになりました。


ミッション概要

ミッションテーマ目安時間
Mission 1非機能要件の発見と分類15分
Mission 2パフォーマンス要件の定義15分
Mission 3スケーラビリティ設計15分
Mission 4可用性と災害復旧15分
Mission 5セキュリティ要件と脅威モデル15分
Mission 6非機能要件ドキュメント完成15分

前提条件

以下のECプラットフォームの要件が与えられています:

事業概要:
- BtoC向けECプラットフォーム
- 初年度ユーザー数: 10万人、3年後目標: 100万人
- 商品数: 10万SKU
- ピーク時(セール): 通常の10倍のトラフィック
- 決済: クレジットカード、QRコード決済
- 24時間365日稼働(メンテナンスウィンドウは深夜2-4時)

Mission 1: 非機能要件の発見と分類(15分)

要件

上記のビジネス要件から、非機能要件を洗い出し、以下のカテゴリに分類してください。

  • パフォーマンス
  • スケーラビリティ
  • 可用性
  • セキュリティ
  • 保守性
  • 運用性

期待される成果物

各カテゴリごとに最低2つの非機能要件を記述すること。

解答例
カテゴリ非機能要件
パフォーマンス商品検索のレスポンスタイムが95パーセンタイルで200ms以内
パフォーマンス商品詳細ページの表示が95パーセンタイルで500ms以内
スケーラビリティ通常時の10倍のトラフィックに15分以内でスケールアウト可能
スケーラビリティ3年間でユーザー数10倍に対応できるアーキテクチャ
可用性年間稼働率99.95%以上(ダウンタイム年間4.38時間以内)
可用性RPO: 1時間以内、RTO: 4時間以内
セキュリティPCI DSS Level 1準拠
セキュリティ個人情報の暗号化(保存時・通信時)
保守性新機能のデプロイが1日1回以上可能
保守性テストカバレッジ80%以上
運用性全サービスの健全性を単一ダッシュボードで監視可能
運用性障害検知から通知まで5分以内

Mission 2: パフォーマンス要件の定義(15分)

要件

以下のユーザージャーニーに対して、具体的なパフォーマンスSLAを定義してください。

  1. トップページ表示
  2. 商品検索
  3. 商品詳細ページ表示
  4. カートへの追加
  5. 決済処理

期待される成果物

各操作について、p50/p95/p99のレスポンスタイム目標を設定すること。

解答例
操作p50p95p99備考
トップページ表示300ms800ms1.5sCDN利用前提
商品検索150ms400ms1sElasticsearchバックエンド
商品詳細ページ200ms500ms1.2s画像はCDN配信
カート追加100ms300ms800ms同期処理
決済処理1s3s5s外部決済ゲートウェイ依存

スループット要件:

指標通常時ピーク時
同時接続ユーザー5,00050,000
リクエスト/秒1,00010,000
注文/時間5005,000

Mission 3: スケーラビリティ設計(15分)

要件

3年後の10倍成長に対応するスケーラビリティ戦略を設計してください。

以下を検討すること:

  • 水平スケーリングの方針
  • データベースのスケーリング戦略
  • キャッシュ戦略
  • 非同期処理の活用
解答例

水平スケーリング方針:

アプリケーション層:
  - Kubernetes HPA(CPU使用率70%でスケールアウト)
  - 最小Pod数: 3、最大Pod数: 30
  - スケールアウト時間: 30秒以内

データベース層:
  - 書き込み: Primary 1台(垂直スケーリング)
  - 読み取り: Read Replica 2-8台(水平スケーリング)
  - シャーディング: ユーザーIDベース(100万ユーザー超時に導入)

キャッシュ層:
  - Redis Cluster(3ノード以上)
  - 商品情報キャッシュ: TTL 5分
  - セッション: Redis(TTL 30分)
  - CDN: 静的アセット + 商品画像

非同期処理:

即座に応答不要な処理:
  - メール送信 → メッセージキュー
  - 在庫集計 → バッチ処理
  - レコメンデーション更新 → 非同期ジョブ
  - ログ分析 → ストリーミング処理

Mission 4: 可用性と災害復旧(15分)

要件

99.95%の可用性を実現するための設計と、災害復旧計画を策定してください。

解答例

可用性設計:

冗長化方式フェイルオーバー時間
ロードバランサーアクティブ-アクティブ(マルチAZ)即時
アプリケーション3AZに分散配置、最低3Pod30秒
データベースマルチAZレプリケーション60秒(自動)
キャッシュRedis Sentinel / Cluster30秒
CDNグローバル分散即時

ダウンタイム予算(99.95%):

年間: 4時間22分48秒
月間: 21分54秒
日間: 43.2秒

災害復旧計画:

指標目標手段
RPO(Recovery Point Objective)1時間データベースの継続的バックアップ
RTO(Recovery Time Objective)4時間別リージョンへのフェイルオーバー
DRテスト年2回ゲームデイによるDR訓練

Mission 5: セキュリティ要件と脅威モデル(15分)

要件

ECプラットフォームに対する主要な脅威を特定し、セキュリティ要件を定義してください。

解答例

STRIDE脅威分析(抜粋):

脅威カテゴリ対策
セッションハイジャックSpoofingHttpOnly Cookie、セッション固定対策
注文データ改ざんTamperingサーバーサイドバリデーション、署名検証
管理者操作の否認Repudiation監査ログ、操作履歴の保全
個人情報漏洩Information DisclosureAES-256暗号化、アクセス制御
DDoS攻撃Denial of ServiceWAF、レート制限、CDN
権限昇格Elevation of PrivilegeRBAC、最小権限の原則

セキュリティ要件:

認証:
  - 多要素認証(管理者必須)
  - パスワードポリシー: 12文字以上、複雑性要件
  - アカウントロックアウト: 5回失敗で30分ロック

暗号化:
  - 通信: TLS 1.3
  - 保存: AES-256-GCM
  - 鍵管理: AWS KMS

コンプライアンス:
  - PCI DSS Level 1
  - 個人情報保護法対応
  - Cookie同意管理

Mission 6: 非機能要件ドキュメント完成(15分)

要件

Mission 1-5の成果を統合し、完成された非機能要件ドキュメントを作成してください。

以下の構成で整理すること:

  1. 概要と前提条件
  2. パフォーマンス要件
  3. スケーラビリティ要件
  4. 可用性・災害復旧要件
  5. セキュリティ要件
  6. 運用性要件
解答例

上記Mission 1-5の回答を以下のフォーマットで統合します:

# ECプラットフォーム 非機能要件定義書

## 1. 概要
- 対象: BtoC向けECプラットフォーム
- 初年度10万ユーザー → 3年後100万ユーザー

## 2. パフォーマンス要件
- 主要操作のレスポンスタイムSLA(p50/p95/p99)
- スループット要件(通常時/ピーク時)

## 3. スケーラビリティ要件
- 水平スケーリング方針
- データベース戦略
- キャッシュ・非同期処理活用

## 4. 可用性・災害復旧要件
- SLA: 99.95%
- RPO: 1時間 / RTO: 4時間
- 冗長化設計

## 5. セキュリティ要件
- 認証・認可・暗号化
- コンプライアンス(PCI DSS)
- 脅威モデルと対策

## 6. 運用性要件
- 監視・アラート
- デプロイ頻度
- インシデント対応

達成度チェック

ミッションテーマ完了
Mission 1非機能要件の発見と分類
Mission 2パフォーマンスSLA定義
Mission 3スケーラビリティ設計
Mission 4可用性と災害復旧
Mission 5セキュリティ脅威モデル
Mission 6非機能要件ドキュメント

まとめ

ポイント内容
NFR発見ビジネス要件から体系的に抽出する
定量化「速い」ではなく「p95で200ms以内」と定義する
トレードオフ可用性とコストのバランスを明示する
文書化ステークホルダーが合意できる形で整理する

チェックリスト

  • ビジネス要件から非機能要件を体系的に洗い出せた
  • パフォーマンスSLAを定量的に定義できた
  • スケーラビリティ戦略を設計できた
  • 可用性と災害復旧計画を策定できた
  • セキュリティ要件を脅威ベースで定義できた

次のステップへ

次はチェックポイントクイズです。非機能要件の理解度を確認しましょう。


推定読了時間: 90分