CloudFront + VPCオリジンでは WebSocket が使えないという制約
AWS の CloudFront で VPCオリジンを利用していた際に、WebSocket 接続のみ失敗するという事象に遭遇しました。
結論として、CloudFront の VPCオリジンは WebSocket をサポートしていない ということが分かりました。
VPCオリジンとは
VPCオリジンとは、CloudFront から VPC 内のプライベートリソース(internal ALB / EC2 など)へ直接接続する仕組みです。
通常の CloudFront は以下のような構成になります。
Client
↓
CloudFront
↓
ALB / EC2 / S3
一方、VPCオリジンを使うと以下のように VPC 内のリソースをオリジンとして利用できます。
Client
↓
CloudFront
↓
VPCオリジン
↓
internal ALB
↓
EC2
この構成のメリットは、ALB などのオリジンを インターネットに公開しなくてよい点です。
発生した問題
VPCオリジン構成では
- 通常の HTTP 通信 → 正常
- WebSocket 通信 → 502 エラー
という挙動になりました。
CloudFront のログを確認すると、WebSocket リクエストで以下のような記録が残っていました。
原因
CloudFront の VPCオリジンは WebSocket をサポートしていない ことが分かり、
そのため以下の構成では WebSocket 接続が確立できません。
- Protocol and Feature Restrictions
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-vpc-origins.html#protocol-feature-restrictions
Client
↓
CloudFront
↓
VPCオリジン
↓
internal ALB
対応方法
WebSocket を利用する場合は、VPCオリジンを使用せず
CloudFront のオリジンとしてインターネット向け ALB を指定する構成に変更する必要がありそうです。
Client
↓
CloudFront
↓
ALB(internet-facing)
↓
EC2
CloudFront のオリジン設定には ALB のパブリック DNS 名を指定します。
まとめ
CloudFront の VPCオリジンは WebSocket 非対応です。
そのため WebSocket を利用するシステムでは、
CloudFront
↓
ALB(internet-facing)
という構成を選ぶ必要があります。
VPCオリジンを利用する場合は、この制約に注意が必要です。