ちょっと話題の記事

[アップデート] より高速に!より低コストに!プライベート統合も可能に!API Gateway の HTTP API が GA されました!

GA版でプライベート統合も追加され、ますますアーキテクチャの幅が広がる!
2020.03.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

re:Invent 2019 でベータとして発表されておりました Amazon API Gateway の新プラン「HTTP API」が本日 GA されました!

HTTP API とは

API Gateway ではこれまで REST API , WebSocket API が提供されておりましたが、ユーザーから以下のような要望がありました。

  • より多くの機能が欲しい
  • より低いレイテンシーで使いたい
  • より低コストに使いたい

これらのフィードバックに応える形で提供されたのが「HTTP API」です。

コストについては最大で 71% 削減、p99 レイテンシーについては 60% 改善が期待されます!

このあたりの情報については諏訪の記事をあわせてお読みください。

HTTP API と REST API の比較

HTTP API は REST API に比べるとコア機能に絞り込まれていますので、REST API では使えたが HTTP API では使えない機能があります。

また、その反対に REST API では使えないが HTTP API でのみ使える機能もあります。

このあたりの機能比較についても諏訪の記事が大変参考になりますので、あわせてお読みください。

GA で更に追加された機能

GA のタイミングで新たに以下の機能が追加されています!

プライベート統合

VPC で保護されたリソースと統合できるようになりました。プライベート統合を作成するには VPC リンクが必要となります。VPC リンクを用いて NLB/ALB または Cloud Map を介することで ECS や EKS など VPC リソースの API として構成が可能となります。

カスタムドメインの相互互換

REST API と HTTP API でカスタムドメインを共有が可能となりました。この機能により URL のパスによって REST API、HTTP API の振り分けが可能となります。

この機能の追加により、サイトすべてで HTTP API か REST API を検討する必要はなく、どうしても REST API で残すひつようがある場合は従来どおりの REST API で処理する、ということも可能になりそうですね。

リクエストのスロットリング

API Gateway ではデフォルトで定常レートで 10,000 リクエスト/秒、バーストをアカウントあたり 5,000 リクエストという API スロットルを設けていますが、HTTP API でこれらのスロットルをステージレベルでオーバーライドすることができます。

ステージ変数

ステージ変数をサポートし、動的データをバックエンド統合に渡すことができます。例えば以下のような場合、dev ステージのリンクにアクセスすると、dev ステージ変数をバックエンド統合に渡されますので環境固有の情報を連携する際に役立ちます。

ステージ ルート
default www.example.com
dev www.example.com/dev

Lambda ペイロードバージョン2.0

Lambda プロキシ統合でペイロード形式バージョン2.0をサポートするようになりました。ペイロードバージョン2.0は、Lambda に送信されるイベントオブジェクトの形式を簡素化します。HTTP API ではデフォルトでペイロードバージョン2.0を使用します。

OpenAPI/Swagger サポート

OpenAPI または Swagger構成ファイルのインポートをサポートするようになりました。サポートされたことにより、他の API Gateway サービスから HTTP API への移行が容易になります。

AWS SAM のサポート

2020年3月20日までに、これらの GA で追加された機能が AWS SAM でサポートされるとのことです!

AWS SAM support for many GA features is scheduled for release by March 20, 2020.

やってみる

事前準備

以下の Lambda 関数を事前に準備しておきます。(Node.js のサンプルです)

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

HTTP API の作成

API Gateway のダッシュボードをひらくと Beta の冠がなくなっていますね![HTTP API] の Build をクリックして進みます。

[ Add integration ] を選択し、Lambda か HTTP を選択します。今回は Lambda を選択しています。Lambda 関数を指定し、任意の API 名を入力して次へ。

次にルートを構成します。ルートでは呼び出す HTTP メソッドと、リクエストパス、API リクエストを送るバックエンド統合で構成されます。今回は HTTP メソッド ANY で設定していますが、必要に応じて選択してください。

これでステージを構成する準備ができました。HTTP API は API のベース URL から提供される $default ステージをサポートします。今回は $default ステージとしてます。また、HTTP API 固有の機能である Auto-deploy も有効にしています。

設定を確認し、作成します。

Auto-deploy を有効にしているので、REST API のようにデプロイ処理を行う必要はありません。

動作確認

作成された Invoke URL に作成したルート(/httpapi-test)を追加してリクエストしてみます。

$ curl https://pa91zc6pag.execute-api.ap-northeast-1.amazonaws.com/httpapi-test
"Hello from Lambda!"

特にデプロイ操作は行っていませんが、正常に動作していますね!

簡単ではありますが、検証は以上です。

さいごに

re:Invent 2019 で発表された HTTP API が GA されましたのでサクッと試してみました。

REST API に比べると利用可能な機能は制限されますが、HTTP API は低レイテンシー、低コストで利用することが可能です。機能比較表をよく確認いただき、HTTP API がハマるかハマらないか検討いただきご利用ください。

またベータ版から機能追加されてプライベート統合なども可能となりましたので、より柔軟なアーキテクチャが構成できるようになったかと思います。当ブログでも今後、やってみた記事がたくさん上がってくるんじゃないかと思います!

以上!大阪オフィスの丸毛(@marumo1981)でした!