AI

OSS APIゲートウェイ比較:Kong vs Traefik vs Caddy でAWS API Gatewayを脱却する

オープンソースラボ編集部2026年6月13日

OSS APIゲートウェイ比較:Kong vs Traefik vs Caddy でAWS API Gatewayを脱却する

AWS API Gateway(月$3.50/1M リクエスト〜)・Azure API Management(月$50/ユニット〜)に対して、Kong(Nginx+Lua製の多機能APIゲートウェイ)・Traefik(Cloud Native・自動検出型リバースプロキシ)・Caddy(自動HTTPS・シンプル設定のWebサーバー)はAPIゲートウェイをセルフホストできます。

OSS APIゲートウェイを使う理由

  • コスト: AWS API Gateway(月100M リクエスト = $350)→ Kong CE + VPSで$20/月
  • 低レイテンシ: VPCを跨がないためAWS API GatewayのCold Start・ネットワーク転送なし
  • Plugin/Middleware: 認証・レート制限・キャッシュ・ログ・変換を単一層で処理
  • マイクロサービス統合: Docker/Kubernetes自動検出・動的なサービスルーティング

主要ツールの概要

Kong Gateway CE

2015年公開、Lua/OpenResty製のOSSです。GitHubスター39k+。プラグインエコシステム(300+)によって認証・レート制限・キャッシュ・ロギング・変換を宣言的設定で組み合わせられるのが最大の強みです。エンタープライズ向けKong Gatewayの無料版として機能的に充実しています。

# docker-compose.yml - Kong Gateway CE + PostgreSQL + Konga(管理UI)
version: '3.8'
services:
  kong-db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: kong
      POSTGRES_USER: kong
      POSTGRES_PASSWORD: ${KONG_DB_PASSWORD}
    volumes:
      - kong_pgdata:/var/lib/postgresql/data

  kong-migrations:
    image: kong:3.7-alpine
    command: kong migrations bootstrap
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-db
      KONG_PG_PASSWORD: ${KONG_DB_PASSWORD}
    depends_on:
      - kong-db

  kong:
    image: kong:3.7-alpine
    restart: unless-stopped
    ports:
      - "8000:8000"   # HTTP Proxyポート
      - "8443:8443"   # HTTPS Proxyポート
      - "8001:8001"   # Admin API(内部のみ公開)
      - "8444:8444"   # Admin API TLS
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-db
      KONG_PG_PASSWORD: ${KONG_DB_PASSWORD}
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_ADMIN_LISTEN: "0.0.0.0:8001, 0.0.0.0:8444 ssl"
      KONG_DECLARATIVE_CONFIG: /etc/kong/kong.yml
    depends_on:
      - kong-migrations
    volumes:
      - ./kong.yml:/etc/kong/kong.yml

  konga:
    image: pantsel/konga:latest
    restart: unless-stopped
    ports:
      - "1337:1337"
    environment:
      NODE_ENV: production
      DB_ADAPTER: postgres
      DB_HOST: kong-db
      DB_USER: kong
      DB_PASSWORD: ${KONG_DB_PASSWORD}
      DB_DATABASE: konga
    depends_on:
      - kong-db

volumes:
  kong_pgdata:
# kong.yml - 宣言的設定(Kong Declarative Config)
_format_version: "3.0"
_transform: true

services:
  - name: articles-service
    url: http://nextjs-app:3000
    routes:
      - name: articles-api
        paths:
          - /api/articles
        methods: [GET, POST, PUT, DELETE]
        strip_path: false
    plugins:
      # JWT認証
      - name: jwt
        config:
          secret_is_base64: false
          claims_to_verify: [exp]

      # レート制限(IP毎に分100リクエスト)
      - name: rate-limiting
        config:
          minute: 100
          hour: 3000
          policy: local
          error_code: 429
          error_message: "Too Many Requests"

      # レスポンスキャッシュ(GETは60秒キャッシュ)
      - name: proxy-cache
        config:
          request_method: [GET, HEAD]
          response_code: [200]
          cache_ttl: 60
          strategy: memory

      # CORSヘッダー追加
      - name: cors
        config:
          origins: ["https://yourapp.com"]
          methods: [GET, POST, PUT, DELETE, OPTIONS]
          headers: [Authorization, Content-Type]

  - name: ai-search-service
    url: http://nextjs-app:3000/api/ai-search
    routes:
      - name: ai-search
        paths: [/api/ai-search]
    plugins:
      # AIエンドポイントは1分10リクエストに制限
      - name: rate-limiting
        config:
          minute: 10
          policy: local
