API Gateway — API ホスティング
概要
Amazon API Gateway は HTTP/REST/WebSocket API を AWS 上にホストするフルマネージドサービス。 Lambda / DynamoDB / SQS / その他 HTTP バックエンドへのルーティング、認証認可、レート制限、ロギングを設定するだけで API が立ち上がります。
バリエーションは 3 つ: HTTP API (v2)、REST API (v1)、WebSocket API。 新規開発はまず HTTP API、複雑な要件があれば REST API、双方向通信なら WebSocket、と覚えると迷わない。
HTTP API vs REST API
| 観点 | HTTP API (v2) | REST API (v1) |
|---|---|---|
| 料金 | $1.0 / 100万リクエスト | $3.5 / 100万リクエスト |
| レイテンシ | 低 (60% 速い) | 標準 |
| OAuth/JWT | 標準対応 | Lambda Authorizer 自前 |
| API Key / Usage Plan | 無し | あり |
| SDK 自動生成 | 無し | あり |
| WAF 直接統合 | 無し (CloudFront 経由) | あり |
| カスタムドメイン | ACM 必要 | ACM 必要 |
新規開発は HTTP API がデフォルト推奨。安く速い。API Key 必須・WAF 直接統合が要る案件は REST API。
主な機能
- Route — HTTP メソッド + パスのマッピング。
POST /contact等。 - Integration — Route から流す先。AWS_PROXY (Lambda) / HTTP_PROXY / AWS Service / Mock。
- Stage — 環境分離 (dev/stg/prod) と auto-deploy 設定。
- Authorizer — JWT / Lambda 認可関数 / IAM。
- Throttling — リクエスト/秒の上限制御。
- CORS — オリジン許可設定。HTTP API は YAML だけで完結。
- Custom Domain Name —
api.example.com等の独自ドメイン割り当て。ACM 証明書必要。 - WebSocket API — 双方向通信。チャットや通知。
- Access Log — JSON 形式のリクエストログを CloudWatch Logs / S3 へ出力。
使うべきパターン
- Lambda + サーバレス API — 三種の神器の中核。
- 静的サイトに /api/* を生やす — CloudFront で /api/* を API Gateway に振り分けて 1 ドメイン化。
- OAuth/JWT 認証 — Cognito User Pool や Auth0 と統合。
- 外部公開 API — Throttling / Access Log で安全運用。
使わない方が良いパターン
- VPC 内専用 API — ALB + EC2/Fargate の方が直接的。Private API も可能だが要件が複雑なら ALB。
- 低レイテンシ p99 が厳しい (50ms 未満) — API Gateway 自体が 30-50ms 加算する。直接 Lambda Function URL で繋ぐ方が速い。
- Lambda Function URL で十分 — 単純な Webhook 受信なら Function URL の方が安く速い。
Terraform 最小サンプル(HTTP API + Lambda Proxy)
resource "aws_apigatewayv2_api" "main" {
name = "myapi"
protocol_type = "HTTP"
cors_configuration {
allow_origins = ["https://lab.iigtn.com"]
allow_methods = ["GET", "POST", "OPTIONS"]
allow_headers = ["Content-Type"]
max_age = 3600
}
}
resource "aws_apigatewayv2_integration" "lambda" {
api_id = aws_apigatewayv2_api.main.id
integration_type = "AWS_PROXY"
integration_uri = aws_lambda_function.fn.invoke_arn
payload_format_version = "2.0"
}
resource "aws_apigatewayv2_route" "post_contact" {
api_id = aws_apigatewayv2_api.main.id
route_key = "POST /contact"
target = "integrations/${aws_apigatewayv2_integration.lambda.id}"
}
resource "aws_apigatewayv2_stage" "default" {
api_id = aws_apigatewayv2_api.main.id
name = "$default"
auto_deploy = true
access_log_settings {
destination_arn = aws_cloudwatch_log_group.api.arn
format = jsonencode({
requestId = "$context.requestId"
ip = "$context.identity.sourceIp"
method = "$context.httpMethod"
path = "$context.path"
status = "$context.status"
responseLatency = "$context.responseLatency"
})
}
}
# Lambda の Resource Policy (API GW から呼べるようにする)
resource "aws_lambda_permission" "apigw" {
statement_id = "AllowAPIGW"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.fn.function_name
principal = "apigateway.amazonaws.com"
source_arn = "${aws_apigatewayv2_api.main.execution_arn}/*/*"
}
用語集
- HTTP API (v2) / REST API (v1)
- API Gateway の 2 系統。新規は HTTP API、API Key/Usage Plan 必須なら REST API。
- Lambda Proxy 統合 (AWS_PROXY)
- HTTP リクエスト全体を Lambda Event に変換して渡す統合方式。
- payload v2
- HTTP API 用の新しい Event 形式。よりシンプルで使いやすい。
- Stage
- API のデプロイ環境分離。$default が標準。
- Route
- HTTP メソッド + パスの組合せ。
POST /contact等。 - Integration
- Route から流す先。AWS_PROXY (Lambda) / HTTP_PROXY / AWS Service / Mock。
- Authorizer
- JWT / Lambda / IAM の 3 種類で API 全体or Route 単位の認可を制御。
- Throttling
- リクエスト/秒上限の制御。アカウント / API / Route 単位で設定可。
- WebSocket API
- 双方向通信用 API。チャットや通知向け。connection-id で同時接続を識別。
- Lambda Function URL
- API Gateway を介さずに Lambda を直接 HTTPS で公開する代替機能。