AWS Certified Developer - Associate (DVA-C02) #3 Domain 1-2 AWS サービスでの開発 — API Gateway

読了 6分

#2 Lambda の深掘り でバックエンドロジックを整理したので、今回はその前で HTTP リクエストを受ける関門である API Gateway です。サーバーレス API はほぼ常に クライアント → API Gateway → Lambda → DynamoDB という構造なので、試験はこの関門で認証・スロットリング・キャッシングをどう扱うかを問います。

REST API vs HTTP API #

API Gateway には 2 種類があります。試験は「どちらを選ぶべきか」をコスト・機能のトレードオフとして問います。

区分REST APIHTTP API
コストより高い約 70% 安い
レイテンシ普通より低い
認証IAM, Cognito, Lambda オーソライザーIAM, JWT (Cognito/OIDC), Lambda オーソライザー
機能API キー・使用量プラン、キャッシング、リクエスト検証、WAFコア機能中心 (キャッシング・API キーなし)
推奨豊富な機能が必要なときシンプルな Lambda/HTTP プロキシ、コスト・レイテンシ優先

核心を一行で: 機能がより必要なら REST、安くて速いことが優先なら HTTP API です。API キー・使用量プラン・キャッシング・リクエスト検証が必要なら REST API でなければなりません。

Lambda 統合 — プロキシ vs 非プロキシ #

API Gateway が Lambda を呼び出す方式は 2 つあります。

  • Lambda プロキシ統合 — リクエスト全体 (ヘッダー・クエリ・ボディ・パス) を決まった形式のイベントとして Lambda にそのまま渡し、Lambda は statusCodeheadersbody を含む決まった形式で応答します。マッピング設定がほとんどなくシンプルで、最も一般的です。
  • 非プロキシ (カスタム) 統合 — マッピングテンプレート (VTL) でリクエスト・レスポンスを変形します。細かい制御が可能ですが複雑です。

プロキシ統合で Lambda が決まった応答形式 (statusCode/body) を守らないと 502 Bad Gateway が出ます。試験の常連エラーです。

認証 — 3 つの方式 #

API Gateway で誰が呼び出せるかを制御する方法は 3 つあります。この区別はセキュリティドメインとも結びつく核心です。

方式適した場合
IAM 認証 (SigV4)呼び出し側が AWS 認証情報を持つ場合 (他の AWS サービス、内部システム)。リクエストに SigV4 署名
Cognito User Pool オーソライザーユーザーがログインするアプリ。Cognito が発行した JWT を検証
Lambda オーソライザー (カスタム)独自トークン・サードパーティ OIDC などの カスタム認証ロジック。トークンベースまたはリクエストパラメータベース

Lambda オーソライザーは認証関数が IAM ポリシードキュメントを返して 許可/拒否を決定し、結果をキャッシュしてリクエストごとの呼び出しを減らせます。「外部の OAuth トークンを検証しなければならない」のようなカスタム要求は Lambda オーソライザーが答えです。「Cognito でログインしたユーザー」なら Cognito オーソライザーです。

スロットリングと使用量プラン #

API Gateway はリクエスト速度を制限してバックエンドを保護します。

  • アカウント・ステージレベルのスロットリング — デフォルトの秒間リクエスト (rate) とバースト (トークンバケット) の上限。
  • 使用量プラン (Usage Plan) + API キー — 顧客・ティアごとに呼び出し上限とクォータ (quota) を変えて適用。REST API 専用機能 です。

上限を超えるとクライアントは 429 Too Many Requests を受けます。「特定の顧客等級に月間呼び出し回数を制限するには?」の答えは 使用量プラン + API キー です。API キー自体は認証手段ではなく 識別・計量の手段 だという点が落とし穴です。

キャッシング #

REST API はステージレベルで レスポンスキャッシュ を有効にできます。同じリクエストに対するバックエンド呼び出しを減らし、レイテンシとコストを下げます。TTL を設定し、クライアントが Cache-Control ヘッダーでキャッシュを無視できるよう許可することもできます。HTTP API にはキャッシングがありません。

ステージとステージ変数 #

  • ステージ (Stage)devprod のようなデプロイ環境です。デプロイは常に特定のステージに対して行われます。
  • ステージ変数 (Stage Variable) — ステージごとに異なる値を注入するキーと値です。例えば dev ステージは Lambda の dev エイリアスを、prodprod エイリアスを指すようにして 1 つの API 定義で環境ごとのバックエンドを分岐 します。

ステージ変数を Lambda エイリアスと結びつけると、API 定義を変えずに環境ごとに異なる関数バージョンを呼び出せます。

CORS #

ブラウザから別のオリジンの API を呼び出すと CORS が適用されます。ブラウザは本リクエストの前に OPTIONS プリフライト を送り、API Gateway は Access-Control-Allow-Origin などのヘッダーで応答する必要があります。

試験の落とし穴: フロントエンドで「CORS エラー」が出たら、コードではなく API Gateway (またはプロキシ統合時は Lambda の応答ヘッダー) で CORS を有効化 する必要があります。プロキシ統合では Lambda の応答に CORS ヘッダーを直接入れる必要がある場合が多いです。

その他の試験ポイント #

  • リクエスト検証 (Request Validation) — REST API はモデル (JSON Schema) でリクエストのボディ・パラメータを検証し、誤ったリクエストを Lambda の前で弾けます。
  • WAF 連携 — REST API に WAF を付けて L7 攻撃を遮断します。
  • タイムアウト — API Gateway の統合タイムアウトは最大 29 秒です。それより長い作業は非同期パターン (202 応答 + ポーリング/イベント) に変える必要があります。
  • エンドポイントタイプ — Edge-optimized (CloudFront 経由)、Regional、Private (VPC 内部)。

試験の出題パターン #

  • 「コストとレイテンシが最も重要で、シンプルな Lambda プロキシだけが必要だ。」 → HTTP API
  • 「API キーで顧客ごとの月間クォータを設けたい。」 → REST API + 使用量プラン + API キー
  • 「Cognito でログインしたユーザーだけ呼び出し許可。」 → Cognito User Pool オーソライザー
  • 「サードパーティの OAuth トークンを独自ロジックで検証。」 → Lambda オーソライザー
  • 「プロキシ統合の Lambda が 502 を返す。」 → Lambda の応答形式 (statusCode/body) の不一致
  • 「同じリクエストがバックエンドを繰り返し呼んで遅い。」 → API Gateway キャッシング
  • 「ブラウザで CORS エラー。」 → API Gateway/Lambda で CORS を有効化

まとめ #

この記事の要点:

  • REST API (機能豊富・API キー・キャッシング・リクエスト検証) vs HTTP API (安い・低レイテンシ)
  • Lambda プロキシ統合 が基本。応答形式を破ると 502
  • 認証 — IAM (SigV4)・Cognito オーソライザー・Lambda オーソライザー の 3 系統
  • 使用量プラン + API キー で顧客ごとの上限。超過時は 429。API キーは認証ではなく計量
  • キャッシング・リクエスト検証・WAF は REST API の機能
  • ステージ変数 + Lambda エイリアス で環境ごとのバックエンド分岐
  • CORS・29 秒タイムアウトは常連の落とし穴

次へ — Domain 1-3 DynamoDB 開発 #

API の後ろにはデータがあります。サーバーレスで最もよく使われるデータベースは DynamoDB です。#4 DynamoDB 開発 では、パーティションキーの設計、LSI と GSI の違い、読み込み整合性、条件付き書き込みと楽観的ロック、DynamoDB Streams、そして DAX キャッシングまで見ていきます。

X