Amazon API GatewayのREST APIとHTTP API、結局どっちを選べばいいのか
出典: https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-vs-rest.html
結論:機能が要らないならHTTP API、必要ならREST API
Amazon API Gatewayには「REST API」と「HTTP API」という2つのタイプがある。 どちらも「外部からのHTTPリクエストを受け取り、Lambda関数などのバックエンドに橋渡しする」という基本的な役割は同じだが、対応している機能の幅が大きく異なる。
公式ドキュメントの結論はシンプルだ。
- REST APIを選ぶべき場合: APIキー、クライアントごとのリクエスト制限、リクエスト内容の事前検証、AWS WAF(Web攻撃を防ぐファイアウォール)連携、プライベートなAPIエンドポイントのいずれかが必要なとき
- HTTP APIを選ぶべき場合: 上記のような機能がとくに必要なく、低価格でシンプルなAPIを作りたいとき
つまり「多機能だが複雑なREST API」か「機能を絞った分、低価格でシンプルなHTTP API」かという二択であり、必要な機能から逆算して選ぶのが基本方針になる。
カテゴリ別に見る機能差
比較表は6つのカテゴリに分かれている。それぞれ何を意味するか、初学者向けの補足を添えて紹介する。
エンドポイントタイプ(APIをどこに公開するか)
| 機能 | REST API | HTTP API |
|---|---|---|
| エッジ最適化 | ○ | × |
| リージョン別 | ○ | ○ |
| Private | ○ | × |
「エッジ最適化」とは、世界中に配置されたAWSの中継拠点(CloudFront)を経由させ、地理的に離れたユーザーからのアクセスを速くする仕組みのこと。「Private」は、インターネットに公開せず、AWS内部のネットワーク(VPC)からしかアクセスできないようにする設定だ。HTTP APIは「リージョン別」(特定のAWS地域に閉じた公開)にしか対応していない。
セキュリティ(不正アクセス・なりすまし対策)
| 機能 | REST API | HTTP API |
|---|---|---|
| 相互TLS認証 | ○ | ○ |
| バックエンド認証用の証明書 | ○ | × |
| AWS WAF | ○ | × |
「相互TLS認証」は、サーバーとクライアントの双方が証明書を提示し合い、なりすましを防ぐ仕組み。両タイプとも対応している。一方、「AWS WAF」(不正なリクエストパターンを検知してブロックするサービス)との連携はREST API専用だ。
認可(誰にアクセスを許可するか)
| 機能 | REST API | HTTP API |
|---|---|---|
| IAM | ○ | ○ |
| リソースポリシー | ○ | × |
| Amazon Cognito | ○ | ○(注1) |
| Lambda関数を使ったカスタム認可 | ○ | ○ |
| JSONウェブトークン(JWT)(注2) | × | ○ |
注1: Amazon Cognito(AWSが提供するユーザー認証サービス)は、HTTP APIではJWTオーソライザー(後述)経由で使う形になる。 注2: REST APIでも、Lambda認証を組み合わせればJWTを検証すること自体は可能。
ここで目を引くのは、JWT(利用者情報を含む署名付きトークン)のオーソライザー機能がHTTP API専用になっている点だ。JWTは近年のAPI認証で広く使われる方式のため、この機能単体を目当てにHTTP APIを選ぶケースもある。逆にREST APIは、アクセス元のIPアドレスなどで細かく許可・拒否を指定できる「リソースポリシー」に対応している。
API管理(運用・課金まわりの機能)
| 機能 | REST API | HTTP API |
|---|---|---|
| カスタムドメイン | ○ | ○ |
| APIキー | ○ | × |
| クライアントごとのレート制限 | ○ | × |
| クライアントごとの使用量調整 | ○ | × |
| デベロッパーポータル | ○ | × |
このカテゴリはREST APIが大きく優勢だ。「APIキー」はAPI利用者ごとに発行する鍵、「レート制限」はその利用者が一定時間内に送れるリクエスト数の上限だ。外部の開発者にAPIを公開して、利用者ごとに使用量を管理・課金したいようなユースケースでは、REST API側の機能が必要になる。
開発(作り込み・デプロイ周りの機能)
| 機能 | REST API | HTTP API |
|---|---|---|
| CORSの設定 | ○ | ○ |
| テスト呼び出し | ○ | × |
| キャッシュ | ○ | × |
| ユーザー制御のデプロイ | ○ | ○ |
| 自動デプロイ | × | ○ |
| カスタムゲートウェイレスポンス | ○ | × |
| Canaryリリースのデプロイ | ○ | × |
| リクエストの検証 | ○ | × |
| リクエストパラメータ変換 | ○ | ○ |
| リクエスト本文変換 | ○ | × |
「CORS」は、別ドメインのWebサイトからAPIを呼び出す際に必要な許可設定で、両タイプとも対応している。「Canaryリリース」は、新しいバージョンのAPIを一部のトラフィックだけに先行公開して様子を見る手法だが、これはREST APIのみ。逆にHTTP APIは、設定を変更すると自動でデプロイされる「自動デプロイ」に対応しており、この点はシンプルさを重視した設計思想が表れている。
モニタリング(動作状況の把握)
| 機能 | REST API | HTTP API |
|---|---|---|
| Amazon CloudWatchメトリクス | ○ | ○ |
| CloudWatch Logsへのアクセスログ | ○ | ○ |
| Amazon Data Firehoseへのアクセスログ | ○ | × |
| 実行ログ | ○ | × |
| AWS X-Rayトレース | ○ | × |
基本的な稼働状況の記録(CloudWatch)はどちらでも取れるが、「AWS X-Rayトレース」(リクエストがどのサービスをどう経由したかを可視化する仕組み)のような詳細な分析機能はREST API専用だ。障害調査を細かく行いたい場合はREST APIに分がある。
統合(バックエンドとの接続方式)
| 機能 | REST API | HTTP API |
|---|---|---|
| パブリックHTTPエンドポイント | ○ | ○ |
| AWSのサービス | ○ | ○ |
| AWS Lambda関数 | ○ | ○ |
| Network Load Balancerとのプライベート統合 | ○ | ○ |
| Application Load Balancerとのプライベート統合 | ○ | ○ |
| AWS Cloud Mapとのプライベート統合 | × | ○ |
| Mock統合 | ○ | × |
| レスポンスストリーミング | ○ | × |
主要なバックエンド接続方式は両タイプとも幅広くカバーしている。面白いのは「AWS Cloud Mapとのプライベート統合」(動的に変化するサービスの場所を自動で見つけて接続する仕組み)だけはHTTP API専用という点で、統合カテゴリでは唯一HTTP APIが上回る項目になる。
まとめ
比較表を通して見ると、差が出ているのは主に「APIキーによる利用者管理」「詳細な監視・デバッグ機能」「プライベート公開やWAF連携」といった、運用を作り込むための機能だ。逆に、Lambda連携やCORS設定といった基本機能はどちらでも変わらない。
したがって選択の考え方はこうなる。
- まず自分のAPIに「APIキー管理」「レート制限」「WAF連携」「プライベート公開」「リクエスト検証」のいずれかが必要かを確認する
- 1つでも必要ならREST API
- どれも不要なら、低価格でシンプルなHTTP APIで十分
新規にAPIを作る際は、まず必要機能をこのリストと照らし合わせてから、タイプを決めるとよさそうだ。
本記事は Sonnet 5(claude-sonnet-5)が生成しました。