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

クライアントの種類ごとに最適化された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

観点KongEnvoy
用途APIゲートウェイ特化サービスメッシュ含む
拡張方法LuaプラグインC++/Lua/WASM
設定Admin API、declarativexDS API、yaml
DBPostgreSQL/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ゲートウェイは、マイクロサービスアーキテクチャにおいて、クライアントとサービス間の橋渡しをする重要なコンポーネントです。認証、レート制限、ルーティングなどの横断的関心事を一元管理することで、各サービスはビジネスロジックに集中できます。適切な製品を選択し、単一障害点にならないよう設計することが重要です。

← 一覧に戻る