Amazon CloudFrontでAPI Gatewayの痒いところに手を届ける
2016/02/05 9:30 ユースケース2 API Gatewayの対応するTLSのバージョンを修正しました。@Keisuke69さんご指摘ありがとうございます!
ども、大瀧です。 Amazon API Gateway、皆さん使ってますか?Lambdaのフロントエンドとして、既存APIのRESTful化&統合として様々なケースで利用できると思います。今回は、そんなAPI GatewayをCloudFrontと組み合わる目的とその注意点をご紹介します。
概要
ご存じの方もいると思いますが、そもそもAPI Gatewayは内部でCloudFrontの仕組みを利用しており、スケーラビリティやアベイラビリティの面でCloudFrontの特徴を享受しています。しかしながら、CloudFrontのフル機能をAPI Gatewayで利用できるわけではないため、場合によっては以下の図のようにAPI Gatewayの手前にCloudFrontを置く構成を取ることがあります。
以下にCloudFrontを置くユースケースを説明していきます。
ユースケース
1. リクエストをHTTPで受けたい
API GatewayがListenするのはHTTPSのみで、HTTPリクエストを受け付けることはできません。一方CloudFrontはHTTPとHTTPSの両方のリクエストを受けられるので、CloudFrontを経由することでAPI GatewayへのリクエストをHTTPで受けることができます。
CloudFrontの[Viewer Protocol Policy]、[Origin Protocol Policy]の組み合わせで受け付けるプロトコルが変わるので、要件に応じて調整しましょう。
上記の設定では、Client-CloudFront間はHTTPSのみ(HTTPはHTTPSにリダイレクト)、CloudFront-Origin間はHTTPのみという設定になります。API Gatewayをオリジンにするのであれば、[Origin Protocol Policy]は「HTTPS Only」に設定するのが適当でしょう。
2. SSL/TLSの古いバージョンで受けたい
API GatewayはTLSバージョン1.0以降のみを受け付けるので、古いSSLv3のHTTPSリクエストを受けるためにCloudFrontを経由させて対応します。CloudFrontでSSLv3を受けることができるのは専用IPアドレスの場合のみという点に、注意しましょう。(Minimum SSL Protocol Versionという設定で選択します。SNIの場合はTLS1.0以降で固定です。)
3. アクセス制限(AWS WAF)を設けたい
API Gatewayには、APIキー認証以外にアクセス制限の機能がありません。手前にCloudFrontを置くことで、CloudFrontに統合されたAWS WAFのアクセス制限機能を設定することができます。
また、API Gatewayへの直アクセスを禁止したい場合は、前述のAPIキー認証を有効化し、先日追加されたオリジンへのヘッダ追加機能でCloudFrontのオリジン設定にx-api-key
ヘッダを追加、設定することで対応できます。
4. キャッシュを細かく指定したい
API Gatewayのステージ設定には、2度目以降のアクセスに対応するキャッシュ機能がありますが、その有効期限はTTL
という単一の設定しかできず、またキャッシュを削除するInvalidation機能はありません。CloudFrontを置くことでより細かいキャッシュ管理が可能になります。
注意 : Hostヘッダを転送してはいけない
CloudFrontとの組み合わせ時に注意しなければいけない点として、CloudFrontのヘッダ転送設定があります。 Hostヘッダを転送してしまうと、API Gatewayが正常に動作しない *1ようなので、転送対象から外すようにしましょう。
まとめ
API GatewayとCloudFrontを組み合わせるユースケースをあれこれ紹介してみました。当然利用料金はAPI Gatewayの費用にCloudFrontの転送費用が上乗せされる形になるので、予算内に収まりそうか相談しつつ検討いただくのが良いと思います。
参考URL
脚注
- API Gateway自体がSNI前提のバーチャルホスト構成なのでなんとなく納得できます。 ↩