Amazon API Gateway 基礎 〜REST/HTTPの違いからCORSまで〜(途中)

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関数は必ず指定されたフォーマット(statusCodeheaders、シリアライズされた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
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次