CloudFront+ALBの構成で464エラーが返ってくる場合の対処法

ALBの前段にCloudFrontを置く構成で、CloudFrontへのHTTPアクセスで464エラーが返される現象の原因と対処法をまとめました。
2023.05.30

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エラーが返ってくる現象の原因と対処法についてまとめました。

この記事がどなたかの助けになれば幸いです。