MLIT 環境 インフラアーキテクチャ構成
リージョン: ap-northeast-1 (東京)
ドメイン: mlit-eng-ai.hy-create.com
インフラ構成図
%%{init: {'theme': 'default', 'themeVariables': {'fontSize': '11px'}, 'flowchart': {'nodeSpacing': 30, 'rankSpacing': 40, 'curve': 'basis'}}}%%
flowchart TB
subgraph Internet
Browser["ブラウザ"]
Bedrock["Amazon Bedrock<br/>(Claude)"]
end
subgraph AWS["AWS ap-northeast-1 (745651872545)"]
subgraph VPC["VPC 10.0.0.0/16"]
subgraph Public["Public Subnets"]
ALB["ALB<br/>mlit-ai-v2-alb<br/>HTTPS :443"]
NAT["NAT Gateway"]
end
subgraph Private["Private Subnets"]
subgraph ECS["ECS Fargate Cluster<br/>mlit-ai-v2-cluster"]
OpenWebUI["Open WebUI<br/>1 vCPU / 2 GB<br/>:8080"]
Agentic["Agentic AI Server<br/>0.5 vCPU / 1 GB<br/>:8000"]
end
RDS[("RDS PostgreSQL 15<br/>db.t4g.micro<br/>20 GiB GP3")]
end
end
Cognito["Cognito<br/>mlit-mcp-doc-srch-users"]
AppRunner["App Runner<br/>mlit-mcp-doc-srch<br/>1 vCPU / 2 GB"]
ES[("Elasticsearch")]
S3["S3<br/>ALB Logs"]
end
Browser -->|"HTTPS :443"| ALB
ALB -->|"/* :8080"| OpenWebUI
ALB -->|"/v1/* :8000"| Agentic
ALB -.->|"アクセスログ"| S3
OpenWebUI -->|"Service Connect"| Agentic
OpenWebUI -->|":5432"| RDS
Agentic -->|"HTTPS + M2M Token"| AppRunner
Agentic -->|"HTTPS"| Bedrock
Agentic -->|"NAT経由"| NAT
NAT -->|"Internet"| Bedrock
Browser -->|"OIDC"| Cognito
Agentic -->|"Client Credentials"| Cognito
AppRunner -->|":9200"| ES
style ALB fill:#f9e4b7,stroke:#c88a10,stroke-width:2px
style OpenWebUI fill:#e1f5fe,stroke:#01579b,stroke-width:2px
style Agentic fill:#fff3e0,stroke:#e65100,stroke-width:2px
style AppRunner fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style RDS fill:#e8f5e9,stroke:#2e7d32
style ES fill:#e8f5e9,stroke:#2e7d32
style Cognito fill:#fce4ec,stroke:#c2185b
ネットワーク構成
VPC
| 項目 |
値 |
| VPC名 |
mlit-ai-v2-vpc |
| CIDR |
10.0.0.0/16 |
| AZ数 |
2 (ap-northeast-1a, 1c) |
| NAT Gateway |
1台 (Public Subnet 1) |
サブネット
| サブネット |
CIDR |
AZ |
用途 |
| Public Subnet 1 |
10.0.0.0/24 |
ap-northeast-1a |
ALB, NAT Gateway |
| Public Subnet 2 |
10.0.1.0/24 |
ap-northeast-1c |
ALB |
| Private Subnet 1 |
10.0.2.0/24 |
ap-northeast-1a |
ECS, RDS |
| Private Subnet 2 |
10.0.3.0/24 |
ap-northeast-1c |
ECS, RDS |
セキュリティグループ
| SG |
インバウンド |
用途 |
| ALB SG |
TCP 443/80 from 0.0.0.0/0 |
ALB |
| ECS SG |
TCP 8080/8000 from ALB SG, All TCP from self |
ECS タスク |
| RDS SG |
TCP 5432 from ECS SG |
データベース |
コンピューティング
ECS Fargate
クラスタ: mlit-ai-v2-cluster
Service Discovery: mlit-ai-v2.local (CloudMap)
| サービス |
vCPU |
メモリ |
タスク数 |
ポート |
コンテナイメージ |
| agentic |
0.5 vCPU (512) |
1 GB (1024) |
1 |
8000 |
mlit-ai-agentic:latest |
| openwebui |
1 vCPU (1024) |
2 GB (2048) |
1 |
8080 |
mlit-ai-openwebui:latest |
ECS サービス設定
| 項目 |
値 |
| Minimum Healthy Percent |
100% |
| Maximum Healthy Percent |
200% |
| Circuit Breaker |
有効 (自動ロールバック) |
| Service Connect |
mlit-ai-v2.local 名前空間 |
| Service Connect タイムアウト |
idle: 300s, per-request: 300s |
App Runner (MCP サーバー)
| 項目 |
値 |
| サービス名 |
mlit-mcp-doc-srch |
| vCPU |
1 vCPU (1024) |
| メモリ |
2 GB (2048) |
| ポート |
8080 |
| URL |
cnvvqpwdsa.ap-northeast-1.awsapprunner.com |
| 公開ドメイン |
mlit-mcp-doc.hy-create.com |
データベース
RDS PostgreSQL
| 項目 |
値 |
| インスタンス識別子 |
mlit-ai-v2-openwebui-db |
| インスタンスクラス |
db.t4g.micro (2 vCPU, 1 GB RAM, Graviton2) |
| エンジン |
PostgreSQL 15.14 |
| ストレージ |
20 GiB GP3 |
| 最大ストレージ |
100 GiB (オートスケール) |
| Multi-AZ |
なし |
| DB名 |
openwebui |
| ユーザー名 |
openwebui |
ALB (Application Load Balancer)
| 項目 |
値 |
| 名前 |
mlit-ai-v2-alb |
| スキーム |
internet-facing |
| アイドルタイムアウト |
300秒 |
| ACM 証明書 |
4afee029-e441-45f0-9fad-8f09722f8ca2 |
| アクセスログ |
S3 (mlit-ai-v2-alb-logs) |
リスナールール
| 優先度 |
パス |
ターゲット |
認証 |
| - |
HTTP :80 |
HTTPS リダイレクト (301) |
- |
| 10 |
/v1/* |
agentic-tg :8000 |
Cognito |
| 100 |
/* |
openwebui-tg :8080 |
Cognito |
ターゲットグループ
| TG |
ポート |
ヘルスチェック |
Healthy/Unhealthy |
mlit-ai-v2-openwebui-tg |
8080 |
/health (30s間隔, 10sタイムアウト) |
2/5 |
mlit-ai-v2-agentic-tg |
8000 |
/health (30s間隔, 10sタイムアウト) |
2/5 |
認証 (Cognito)
| 項目 |
値 |
| User Pool |
mlit-mcp-doc-srch-users |
| Pool ID |
ap-northeast-1_E14PdjUEF |
| ドメイン |
mlit-mcp-doc-srch.auth.ap-northeast-1.amazoncognito.com |
| 登録ユーザー数 |
7 |
| MFA |
OFF |
認証フロー
- ユーザー認証: Cognito OIDC → Open WebUI (Authorization Code Grant)
- M2M 認証: Agentic → Cognito (Client Credentials Grant) → MCP サーバー
ECR リポジトリ
| リポジトリ |
用途 |
mlit-ai-openwebui |
Open WebUI コンテナイメージ |
mlit-ai-agentic |
Agentic AI Server コンテナイメージ |
CDK スタック構成
MlitAIv2Core (CoreInfraStack)
└── VPC, SG, ALB, ECS Cluster, CloudMap, S3
│
├── MlitAIv2Database (DatabaseStack)
│ └── RDS, DB Secrets, DATABASE_URL Lambda
│
└── MlitAIv2App (AppStack)
└── ECR, Task Definitions, ECS Services, Cognito App Client
月額コスト概算
| リソース |
スペック |
概算 (USD/月) |
| ECS Fargate (agentic) |
0.5 vCPU / 1 GB |
~$15 |
| ECS Fargate (openwebui) |
1 vCPU / 2 GB |
~$30 |
| RDS |
db.t4g.micro |
~$12 |
| NAT Gateway |
1台 + データ転送 |
~$35-45 |
| ALB |
+ データ転送 |
~$18-25 |
| App Runner (MCP) |
1 vCPU / 2 GB |
~$30 |
| その他 |
CloudWatch, Secrets, ECR, S3, Route53 |
~$5-10 |
| 合計 |
|
~$145-167 |
※ Amazon Bedrock (Claude) 利用料は別途 (従量課金)
※ 現在の運用実績的には80/月程度、今後スケールさせる場合でも2〜3倍程度を想定
※ メインの費用発生はElasticsearchとBedrock APIになる想定
MCP Document Search サーバー構成 (mcp-doc-srch)
Agentic AI Server が利用する外部MCPツールサーバー。
Elasticsearch 上のドキュメントに対してハイブリッド検索 (BM25 + ベクトル検索) を提供する MCP (Model Context Protocol) サーバーである。
リポジトリ: mcp-doc-srch
システム概要
%%{init: {'theme': 'default', 'themeVariables': {'fontSize': '11px'}, 'flowchart': {'nodeSpacing': 30, 'rankSpacing': 40, 'curve': 'basis'}}}%%
flowchart LR
Agentic["Agentic AI Server<br/>(ECS Fargate)"]
Cognito["Cognito"]
MCP["MCP Doc Search<br/>App Runner<br/>1 vCPU / 2 GB<br/>:8080"]
ES[("Elasticsearch<br/>Elastic Cloud")]
Agentic -->|"1. Client Credentials"| Cognito
Cognito -->|"2. access_token"| Agentic
Agentic -->|"3. MCP (streamable-http)<br/>Bearer Token"| MCP
MCP -->|"ApiKey認証"| ES
style Agentic fill:#fff3e0,stroke:#e65100,stroke-width:2px
style MCP fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style ES fill:#e8f5e9,stroke:#2e7d32
style Cognito fill:#fce4ec,stroke:#c2185b
App Runner スペック
| 項目 |
値 |
| サービス名 |
mlit-mcp-doc-srch |
| vCPU |
1 vCPU (1024) |
| メモリ |
2 GB (2048) |
| ポート |
8080 |
| ランタイム |
Python 3.12 (slim) |
| フレームワーク |
FastMCP + Uvicorn |
| MCP トランスポート |
streamable-http (ステートレス) |
| オートスケール |
min=1, max=1 |
| ヘルスチェック |
GET /healthz (10s間隔, 5sタイムアウト) |
| カスタムドメイン |
mlit-mcp-doc.hy-create.com |
| ECR リポジトリ |
mcp-doc-srch (745651872545) |
MLIT 環境で有効なツール
config.mlit.yaml に基づき、3つのツールが有効:
| ツール名 | 説明 | インデックス |
|----------|------|------------|-------------|
| search_ppe_guidelines | 公共事業評価 (PPE) 指針・要領の検索 | sugi-exp-proeva |
| search_docs_ppe_karte | 公共事業評価カルテの検索 (再評価・事後評価) | mlit-karte |
| search_docs_law | 法令文書の検索 (建設業法、行政機関政策評価法等) | law |
各ツールに対応する詳細取得ツール (get_document_details_*, get_ppe_karte_details) も自動登録される。
ツール呼び出しパラメータ
search_ppe_guidelines(
query: str, # 検索クエリ
semantic_search: bool = True, # ベクトル検索の有効/無効
filters: dict = None, # メタデータフィルタ
size: int = 50, # 取得件数 (最大100)
page: int = 0, # ページネーション
output: "text"|"json"|"yaml" = "text" # 出力形式
)
Elasticsearch 構成
- バックエンド: Elastic Cloud (マネージド)
- Elastic serverlessを利用
- IPフィルタリング + API_KEY
検索方式
| 方式 |
説明 |
設定 |
| BM25 (全文検索) |
title^3 + text_content で multi_match |
デフォルト有効 |
| KNN (ベクトル検索) |
feature_vector フィールドで近傍探索 |
k=100, candidates=500 |
| RRF (ハイブリッド) |
BM25 + KNN を Reciprocal Rank Fusion で統合 |
window_size=100, デフォルト有効 |
認証
M2M 認証 (Agentic → MCP)
| 項目 |
値 |
| OAuth フロー |
Client Credentials Grant |
| Resource Server |
docsearch |
| スコープ |
docsearch/read, docsearch/search |
| JWT 検証 |
RS256, Cognito JWKS エンドポイント |
Cognito (MCP サーバー側)
MCP サーバーの CDK スタックで Cognito リソースを作成:
| 項目 |
値 |
| User Pool |
mlit-mcp-doc-srch-users (ap-northeast-1_E14PdjUEF) |
| ドメイン |
mlit-mcp-doc-srch.auth.ap-northeast-1.amazoncognito.com |
| M2M クライアント |
Client Credentials フロー |
| Web クライアント |
Authorization Code フロー |
月額コスト概算 (MCP サーバー単体)
| リソース |
概算 (USD/月) |
| App Runner (1 vCPU / 2 GB, 常時1台) |
~$30 |
| Elasticsearch (後述) |
従量課金 |
| Secrets Manager |
~$1 |
| 合計 (AWS 分) |
~$31 + ES従量課金 |
Elasticsearch Serverless 従量課金見積もり
想定: 月10万クエリ(≒ 約3,300クエリ/日, 約140クエリ/時)、データ量10〜20GB、ベクトル検索あり程度を目安に考える
- エンベディングは OpenAI Embedding API で事前生成(安価)→ ES 側の ML VCU は不要
- ベクトル検索は全文検索より計算コストが高いが、BBQ圧縮(Serverless デフォルト)により General Purpose プロファイルで十分
- Storage: ベクトルデータは通常のテキストより容量が大きい
| 項目 |
月額目安 |
| Search VCU |
$50〜$120 |
| ML VCU (推論) |
$30〜$80 |
| Ingest VCU |
$5〜$20 |
| Storage |
$1〜$5 |
| Egress |
数ドル |
| 小計 |
$90〜$230 |
| Enterprise サポート (+15%) |
+$14〜$35 |
| 合計 |
$100〜$260/月程度 |