# Kong Admin API でサービス・プラグインを自動管理(Python)
import requests
import os

KONG_ADMIN = os.environ.get('KONG_ADMIN_URL', 'http://localhost:8001')

def register_service(name: str, url: str) -> dict:
    resp = requests.post(f'{KONG_ADMIN}/services', json={'name': name, 'url': url})
    resp.raise_for_status()
    return resp.json()

def add_route(service_name: str, paths: list, methods: list = None) -> dict:
    body = {'paths': paths, 'service': {'name': service_name}}
    if methods:
        body['methods'] = methods
    resp = requests.post(f'{KONG_ADMIN}/routes', json=body)
    resp.raise_for_status()
    return resp.json()

def enable_rate_limiting(service_name: str, minute_limit: int = 100):
    resp = requests.post(
        f'{KONG_ADMIN}/services/{service_name}/plugins',
        json={'name': 'rate-limiting', 'config': {'minute': minute_limit, 'policy': 'local'}},
    )
    resp.raise_for_status()
    return resp.json()

def add_jwt_auth(service_name: str):
    resp = requests.post(
        f'{KONG_ADMIN}/services/{service_name}/plugins',
        json={'name': 'jwt', 'config': {'claims_to_verify': ['exp']}},
    )
    resp.raise_for_status()
    return resp.json()

# サービスを登録してプラグインを設定
svc = register_service('user-service', 'http://user-service:8080')
route = add_route('user-service', ['/api/users'], ['GET', 'POST', 'PUT', 'DELETE'])
enable_rate_limiting('user-service', 200)
add_jwt_auth('user-service')
print(f'Service registered: {svc["id"]}')
print(f'Route created: {route["id"]}')

Traefik

2016年公開、Go製のOSSです。GitHubスター50k+。Docker・Kubernetes・Consul・ECSなどのオーケストレーターのラベル/アノテーションを自動検出し、設定ゼロで動的にルーティングを更新するのが特長です。Let's Encrypt証明書の自動取得・更新も標準搭載です。

