ちょっと話題の記事

Amazon API Gatewayは「HTTP API」と「REST API」のどちらを選択すれば良いのか? #reinvent

Amazon API Gatewayの新機能「HTTP API」はREST APIの上位互換というわけではなく「API Gatewayのコアな機能に特化して低コストで利用したい場合に適した機能」という位置付けになっています。つまりREST APIと比較するとできないことがいくつかあります。本記事では新しく提供されるHTTP APIがどういう場合に適しているかより掘り下げてみました。
2019.12.31

Amazon API Gatewayの新機能「HTTP API」

re:Invent 2019期間中、Amazon API Gatewayの新機能「HTTP API」が発表されました。現在プレビューとして、US East (Ohio), US East (N. Virginia), US West (N. California), US West (Oregon), Asia Pacific (Sydney), Asia Pacific (Tokyo), EU (Frankfurt), EU (Ireland)で提供されています。

HTTP APIはREST APIの上位互換というわけではなくAPI Gatewayのコアな機能に特化して低コストで利用したい場合に適した機能という位置付けになっています。つまりREST APIと比較するとできないことがいくつかあります。

本記事では以下のドキュメントをベースに、新しく提供されるHTTP APIがどういう場合に適しているかより掘り下げてみたいと思います。

本記事はプレビュー版として公開されているドキュメントを参考にした考察です。本リリース時には仕様などが変わる可能性がありますのでご容赦ください。

HTTP APIの特徴

まずHTTP APIの特徴について簡単にまとめます。

低レイテンシ・コスト最適化

REST APIに比べると機能が限られますが、コアな機能のみの提供に絞ることで低レイテンシかつ低コスト(コスト最適化)を実現しています。

HTTP APIが提供する機能がユースケースに合致するかが、HTTP APIを選択する上での特に重要なポイントになります。

AWS LambdaプロキシまたはHTTPプロキシのみ

呼び出し先にはAWS LambdaプロキシまたはHTTPプロキシのいずれかが設定できます。API Gateway + Lambdaの構成を作りたい場合は問題ありませんが、例えば他のAWSサービスとダイレクトに連携するなどといったことはできないので注意が必要です。

OpenID ConnectとOAuth 2.0をサポート

下記で解説させていただいた通り、OpenID ConnectおよびOAuth 2.0の規格に準拠する形でのJWTでの認証のみをサポートします。

認証基盤にCognito User Poolsを利用する場合、User PoolsをOIDC Providerとして連携することができます。

自動デプロイですぐに利用開始が可能

REST APIで煩雑だったStageの用意が自身で用意しなくても、API作成時に自動で作成されるようになります。例えばREST APIでは Prod といったStageを用意していたかと思います。

https://{api_id}.execute-api.{region}.amazonaws.com/Prod/

これがHTTP APIの場合はDefault RouteとDefault Stageが用意されることにより、デフォルトで以下のようになります。

https://{api_id}.execute-api.{region}.amazonaws.com/

また自動デプロイがデフォルトで有効になっているため、APIを更新すると即座にStage(公開中の環境)が更新されるようになります。立ち上げが迅速に行えるメリットがあります。

HTTP APIとREST APIの比較

認証

Authorizers HTTP API REST API
AWS Lambda
IAM
Amazon Cognito User Pools ○(※)
Native OpenID Connect / OAuth 2.0

※ Native OpenID Connect / OAuth 2.0として連携可能

HTTP APIの特徴としてJWT Authorizerが挙げられますが、逆に言うとJWT Authorizerのみしか利用できません。REST APIでは、APIの実行権限をIAMで与えることができましたが、そのようなユースケースで利用したい場合はHTTP APIは適していません。

前述の通り、Amazon Cognito User Poolsの連携についてはOIDC Providerとしての連携のみが可能です。

連携

Integration HTTP API REST API
HTTP proxy
Lambda proxy
HTTP
AWS services
Private integration
Mock

前述の通りどちらもLambdaプロキシ、HTTPプロキシが利用できます。従来のAPI Gatewayの特徴的な機能であるAWSサービスと直接繋げる場合はREST APIを選択します。また、VPC内でインターナルに利用したい場合もREST APIを選択します。

API管理

API Management HTTP API REST API
Usage plans
API keys

Usage plansおよびAPI keysは、構築したAPIを外部システム向けに公開する場合などに便利な機能ですが、コアな機能ではないためHTTP APIでは提供されていません。しかしスロットリングの機能は標準で提供されるため、単純にスロットリングをさせたい場合はHTTP APIでも実現可能です。

デプロイ

Deployment HTTP API REST API
Cache
Request transformation
Request / response validation
Test invocation
CORS configuration
Automatic deployments
Default stage
Default route

明確に機能差が出るところです。

REST APIは多機能で、キャッシュ、リクエスト変換、バリデーション、テスト実行などが提供されます。一方HTTP APIはそれらの機能が提供されませんが、REST APIで欲しかったような機能が提供されています。ポイントはやはり迅速に設定できるところです。CORSの一括設定や自動デプロイ、デフォルトでStageとRouteが作られるなど、REST APIで実現する際に準備に時間がかかるようなところが迅速に用意できるようになっています。

セキュリティ

Security HTTP API REST API
Client certificates
AWS WAF
Resource policies

AWS WAF連携などのセキュリティの機能はREST APIのみで提供されます。この辺りはHTTP APIでも利用できるようなアップデートに期待したいところですね。

APIの種類

API Type HTTP API REST API
Regional
Edge-optimized
Private

REST APIでは上記の種類のAPIが作成可能ですが、HTTP APIでは「低レイテンシ・コスト最適化」を主たる目的としているのでRegionalなエンドポイントを作成することができます。Edge-optimizedは端的に言うとCloudFront Distribution経由で配信されるエンドポイントですが、こちらはREST APIのみでサポートされます。また、インターナルAPIを作りたい場合もREST APIを選択します。

つまりHTTP APIはリージョンが特定的なAPIを作りたい場合に最適というわけです。

まとめ

HTTP APIはJWT Authorizerが便利な点やCORS設定が簡単な点に目が行きがちですが、主たる目的が「低レイテンシ・コスト最適化」であることを意識して選択する必要があります。

機能を絞っているためできないことが多いので、機能の比較を見てみるとREST APIで当たり前のようにできていることができない場合もあります。本記事を参考に、HTTP APIとREST APIのどちらを選択するか考えていただければ幸いです。