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。

主な機能

使うべきパターン

使わない方が良いパターン

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 で公開する代替機能。