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 CE | Traefik | Caddy |
|---|---|---|---|
| プラグイン数 | 300+ | △(ミドルウェア) | △(モジュール) |
| Docker自動検出 | ❌ | ✅ | ❌ |
| 自動HTTPS | △ | ✅ | ✅ |
| 管理UI | Konga(別途) | ✅(ダッシュボード) | ❌ |
| 設定の学習コスト | 高 | 中 | 低 |
| GitHub Stars | 39k+ | 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)。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| マイクロサービス・動的ルーティング・K8s | Traefik |
| 高度なAPI管理・認証・レート制限・プラグイン | Kong CE |
| 静的サイト・Next.js・自動HTTPS・シンプル | Caddy |