APIゲートウェイとは
APIゲートウェイは、クライアントとバックエンドサービス間の単一の入口として機能するコンポーネントです。認証、レート制限、ルーティングなどの横断的関心事を一元管理します。
flowchart TB
Client["クライアント"] --> Gateway["API Gateway<br/>・認証<br/>・レート制限<br/>・ルーティング<br/>・ログ"]
Gateway --> SA["Service A"]
Gateway --> SB["Service B"]
Gateway --> SC["Service C"]
主要な機能
1. ルーティング
リクエストを適切なバックエンドサービスに振り分けます。
# Kong の設定例
routes:
- name: user-service
paths:
- /api/users
service: user-service
- name: order-service
paths:
- /api/orders
service: order-service
2. 認証・認可
sequenceDiagram
participant C as クライアント
participant G as Gateway
participant Auth as 認証サービス
participant B as バックエンドサービス
C->>G: リクエスト
G->>Auth: トークン検証
Auth-->>G: 検証結果
G->>B: リクエスト転送
B-->>G: レスポンス
G-->>C: レスポンス
# JWT検証の設定例
plugins:
- name: jwt
config:
secret_is_base64: true
claims_to_verify:
- exp
3. レート制限
plugins:
- name: rate-limiting
config:
minute: 100
policy: local
fault_tolerant: true
4. リクエスト/レスポンス変換
// リクエストヘッダーの追加
request.headers['X-Request-ID'] = generateUUID();
// レスポンスの変換
response.body = {
data: response.body,
meta: {
requestId: request.headers['X-Request-ID'],
timestamp: new Date().toISOString()
}
};
5. キャッシング
plugins:
- name: proxy-cache
config:
content_type:
- application/json
cache_ttl: 300
strategy: memory
6. ロギング・監視
plugins:
- name: http-log
config:
http_endpoint: http://logging-service/logs
method: POST
content_type: application/json
BFF(Backend for Frontend)パターン
クライアントの種類ごとに最適化されたAPIゲートウェイを用意します。
flowchart LR
Web["Web App"] --> BFFWeb["BFF (Web)"]
Mobile["Mobile App"] --> BFFMobile["BFF (Mobile)"]
IoT["IoT"] --> BFFIoT["BFF (IoT)"]
BFFWeb --> SA["Service A"]
BFFWeb --> SB["Service B"]
BFFMobile --> SA
BFFMobile --> SB
BFFIoT --> SA
BFFIoT --> SB
BFFの利点
- クライアントに最適化されたレスポンス
- バックエンドの複雑さをクライアントから隠蔽
- クライアントごとの独立したデプロイ
主要なAPIゲートウェイ
| 製品 | 特徴 |
|---|---|
| Kong | プラグイン豊富、Lua拡張 |
| AWS API Gateway | サーバーレス、Lambda連携 |
| Envoy | 高性能、サービスメッシュ |
| NGINX Plus | 高性能、豊富な実績 |
| Traefik | クラウドネイティブ、自動設定 |
| Tyk | オープンソース、GraphQL対応 |
Kong vs Envoy
| 観点 | Kong | Envoy |
|---|---|---|
| 用途 | APIゲートウェイ特化 | サービスメッシュ含む |
| 拡張方法 | Luaプラグイン | C++/Lua/WASM |
| 設定 | Admin API、declarative | xDS API、yaml |
| DB | PostgreSQL/Cassandra | なし(ステートレス) |
| 学習コスト | 低い | 高い |
API Composition
複数のサービスからデータを集約して返します。
// API Gateway でのデータ集約
async function getUserProfile(userId) {
const [user, orders, reviews] = await Promise.all([
userService.getUser(userId),
orderService.getOrders(userId),
reviewService.getReviews(userId)
]);
return {
...user,
recentOrders: orders.slice(0, 5),
reviewCount: reviews.length
};
}
エッジ機能
SSL/TLS終端
flowchart LR
Client["クライアント"] -->|HTTPS| Gateway["Gateway<br/>🔐 証明書管理"]
Gateway -->|HTTP| Internal["内部サービス"]
リクエストの検証
plugins:
- name: request-validator
config:
body_schema: |
{
"type": "object",
"required": ["email", "password"],
"properties": {
"email": {"type": "string", "format": "email"},
"password": {"type": "string", "minLength": 8}
}
}
設計上の考慮点
単一障害点にしない
flowchart TB
LB["Load Balancer"] --> G1["Gateway 1"]
LB --> G2["Gateway 2"]
ゲートウェイの責務
適切な責務:
- ✓ 横断的関心事(認証、ログ、レート制限)
- ✓ プロトコル変換
- ✓ リクエストルーティング
避けるべき責務:
- ✗ ビジネスロジック
- ✗ 複雑なデータ変換
- ✗ ステートの保持
まとめ
APIゲートウェイは、マイクロサービスアーキテクチャにおいて、クライアントとサービス間の橋渡しをする重要なコンポーネントです。認証、レート制限、ルーティングなどの横断的関心事を一元管理することで、各サービスはビジネスロジックに集中できます。適切な製品を選択し、単一障害点にならないよう設計することが重要です。
← 一覧に戻る