0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS SAP対策】API Gateway と CloudFront のプロトコル受付における差分を理解する

0
Posted at

はじめに

どーも!shihopowerです!!

今回は API Gateway と CloudFront のプロトコル受付 についてお話します。

SAP対策をしていると、こんな解説に出くわしました。

API Gateway は HTTPS のみをサポートし、HTTP エンドポイントは作成できない。CloudFront なら HTTP も受け付けられる。

いつも言っていますが、こういうのを丸暗記してもどうせすぐ忘れます。なんなら試験会場で「あれ、逆だっけ…?」となって自爆します。

なので今回も、「どうしてそうなのか」 を AWS の公式ドキュメントだけを根拠に深ぼってみました。仕組みで覚えれば忘れません(たぶん)。

目次

  1. API Gateway は HTTPS のみ受け付ける理由
  2. CloudFront は HTTP も受け付けられる理由
  3. まとめ

1. API Gateway は HTTPS のみ受け付ける理由

結論から言うと、API Gateway が公開するエンドポイント(クライアント ↔ API Gateway 間の通信)は TLS による暗号化が前提 になっており、平文 HTTP でのアクセスを受け付ける設定そのものが存在しません。

公式ドキュメントには、HTTP API について次のように明記されています。

API Gateway enforces a security policy of TLS_1_2 for all HTTP API endpoints.
Security policy for HTTP APIs in API Gateway

つまり「全 HTTP API エンドポイントに対して TLS 1.2 のセキュリティポリシーが強制される」わけです。REST API についても同様に、セキュリティポリシーで受け入れる TLS バージョンとサイファースイートが定義されており、それ以外は拒否されます(Security policies for REST APIs)。

⚠️ 紛らわしいポイント①:「HTTP API」は平文 HTTP のことではない

API Gateway には「REST API」と「HTTP API」という API タイプがありますが、「HTTP API」という名前は "軽量・低価格の API タイプ" を指す商品名 であって、「平文 HTTP を受け付ける API」という意味ではありません。

HTTP API のドキュメントにもこうあります。

You can use HTTP APIs to send requests to AWS Lambda functions or to any routable HTTP endpoint.
API Gateway HTTP APIs

ここでいう「HTTP エンドポイント」は バックエンドの統合先 の話で、クライアントから API Gateway への通信プロトコルとは別物です。

⚠️ 紛らわしいポイント②:ポート 80 が出てくるけど受信側じゃない

REST API の HTTP 統合のドキュメントにはこんな記述があります。

API Gateway supports the following endpoint ports: 80, 443 and 1024-65535.
HTTP integrations for REST APIs

「あれ、80番ポート使えるじゃん!」と思いそうですが、これも API Gateway がバックエンドに向けて発信する側 の話です。クライアント → API Gateway の経路に HTTP を許可する設定ではありません。

ここを混同するとややこしいので、

  • フロント側(クライアント → API Gateway):HTTPS 固定
  • バックエンド側(API Gateway → 統合先):HTTP/HTTPS どちらも可

と整理しておくとスッキリします。


2. CloudFront は HTTP も受け付けられる理由

一方の CloudFront は、キャッシュビヘイビアごとに「Viewer Protocol Policy(ビューアプロトコルポリシー)」を設定 することで、HTTP / HTTPS の受け付け方を柔軟に選べます。

公式ドキュメントの記述はこちら。

You can configure one or more cache behaviors in your CloudFront distribution to require HTTPS for communication between viewers and CloudFront. You also can configure one or more cache behaviors to allow both HTTP and HTTPS...
Require HTTPS for communication between viewers and CloudFront

訳すと「HTTPS を必須にすることもできるし、HTTP と HTTPS の両方を許可することもできる」。API Gateway と決定的に違う柔軟性 がここにあります。

選べる3つのポリシー

CloudFront API リファレンスの ViewerProtocolPolicy で定義されている値は次の3つです。

ポリシー 挙動
allow-all HTTP と HTTPS の両方を受け付ける
https-only HTTPS のみ受け付ける(HTTP は 403 を返す)
redirect-to-https HTTP を受け付けたうえで HTTPS にリダイレクトする(301 を返す)

redirect-to-https の挙動についてはドキュメントにこう書かれています。

Viewers can use both protocols, but HTTP requests are automatically redirected to HTTPS requests. CloudFront returns HTTP status code 301 (Moved Permanently) along with the new HTTPS URL.
Require HTTPS for communication between CloudFront and your Amazon S3 origin

💡 とはいえセキュリティ的には HTTPS 推奨

「HTTP も受け付けられる」とは言っても、AWS 自身が積極的に推奨しているわけではありません。AWS Config のマネージドルール cloudfront-viewer-policy-https では、

The rule is NON_COMPLIANT if the value of ViewerProtocolPolicy is set to 'allow-all'...
cloudfront-viewer-policy-https

と定められており、allow-all を選ぶと コンプライアンス違反として検出されます

つまり「機能として HTTP を受け付ける選択肢はあるが、AWS のベストプラクティスとしては HTTPS を必須にすべき」というのが正しい理解になります。


3. まとめ

今回の内容を表にまとめるとこうなります。

フロント側で HTTP 受付 フロント側で HTTPS 受付
API Gateway(REST / HTTP API) ✕(設定不可、TLS 必須)
CloudFront ◯(allow-all または redirect-to-https ◯(https-only

仕組みで理解しておきたいポイントは以下です。

  • API Gateway は TLS_1_2 以上のセキュリティポリシーが強制される設計 なので、そもそも「HTTP で受け付ける」設定項目自体が存在しない。
  • CloudFront は CDN として古いクライアントや HTTP 限定のユースケースにも対応する必要がある ため、ビヘイビア単位でプロトコルを選べる設計になっている。
  • 「平文 HTTP で到達できるエンドポイントが必要」という要件が出てきたら、API Gateway 単体では実現不可。CloudFront をフロントに置く構成 が解になる。

SAP の選択肢で「HTTP のみのクライアントをサポートしたい」みたいな要件が出てきたら、まず CloudFront を疑う、と覚えておきましょう。

それでは、また次の記事で👋


参考(AWS 公式ドキュメント)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?