図解で理解するAmazon API Gateway
はじめに
API(Application Programming Interface)とは、サービス提供者が作成したアプリケーションサービスを外部公開し、利用者に使ってもらうための窓口です。
一方、Gatewayとは、異なるシステム・ネットワーク間で、通信を仲介・制御する玄関口です。
この二つを組み合わせたAPI Gatewayは、複数のAPIエンドポイントに対する「単一のアクセスポイント」を提供するサービスです。

API Gatewayとは
AWS提供のフルマネージド型サービスで、開発者がAPIを作成、公開、保守するためのツール。API Gatewayを使用すると、外部から AWS のバックエンドサービスや AWS 以外の HTTP ベースのサービスを利用するための窓口となる API を作成可能。3つのAPIをサポート。

3種類のAPI比較表
| 種類 | 概要 |
|---|---|
| REST API | REST設計に沿ったAPI。多機能で設定も細かい。複雑なAPI、認証・監視・細かい制御が可能 |
| HTTP API | RESTにこだわらない軽量版のAPI。シンプルなREST/RPC API、高パフォーマンスを求める場合に使用。 |
| WebSocket API | 双方向通信が可能なAPI。チャット、通知、リアルタイム系サービスで使用 |
APIからの転送先
※どのAPIもVPCリンクにも転送可能

API Gatewayの転送先
API Gatewayが動作する仕組み
初期の設定
REST APIを作成する場合、エンドポイントタイプを以下の種類から選択

エッジ最適化を選択した際の動作フロー
- ユーザーのアプリケーションは、最も近いCloudFrontのエッジサーバーにリクエストを送信
- CloudFrontからAPI Gatewayにリクエストが転送
- API Gatewayがキャッシュ有効の場合は、キャッシュから取得、レスポンス
- キャッシュがない場合は、事前に設定されたバックエンドサービスへ転送。その際にスロットリングと呼ばれる流量制御を行う
- スロットリングを通過したリクエストは背後のバックエンドサービスに届けられる

API Gatewayの動作フロー
🚥 スロットリングとは
流量制御のこと。
エンドポイントURLに対するリクエスト数が多すぎる場合、制限をかけることで、トラフィックの急増に対しバックエンドサービスを守ることが可能。
スロットリングのタイプ
| タイプ | 概要 |
|---|---|
| サーバー側の制限 |
全てのクライアントに適用。リクエストが多すぎるために、バックエンドサービスが処理しきれなくることを防止 |
| クライアントあたりの制限 | クライアントごとに「使用料プラン」に応じて制限を行う |
スロットリングの段階
| 段階 | 項目 | 説明 |
|---|---|---|
| 1 | AWSアカウントレベルのスロットリング | デフォルトで、リクエストのレート(1秒あたりのリクエスト数上限)を1万リクエスト/秒に制限。また、バースト(1m秒あたりのアクセス数上限)をAWSアカウント内の全てのAPIに渡って5千リクエストに制限
|
| 2 | ステージ / メソッド |
特定のステージまたはAPIの個別メソッドで、AWSアカウントレベルのスロットリング制限を上書きし、上限値を設定。AWSアカウントレベルの上限値を超えることは不可 |
| 3 | APIキー | クライアントのAPIキーごとに「使用量プラン」に基づいて、スロットリング制限を実施 |
| 4 | キー / メソッド | クライアントの「使用量プラン」に基づいて、メソッドレベルでの追加のスロットリング制限を実施 |
使用料プランの設定
🟦 レート制限:1秒あたりのアクセス数上限
🟩 クオータ:1日あたり、週あたり、または月あたりに可能なリクエストの数
🟪 APIステージ:アクセス可能なAPIとAPIのステージ

スロットリングの全体像
API Gatewayの重要な機能
IAMアクセス権限
AWS署名バージョン4を利用した認証と認可を行う。
AWS署名バージョン4は、IAMユーザーのアクセスキー(アクセスキーIDとシックレットアクセスキー)を元に作成したハッシュ値。
クライアントはこのハッシュ値をHTTPリクエストヘッダにセットしてAPI Gatewayにリクエストを送信。
API Gatewayでハッシュ値の検証を行い、問題がなければAPIの呼び出しを許可。
Lambdaオーソライザー
- クライアントからBearerトークンもしくはHTTPリクエストヘッダのパラメータに認証情報を付与したリクエストを送付
- Lambdaがトークンの検証を行い、認証に成功するとLambdaからIAMポリシーとプリンシパルIDを含むオブジェクトを返却
- API GatewayがIAMポリシーの評価を行い、問題がなければAPIの呼び出しを行う

lambdaオーソライザーの流れ
Cognitoオーソライザ
Amazon Cognitoのユーザープールを利用した認証を行う。
クライアントはCognitoのユーザープールで認証を行ってトークン(JWT)を取得し、HTTPリクエストヘッダにトークンをセットして、API Gatewayにリクエストを送信。API GatewayはCognitoを参照してトークンを検証し、問題がなければAPIの呼び出しが許可。

Cognitoオーソライザーの流れ
APIのキャッシュ
ステージごとにキャッシュを定義し、バックエンドのトラフィックを削減可能。キャッシュするコンテンツの容量や有効期限(TTL:TimeToLive)も設定可能。キャッシュしたコンテンツを更新したいときは、一時的にキャッシュを無効化する。
個別のリクエストでキャッシュを無効化したい場合は、HTTPヘッダに「Cache-Control:max-age = 0」を設定しリクエストを送信
カナリアリリース
任意のステージに対して、「Canary」という特別なステージを定義可能。API Gatewayへのリクストを指定した比率でCanaryステージへ分配可能。Canaryステージに新たに定義し直したAPIをデプロイすることで、既存と新規APIを並列で動かし、テストを行える。テスト完了後、Canaryを昇格させる運用が可能。
WAF連携
API GatewayにAWS WAF(Web Application Firewall)のACL(Access Control List)を指定することで、SQLインジェクションやクロスサイトスクリプティングなどのセキュリティ攻撃を防ぐことができる。

監視連携
API Gatwayは、CloudWatchやX-Rayとシームレスに連携可能。「API呼び出し回数」や「レイテンシ」、「統合レイテンシ」、「4××系エラー数」や「5××系エラー数」といった情報が標準メトリクスとしてCloudWatchに収集されるほか、X-Rayトレースを有効化するだけで、リクエストの処理パフォーマンス分析やデバッグが可能。
まとめ
- API Gateway は、外部からのリクエストを受け付けてバックエンド(Lambda や EC2 など)へつなぐ API の入り口
- 認証・認可、リクエスト変換、スロットリングなどを提供し、安全で効率的な API 運用をサポート
- サーバーレス構成と相性が良く、スケーラブルに API を公開できるサービス
Discussion