Amazon API Gatewayはサーバーレスアーキテクチャの入り口として頻出する重要サービスです。
本記事では、AWSの公式ドキュメントおよびAWS Compute Blog等の公式情報に基づき、実務設計で必須となる知識を解説します。
1. REST API と HTTP API の比較と選択
API GatewayでRESTfulなAPIを構築する際、「REST API」と「HTTP API」の2種類から選択できます。
- HTTP API: APIプロキシ機能に特化し、REST APIに比べて低コスト(100万リクエストあたり$1.00〜)で、レイテンシーを低く抑えることができます。JWTオーソライザー(OIDCやOAuth 2.0による認可)や自動デプロイ機能をネイティブでサポートしているため、シンプルなサーバーレスワークロードに最適です。
- REST API: APIキーや使用量プランによるクォータ管理、リクエストの検証、AWS WAFとの統合、エッジでのAPIキャッシュ、プライベートエンドポイント(VPCエンドポイント)など、高度なAPI管理機能が必要な場合に選択します。
2. インテグレーション(統合)タイプ:プロキシ vs カスタム
API Gatewayがバックエンド(Lambdaなど)と通信する際の統合タイプには、以下のような種類があります。
- AWS_PROXY (Lambdaプロキシ統合): クライアントからのリクエストをそのままLambda関数に渡し、Lambda関数の出力をHTTPレスポンスとしてクライアントに返します。設定がシンプルであり、Lambdaと統合する際の推奨方式です。この方式では、Lambda関数は必ず指定されたフォーマット(
statusCode、headers、シリアライズされたJSONであるbody)でレスポンスを返す必要があります。 - AWS (Lambdaカスタム統合 / 非プロキシ): API Gateway側でマッピングテンプレートを利用し、リクエストやレスポンスのデータを変換できる方式です。
- MOCK (モック統合): バックエンドにリクエストを送らず、API Gatewayが直接レスポンスを返します。APIのテストや、CORSのためのプリフライトリクエスト(OPTIONSメソッド)の処理に利用されます。
3. 認証と認可 (Lambda オーソライザー)
APIのアクセス制御には、IAM権限、Amazon Cognitoユーザープール、およびLambdaオーソライザーを使用できます。
Lambda オーソライザーは、Lambda関数を使用してOAuthやSAMLなどのベアラートークンの検証、またはカスタムの認可ロジックを実行する機能です。 Lambdaオーソライザーは、検証結果としてAWS Identity and Access Management (IAM) ポリシーを返却します。Lambda関数の毎回の呼び出しを避けるため、API Gatewayは返されたポリシーを最大3600秒間(デフォルトは300秒)キャッシュすることができます。
4. トラフィック制御とスロットリング
API Gatewayは、バックエンドを過剰なリクエストから保護するために「トークンバケットアルゴリズム」を用いてリクエストをスロットリング(流量制限)します。
スロットリングやクォータ(上限)のターゲットは、アカウントレベル(リージョンごと)、API/ステージレベル、メソッドレベル、および使用量プランで設定することができます。これらは厳密な上限というよりは「ターゲット(ベストエフォート)」として適用され、制限を超えたリクエストには 429 Too Many Requests エラーが返されます。
5. ステージ変数 (Stage Variables) の活用
ステージ変数は環境変数のようにはたらき、APIのデプロイステージ(dev、prodなど)に応じてAPI Gatewayの挙動を変更するために使用します。 たとえば、統合先のLambda関数名を ${stageVariables.lbfunc} のように指定することで、ステージごとに異なるLambda関数を呼び出すことができます。
⚠️ 重要な注意点: ステージ変数を使用して動的にLambda関数を指定する場合、API GatewayからそのLambda関数を呼び出す権限が自動的には付与されません。そのため、AWS CLIなどを利用して対象となる各Lambda関数に実行権限(lambda:InvokeFunction)を手動で付与するか、呼び出し用のIAMロールを設定する必要があります。
6. CORS (Cross-Origin Resource Sharing) の設定
異なるドメインからAPIを呼び出す場合、ブラウザのセキュリティ機能であるCORSを適切に構成する必要があります。
API GatewayのREST APIで Lambdaプロキシ統合(AWS_PROXY) を使用している場合、API Gatewayはリクエストやレスポンスを改変しません。そのため、API Gateway側でCORS設定を行ってOPTIONSメソッドを追加しても、GETやPOSTなどの実際のメソッドに対するレスポンスには影響しません。バックエンドのLambda関数自身のコード内で、必ず Access-Control-Allow-Origin などのCORSヘッダーを含めてレスポンスを返す必要があります。
7. WebSocket API
WebSocket APIを利用すると、チャットアプリなどのリアルタイム双方向通信をサーバーレスで構築できます。
- 接続ライフサイクル: クライアントの接続時には
$connectルートが、切断時には$disconnectルートが呼び出されます。ただし、$disconnectルートは接続が閉じられた後に実行される「ベストエフォート」のイベントであり、配信が完全に保証されるわけではありません。 - バックエンドからのコールバック: バックエンドサービス(Lambdaなど)から接続中のクライアントにメッセージを送信したり、切断したりするには、
@connectionsコマンド(API Gateway Management API)を使用します。このAPIを呼び出す際はIAM認可(SigV4署名)が必要です。
📚 参考・引用サイト(AWS公式ドキュメント)
本記事は、以下のAWS公式ドキュメントおよびAWS Compute Blogの情報を基に作成しています。
- Choose between REST APIs and HTTP APIs – Amazon API Gateway https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html
- Choose an API Gateway API integration type https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-api-integration-types.html
- Lambda proxy integrations in API Gateway https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
- Use API Gateway Lambda authorizers https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html
- Introducing custom authorizers in Amazon API Gateway | AWS Compute Blog https://aws.amazon.com/blogs/compute/introducing-custom-authorizers-in-amazon-api-gateway/
- Throttle requests to your REST APIs for better throughput in API Gateway https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html
- Using API Gateway stage variables to manage Lambda functions | AWS Compute Blog https://aws.amazon.com/blogs/compute/using-api-gateway-stage-variables-to-manage-lambda-functions/
- CORS for REST APIs in API Gateway https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
- Configuring CORS on Amazon API Gateway APIs | AWS Compute Blog https://aws.amazon.com/blogs/compute/configuring-cors-on-amazon-api-gateway-apis/
- Manage connected users and client apps: $connect and $disconnect routes https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-route-keys-connect-disconnect.html
- Use @connections commands in your backend service https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-how-to-call-websocket-api-connections.html
