APIゲートウェイ - マイクロサービスの入口を設計

13分 で読める | 2025.12.30

公式ドキュメント

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)パターン

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はモバイル・Web・IoTそれぞれに最適なデータ形式やレスポンスサイズを提供でき、各クライアントが独立してデプロイ可能になります。

BFFの利点

  • クライアントに最適化されたレスポンス
  • バックエンドの複雑さをクライアントから隠蔽
  • クライアントごとの独立したデプロイ

主要なAPIゲートウェイ

製品特徴
Kongプラグイン豊富、Lua拡張
AWS API Gatewayサーバーレス、Lambda連携
Envoy高性能、サービスメッシュ
NGINX Plus高性能、豊富な実績
Traefikクラウドネイティブ、自動設定
Tykオープンソース、GraphQL対応

Kong vs Envoy

観点KongEnvoy
用途APIゲートウェイ特化サービスメッシュ含む
拡張方法LuaプラグインC++/Lua/WASM
設定Admin API、declarativexDS API、yaml
DBPostgreSQL/Cassandraなし(ステートレス)
学習コスト低い高い

API Composition

実践メモ: API CompositionではPromise.allで複数サービスへの呼び出しを並列化し、レスポンス時間を短縮しましょう。

複数のサービスからデータを集約して返します。

// 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}
 }
 }

設計上の考慮点

注意: APIゲートウェイは全トラフィックが通過するため、単一障害点(SPOF)にならないよう冗長化が必須です

単一障害点にしない

flowchart TB
 LB["Load Balancer"] --> G1["Gateway 1"]
 LB --> G2["Gateway 2"]

ゲートウェイの責務

適切な責務:

  • ✓ 横断的関心事(認証、ログ、レート制限)
  • ✓ プロトコル変換
  • ✓ リクエストルーティング

避けるべき責務:

  • ✗ ビジネスロジック
  • ✗ 複雑なデータ変換
  • ✗ ステートの保持

まとめ

APIゲートウェイは、マイクロサービスアーキテクチャにおいて、クライアントとサービス間の橋渡しをする重要なコンポーネントです。認証、レート制限、ルーティングなどの横断的関心事を一元管理することで、各サービスはビジネスロジックに集中できます。適切な製品を選択し、単一障害点にならないよう設計することが重要です

参考リソース

← 一覧に戻る
PR
PR
PR
PR