
# スケーラブルなセキュリティ質問自動化のためのコンポーザブルAIマイクロサービスアーキテクチャ

エンタープライズは、増え続けるセキュリティ質問書、ベンダー評価、コンプライアンス監査に溺れています。従来のモノリシックツールは、特に異種製品エコシステムとの統合や多言語対応、リアルタイムの監査証跡の提供が求められる場面で追いつくのが困難です。  

大規模言語モデル（LLM）と検索拡張生成（RAG）を中心に構築された **コンポーザブルマイクロサービスアーキテクチャ** は、規制産業が求める柔軟性とガバナンスを維持しながら自動化をスケールさせる方法を提供します。本ガイドでは以下を行います。

* システムを **安全・監査可能・拡張性のある** コア設計原則を概説。  
* Mermaid で図示したリファレンス実装を解説。  
* 各サービスを Kubernetes、サーバーレス FaaS、エッジランタイムのいずれかで独立デプロイする方法を示す。  
* データガバナンス、可観測性、継続的改善に関するベストプラクティスを具体的に提示。

> **TL;DR:** 質問自動化プラットフォームを小さく明確に分割されたサービス群に分解し、LLM をステートレス推論レイヤの裏で実行させ、イベント駆動パイプラインで証拠とバージョン管理の単一情報源を維持します。

---

## 1. なぜ巨大なモノリスを作るのではなく、コンポーズするのか？

| モノリシックアプローチ | コンポーザブルマイクロサービス |
|---------------------|---------------------------|
| 単一コードベースで、特定ワークロード（例: LLM 推論）のスケールが困難。 | 独立したスケーリング – AI 推論は GPU ノードで、ストレージはコスト効果の高いオブジェクトストアで運用可能。 |
| 結合度が高く、更新リスクが大きい。 UI のバグでシステム全体が停止する可能性あり。 | 非同期イベントまたは HTTP API による疎結合で障害を局所化。 |
| 言語に依存した統合が限定的で、スタックが特定言語にロックインしやすい。 | 多言語サポート – 各サービスはタスクに最適な言語で実装可能（認証は Go、LLM オーケストレーションは Python、高スループットパイプラインは Rust）。 |
| ログが混在し、監査・コンプライアンスが困難。 | 中央集約型イベントストア＋不変監査ログにより、規制当局が容易にクエリできる明確なトレイルを提供。 |

**コンポーザブル** モデルは *「必要なものだけを作り、不要なものは置き換える」* という哲学を体現します。これは、ISO 27001 Rev 2 など新しい制御フレームワークが頻繁に登場し、チームが迅速に適応しなければならないセキュリティ質問書の動的な性質にマッチします。

---

## 2. コアとなるアーキテクチャの柱

1. **ステートレス API ゲートウェイ** – UI、SaaS コネクタ、外部ツールのエントリーポイント。認証、リクエスト検証、スロットリングを処理。  
2. **ドメイン固有マイクロサービス** – 各サービスが境界付けられたコンテキストをカプセル化:
   * **Questionnaire Service** – 質問書メタデータ、バージョニング、タスク割り当てを管理。  
   * **Evidence Service** – 不変オブジェクトストアに格納された証拠（ポリシー、スクリーンショット、監査ログ）を管理。  
   * **AI Orchestration Service** – プロンプトを構築し、RAG パイプラインを実行し、回答ドラフトを返す。  
   * **Change‑Detection Service** – 証拠の更新を監視し、影響を受けた回答の再評価をトリガー。  
   * **Notification Service** – Slack、Teams、メールなどのイベントをステークホルダーにプッシュ。  
3. **イベントバス (Kafka / Pulsar)** – `EvidenceUploaded`、`AnswerDrafted` などのドメインイベントを **少なくとも一度** 配信保証。  
4. **可観測性スタック** – OpenTelemetry トレース、Prometheus メトリクス、Loki ログ。  
5. **Policy‑as‑Code エンジン** – 回答が「最終」になる前に、Rego または OPA でコンプライアンスルールを評価。  

すべてのサービスは低遅延の **gRPC**（内部通信）または外部統合向けに **REST** で通信。設計は *「愚かなパイプ、賢いエンドポイント」* を推奨し、ビジネスロジックは適切なサービスに集約し、バスは単なるメッセージ搬送に徹します。

---

## 3. データフロー – 質問から監査可能な回答まで

以下は典型的なリクエストライフサイクルを視覚化した Mermaid 図です。

