タダです.
CloudFront のカスタムオリジンとして ALB を指定した時に注意すべきことをまとめていきます.
本記事の前提
CloudFront のオリジンとして ALB を指定する時がありました.その際に ALB はターゲットとして ECS を設定し,ターゲットグループとして HTTP2 プロトコルを指定していました.オリジンへのリクエスト時に464 エラーが発生しました.
464 エラーの原因
464 エラーの原因は ALB がターゲットグループプロトコルのバージョン構成と互換性のない着信リクエストプロトコルを受信した時に発生する模様です.
考えられる原因:
リクエストプロトコルは HTTP/1.1 であるが、ターゲットグループのプロトコルバージョンが gRPC または HTTP/2 である。
リクエストプロトコルは gRPC であるが、ターゲットグループのプロトコルバージョンが HTTP/1.1 である。
リクエストプロトコルは HTTP/2 であり、リクエストは POST ではないが、ターゲットグループのプロトコルバージョンが gRPC である。
関連ドキュメント
CloudFront がターゲットへ転送する時の HTTP バージョン
CloudFront のターゲットへ転送するときは HTTP 1.1 で送ることがドキュメントに記載されてます.今回でいうと ALB のターゲットグループが HTTP2 に指定したことで問題で リクエストプロトコルは HTTP/1.1 であるが、ターゲットグループのプロトコルバージョンが gRPC または HTTP/2 である
という状態でした.本件の場合,ターゲットグループプロトコルを HTTP1 に変更すれば CloudFront から ALB への転送リクエストを受信できました.当然ですが,ターゲットグループは作り直す必要があるためリスナーとの関連付けやターゲットグループに紐づいた ECS タスクも外す必要があるため気をつけましょう.
CloudFront は HTTP/1.1 を使用してカスタムオリジンにリクエストを転送します。
関連ドキュメント
まとめ
簡単ですが,CloudFront のカスタムオリジンとして ALB を指定した際に発生したエラーとその対処をまとめました.