AWS Certified Developer - Associate (DVA-C02) #3 Domain 1-2 AWS サービスでの開発 — API Gateway
#2 Lambda の深掘り でバックエンドロジックを整理したので、今回はその前で HTTP リクエストを受ける関門である API Gateway です。サーバーレス API はほぼ常に クライアント → API Gateway → Lambda → DynamoDB という構造なので、試験はこの関門で認証・スロットリング・キャッシングをどう扱うかを問います。
REST API vs HTTP API #
API Gateway には 2 種類があります。試験は「どちらを選ぶべきか」をコスト・機能のトレードオフとして問います。
| 区分 | REST API | HTTP 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 は
statusCode・headers・bodyを含む決まった形式で応答します。マッピング設定がほとんどなくシンプルで、最も一般的です。 - 非プロキシ (カスタム) 統合 — マッピングテンプレート (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) —
dev、prodのようなデプロイ環境です。デプロイは常に特定のステージに対して行われます。 - ステージ変数 (Stage Variable) — ステージごとに異なる値を注入するキーと値です。例えば
devステージは Lambda のdevエイリアスを、prodはprodエイリアスを指すようにして 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 キャッシングまで見ていきます。