```mermaid
flowchart TD
    subgraph UI["ユーザーインターフェース"]
        UI1["\"Web UI\""] -->|質問書を提出| AG["\"APIゲートウェイ\""]
    end

    AG -->|認証と検証| QMS["\"質問書サービス\""]
    QMS -->|テンプレート取得| AIOS["\"AIオーケストレーションサービス\""]
    AIOS -->|関連証拠を取得| ES["\"証拠サービス\""]
    ES -->|証拠オブジェクト| AIOS
    AIOS -->|ドラフト回答生成| RAG["\"RAGパイプライン\""]
    RAG -->|LLM 出力| AIOS
    AIOS -->|ドラフト保存| QMS
    QMS -->|AnswerDrafted イベント発行| EB["\"イベントバス\""]
    EB -->|トリガー| CDS["\"変更検知サービス\""]
    CDS -->|証拠が変わったら再実行| AIOS
    CDS -->|AnswerUpdated イベント発行| EB
    EB -->|通知| NS["\"通知サービス\""]
    NS -->|Slack/メールにプッシュ| UI

    style UI fill:#f9f,stroke:#333,stroke-width:2px
    style AG fill:#bbf,stroke:#333,stroke-width:1px
    style QMS fill:#bfb,stroke:#333,stroke-width:1px
    style AIOS fill:#ffb,stroke:#333,stroke-width:1px
    style ES fill:#fbb,stroke:#333,stroke-width:1px
    style RAG fill:#fdd,stroke:#333,stroke-width:1px
    style CDS fill:#ddf,stroke:#333,stroke-width:1px
    style NS fill:#cfc,stroke:#333,stroke-width:1px
```

**フローの重要ポイント**

1. **ユーザーが** 新しい質問書を送信、または既存を選択。  
2. **API ゲートウェイ** が JWT を検証し、レートリミットを適用したうえで質問書サービスへ転送。  
3. **質問書サービス** がテンプレートを取得し、AI オーケストレーションサービスへイベントを送出。  
4. **AI オーケストレーション** が検索ステップを実行し、証拠サービスから対象コントロールに関連する証拠を取得（ベクトル類似度またはキーワード検索）。  
5. 取得したコンテキストとプロンプトテンプレートを **RAG パイプライン**（例: `openAI/gpt‑4o‑preview`）に渡す。  
6. 生成されたドラフト回答は質問書サービスに保存され、*「レビュー待ち」* 状態になる。  
7. **変更検知サービス** が新しい証拠のアップロードを監視。ポリシーが更新された場合、影響を受けた回答を再度 RAG パイプラインで生成。  
8. 最終レビュー担当者がドラフトを承認または編集。承認時に **Policy‑as‑Code エンジン** が全ルールを満たすか最終チェックし、監査可能な不変ログにコミット。  

---

## 4. 実装詳細

### 4.1. API ゲートウェイ (Envoy + OIDC)

* **ルーティング** – `POST /questionnaires/:id/answers` → `questionnaire-service`。  
* **セキュリティ** – スコープ `questionnaire:write` を強制。  
* **レートリミット** – テナントあたり 100 リクエスト/分で LLM コストを保護。

### 4.2. Questionnaire Service (Go)

```go
type Questionnaire struct {
    ID          string            `json:"id"`
    Version     int               `json:"version"`
    Controls    []Control         `json:"controls"`
    Drafts      map[string]Answer `json:"drafts"` // key = control ID
    AssignedTo  map[string]string `json:"assigned_to"` // userID
}
```

* **PostgreSQL** にリレーショナルデータ、**EventStoreDB** にドメインイベントを保持。  
* gRPC メソッド `GetTemplate`, `SaveDraft`, `FinalizeAnswer` を公開。

### 4.3. Evidence Service (Python + FastAPI)

* 証拠は **MinIO** または **AWS S3** に暗号化保存。  
* コンテンツは **Qdrant** にベクトルインデックスし、類似検索を提供。  
* エンドポイント `POST /search` がクエリを受け取り、上位 k 件の証拠 ID を返す。

### 4.4. AI Orchestration Service (Python)

```python
def generate_answer(question: str, evidence_ids: List[str]) -> str:
    evidence = fetch_evidence(evidence_ids)
    context = "\n".join(evidence)
    prompt = f"""You are a compliance specialist.
Using the following evidence, answer the question concisely:\n{context}\n\nQuestion: {question}"""
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"system","content":prompt}]
    )
    return response.choices[0].message.content
```

* **RAG** – ベクトル検索で取得した証拠をシステムプロンプトに組み込み、モデルに証拠 ID の引用を指示。  
* **キャッシュ** – 同一質問に対する生成結果を 24 時間保持し、重複 LLM 呼び出しを回避。

### 4.5. Change‑Detection Service (Rust)

* `EvidenceUploaded` イベントを購読。新規証拠のハッシュと既存証拠を比較し、差分が閾値を超える場合 `AnswerRequiresRegen` を発行。

### 4.6. Notification Service (Node.js)

* `AnswerDrafted`, `AnswerFinalized`, `AnswerRequiresRegen` を監視。Slack ブロック、Teams Adaptive Card、メールテンプレートを生成し送信。  
* **重複排除** – 同一質問書に対する通知は1回に限定。

---

## 5. セキュリティとガバナンス

