しまかぜメモ

Masanori Yamaguchi の雑なメモ

AWSを使う場合にALB+HTTP/2で気をつけないといけない話

11月7日にFinJAWSでLTしてきましたので、その時の内容をブログ化でも共有します。

TL;DR
  • (11月7日現在)HTTP/2を有効にしてもAWS内の通信は全てHTTP/2ではない
  • ALB -> EC2 間はHTTP/1.1で通信される
  • ブラウザからエラーで弾かれるケースもある
  • 回避方法
構成

構成図に書いている各サービスのHTTP/2を有効化しても全てがHTTP/2で通信されるわけではない。 f:id:kinunori:20200518215748p:plain

実際は、ALB->EC2間はHTTP/1.1で通信される。(アクセスログから確認) f:id:kinunori:20200518215753p:plain

影響

上記構成において、EC2上で構成されるWebサーバのHTTP/2を有効化していると、HTTPレスポンスヘッダにはUpdateヘッダが付与され、HTTP/2の通信を推奨されるレスポンスが返答される。(しかし、ブラウザはHTTP/2で通信をしている) 特定のブラウザでは、このレスポンスの解釈に問題があるのか、特定端末で特定のブラウザはエラー返却されWebコンテンツが表示されないケースがあった。

下記のChromeデバッグでは、HTTPレスポンスに対し、Updateヘッダが付与されていることが確認できる。

f:id:kinunori:20200518220407p:plain
ChromeデバッグよりHTTPレスポンスを表示

この状況において、iOSChromeでは最終的にエラー画面を返却する。

f:id:kinunori:20200518220623p:plain
iOSChrome

回避方法
  • CloudFrontにてHTTP/2を無効化する
    • この方法は解決可能であるが、そもそもHTTP/2への対応を無効化するものであり、回避策としては有用ではない。
  • WebサーバのHTTP/2モジュールを無効化する
    • WebサーバのHTTP/2モジュールが有効化されている場合、より効率的なプロトコルであるHTTP/2を推奨する。この動きがUpgradeヘッダであるため、WebサーバのHTTP/2モジュールを無効化することでUpgradeヘッダ付与は回避できる。
    • つまり、ALBまではHTTP/2通信が行われる。重要なポイントはCDNであるCloudFrontとブラウザ間はHTTP/2で通信されるため、キャッシュ済みコンテンツはより効率的なプロトコルで通信されるという点である。

ALBからWebサーバもHTTP/2で通信してくれればよいのだけど。