# docker-compose.yml - Traefik v3 + Let's Encrypt自動HTTPS
version: '3.8'
services:
  traefik:
    image: traefik:v3.0
    restart: unless-stopped
    command:
      - --api.insecure=false
      - --api.dashboard=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.myresolver.acme.email=${ACME_EMAIL}
      - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.myresolver.acme.tlschallenge=true
      - --log.level=INFO
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.yourcompany.com`)"
      - "traefik.http.routers.dashboard.tls.certresolver=myresolver"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.middlewares=dashboard-auth"
      - "traefik.http.middlewares.dashboard-auth.basicauth.users=${TRAEFIK_DASHBOARD_AUTH}"

  nextjs-app:
    image: your-nextjs-app:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextjs.rule=Host(`app.yourcompany.com`)"
      - "traefik.http.routers.nextjs.tls.certresolver=myresolver"
      - "traefik.http.routers.nextjs.entrypoints=websecure"
      - "traefik.http.services.nextjs.loadbalancer.server.port=3000"
      # HTTPをHTTPSにリダイレクト
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      - "traefik.http.routers.nextjs-http.rule=Host(`app.yourcompany.com`)"
      - "traefik.http.routers.nextjs-http.entrypoints=web"
      - "traefik.http.routers.nextjs-http.middlewares=redirect-to-https"
      # レート制限ミドルウェア
      - "traefik.http.middlewares.rate-limit.ratelimit.average=100"
      - "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
      - "traefik.http.routers.nextjs.middlewares=rate-limit"

機能比較表

比較項目Kong CETraefikCaddy
プラグイン数300+△(ミドルウェア)△(モジュール)
Docker自動検出
自動HTTPS
管理UIKonga(別途)✅(ダッシュボード)
設定の学習コスト
GitHub Stars39k+50k+57k+

OSS APIゲートウェイはDevOpsカテゴリ/categories/devopsのObservabilityスタック(Prometheus+Grafana)と連携してAPIのリクエスト数・レイテンシ・エラー率をリアルタイムで可視化します。セキュリティカテゴリ/categories/securityのVaultでAPIキーやJWT秘密鍵を管理してKong/Traefikに動的に注入することでシークレットをコードから分離できます。

FAQ

Q. Kong vs Traefik、マイクロサービス環境でどちらを選ぶべきですか?

A. Kubernetes/Docker Composeで動的にサービスが増減する環境にはTraefik高度なプラグイン(認証・キャッシュ・変換)が必要なAPIゲートウェイにはKongが向いています。Traefik: ①Dockerラベルを付けるだけで自動的にルートが追加・削除される②Let's Encrypt証明書の自動管理③マイクロサービスをK8sで管理している場合のIngress ControllerとしてTraefik v3が最も設定が少ない。Kong: ①APIキー認証・JWT・OAuth2・Basic Auth・LDAP認証を設定だけで実装②レスポンスキャッシュ・変換・mTLSなど高度なAPI管理機能③複数チームがAPIを提供するプラットフォームで開発者ポータル(Kong Developer Portal)を使いたい。両方使う構成も一般的:Traefikをインターネット→内部ネットワークのIngress、Kongを内部APIの認証・レート制限に使い分け。

Q. CaddyはNginxの代替として使えますか?

A. 静的サイト・Next.jsアプリのリバースプロキシ・HTTPS自動管理にはCaddyがNginxより優れた選択肢です。Caddyの優位点: ①Let's Encrypt証明書を設定ゼロで自動取得・更新(Nginxはcertbotが別途必要)②Caddyfileの構文がNginx confより単純③HTTP/3(QUIC)が標準サポート(Nginx Plusは有料)④動的設定更新API(再起動不要)。Nginxが優れる点: ①設定ファイルの情報量(Stack Overflow・事例)が圧倒的に多い②WordPressなどの.htaccessが必要なアプリ③高トラフィック向けのチューニング事例が豊富。移行コスト: Nginx confをCaddyfileに変換するツール(nginx2caddy)があり、基本的なリバースプロキシ設定は数分で移行できます。

Q. Kong CEとKong Enterpriseの違いは何ですか?

A. Kong CE(無料)とEnterprise(月$300/node〜)の主な違い: ①Kong Manager GUI: EntはフルGUI管理画面(CEはAdmin APIまたはKonga OSSが必要)②OpenID Connect Plugin: EntはOIDC認証(Auth0・Keycloak・Oktaとの統合)③Dev Portal: API文書自動生成・開発者セルフサービスキー発行④Rate Limiting Advanced: CE版は分・時・日のみ、Ent版は滑り窓(Sliding Window)レート制限⑤KIC(Ingress Controller): EntはKubernetes Ingress Controllerの商用サポート⑥RBAC: Ent版は管理者ロールの細かい権限管理。スタートアップ・中小企業にはKong CE + Kongaで十分な機能をカバーできます。

Q. Traefikの設定で詰まりやすいポイントは何ですか?

A. ①**exposedbydefault=falseを設定してラベルで個別に有効化**: デフォルトで全コンテナが公開されてしまうのを防ぐために必ず--providers.docker.exposedbydefault=falseを設定し、各コンテナにtraefik.enable=trueラベルを明示的に付ける②Let's Encryptのレート制限: 証明書発行の失敗が続くとドメインが一時的にブロックされるため、開発中は--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory(Staging)を使う③ポートの自動検出: コンテナが複数ポートを公開している場合traefik.http.services.myservice.loadbalancer.server.port=3000で明示的にポートを指定④ネットワーク: Traefikとバックエンドコンテナが同じDockerネットワークに所属しているか確認(デフォルトネットワーク名は<compose-dir>_default)。

まとめ

ユースケース推奨ツール
マイクロサービス・動的ルーティング・K8sTraefik
高度なAPI管理・認証・レート制限・プラグインKong CE
静的サイト・Next.js・自動HTTPS・シンプルCaddy

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。