| 課題 | 対策 |
|------|------|
| **データ漏洩** – LLM プロンプトに機密ポリシーが含まれる可能性 | **オンプレ LLM 推論**（例: Llama 3.2）を VPC 内で実行。外部 API に送る前に PII をマスク。 |
| **証拠への不正アクセス** | 証拠サービスで OPA ポリシーによる細粒度 ACL を適用。 |
| **モデルドリフト** – 回答精度が時間とともに低下 | 定期的にベンチマークコーパスで評価し、プロンプトテンプレートをリフレッシュ。 |
| **監査性** | すべての状態遷移を不変イベントログに記録し、WORM S3 に保存。 |
| **GDPR/CCPA への準拠** | `right‑to‑be‑forgotten` ワークフローを実装し、ベクトル DB とオブジェクトストアからユーザー固有の証拠を削除。 |
| **ISO 27001** | 証拠保持、暗号化、アクセス制御が ISO 27001 の要件に合致することを検証。 |
| **HIPAA / SOC 2** | OPA ルールを拡張し、医療情報やサービス組織制御の追加要件を強制。 |

---

## 6. スケーリング戦略

1. **水平ポッドオートスケーリング (HPA)** – GPU 使用率 (`nvidia.com/gpu`) に基づき AI オーケストレーションポッドを自動拡張。  
2. **バーストキュー** – Kafka のパーティションでテナントごとのトラフィックを分離。  
3. **コールドスタート削減** – KEDA のカスタムスケーラーで LLM 推論サーバーのウォームプールを維持。  
4. **コスト管理** – テナントごとのトークン予算を設定し、超過時は自動スロットリングまたは課金。

---

## 7. 可観測性と継続的改善

* **分散トレース** – OpenTelemetry スパンが UI リクエスト → API ゲートウェイ → AI オーケストレーション → RAG → 証拠サービスまで流れる。  
* **メトリクス例** – `answer_draft_latency_seconds`, `evidence_upload_bytes`, `llm_token_usage`。  
* **ログ集約** – JSON 構造化ログに `request_id` を付与し、サービス間で伝搬。  
* **フィードバックループ** – 回答が最終確定された後、レビュアーのコメント (`review_score`) を取得。これを強化学習にフィードし、プロンプト温度や証拠選択ロジックを自動調整。

---

## 8. 既存チーム向け段階的移行ロードマップ

| フェーズ | 目標 | アクティビティ |
|----------|------|----------------|
| **0 – 発見** | 現行質問書ワークフローをマッピング | データソース特定、制御タクソノミー定義。 |
| **1 – 基盤構築** | API ゲートウェイ、認証、基礎サービスをデプロイ | `questionnaire-service` と `evidence-service` をコンテナ化。 |
| **2 – AI 導入** | パイロット質問書で RAG 実行 | サンドボックス LLM を使用し、ドラフトを手動で検証。 |
| **3 – イベント駆動自動化** | 変更検知パイプラインを接続 | 証拠更新時の自動再生成を有効化。 |
| **4 – ガバナンス強化** | OPA ポリシー、監査不変ログを導入 | 本番向けオンプレ LLM に切り替え。 |
| **5 – スケール & 最適化** | GPU ポッド自動スケール、コスト制御を実装 | 可観測スタックを本格稼働、SLO を設定。 |

コンポーザブルアーキテクチャを段階的に導入すれば、ビッグバンリスクを回避しつつ早期 ROI を実感可能です（多くの場合 **30‑50 % の質問書処理時間短縮** が期待できます）。

---

## 9. スタックの将来像

* **フェデレーテッドラーニング** – 各テナントのデータを外部に持ち出さずにローカルアダプタを訓練し、回答の関連性を向上。  
* **ゼロトラストサービスメッシュ** – **Istio** または **Linkerd** で相互 TLS を徹底。  
* **セマンティックガバナンス** – Policy‑as‑Code が回答内容だけでなく、証拠と制御文言の **意味的類似性** も検証。  
* **生成トレーサビリティ** – 各回答に対し LLM の温度、top‑p、システムプロンプトを不変ログに保存し、法的監査に備える。  

---

## 10. 結論

コンポーザブルマイクロサービスアーキテクチャは、セキュリティ質問書自動化を **労力のかかる手作業からスケーラブルで監査可能なエンジン** へと変革します。責務を分離し、ステートレスな RAG レイヤで LLM を活用し、イベント駆動バックボーンで全体を結びつけることで、組織は以下を実現できます。

* ベンダー評価を数分で完了し、数日かかっていた作業を劇的に短縮。  
* 証拠の変更を自動で検知し、常に最新の回答を保持。  
* 規制当局に対し、明確で不変な監査トレイルを提供。  

小さく始め、素早く反復し、マイクロサービスの哲学を指針に、コンプライアンスを **機能** に変えていきましょう。

---

## 参考リンク

- [OPA のポリシー・アズ・コード (Micro‑services 用)](https://www.openpolicyagent.org/docs/latest/policy-language/)