CloudFront+ALBの構成で464エラーが返ってくる場合の対処法
AWS事業本部のイシザワです。
CloudFrontのオリジンにALBを指定した際に、HTTPアクセスで464エラーが返される現象がありました。
その原因と対処法をまとめます。
原因と対処法
症状としては、以下のようにcurlコマンドでCloudFrontに対してHTTPリクエストを飛ばすと464エラーが返ってきます。
$ curl -I https://cloudfront.takuya-ishizawa.link HTTP/2 464 content-length: 0 server: awselb/2.0 (省略)
これは、ALBのフォワード先のターゲットグループのプロトコルバージョンがHTTP2
になっていることが原因です。
ターゲットグループのプロトコルバージョンを変更することはできないので、プロトコルバージョンがHTTP1
となる新しいターゲットグループを作成します。
ターゲットグループを作成したら、ALBのフォワード先のターゲットグループを新しいターゲットグループに置き換えます。
ALBの設定が完了したら、先ほどと同様にcurlコマンドでHTTPリクエストを飛ばすと正常にHTTPレスポンスが返ってきます。
$ curl -I https://cloudfront.takuya-ishizawa.link HTTP/2 200 content-type: text/html content-length: 615 (省略)
解説
464エラーはALBが返すエラーで、リクエストプロトコルがターゲットグループのプロトコルバージョンと互換性の無い場合に返されるエラーです。
プロトコルバージョンをHTTP2
に設定した場合、リクエストプロトコルがHTTP/1.1のHTTPリクエストを受信すると464エラーを返します。
HTTP 464
ロードバランサーは、ターゲットグループプロトコルのバージョン構成と互換性のない着信リクエストプロトコルを受信しました。
考えられる原因:
- リクエストプロトコルは HTTP/1.1 であるが、ターゲットグループのプロトコルバージョンが gRPC または HTTP/2 である。
- リクエストプロトコルは gRPC であるが、ターゲットグループのプロトコルバージョンが HTTP/1.1 である。
- リクエストプロトコルは HTTP/2 であり、リクエストは POST ではないが、ターゲットグループのプロトコルバージョンが gRPC である。
一方、CloudFrontがリクエストをカスタムオリジンに転送する際のHTTPのリクエストプロトコルはHTTP/1.1となります。
参考)カスタムオリジンの場合のリクエストおよびレスポンスの動作
HTTP バージョン
CloudFront は HTTP/1.1 を使用してカスタムオリジンにリクエストを転送します。
そのため、CloudFront~ALB間のHTTP通信のリクエストプロトコルはHTTP/1.1となるので、ターゲットグループのプロトコルバージョンがHTTP2
の場合は464エラーが返されます。
おわりに
ALBの前段にCloudFrontを置く構成で464エラーが返ってくる現象の原因と対処法についてまとめました。
この記事がどなたかの助けになれば幸いです。