WebSocketに対応したCloudFrontをwscatで疎通確認してみた

2018.11.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWSチームのすずきです。

AWSのCDN、Amazon CloudFront が WebSocketに対応するアップデートがありました。

Amazon CloudFront announces support for the WebSocket protocol

CloudFront経由したWebSocket通信が可能な事をwscatを用いて確認する機会がありましたので紹介させて頂きます。

wscat

WebSocket のサーバ/クライアントとしてNode.jsで実装された「wscat」を利用しました。

環境

構成図

EC2

  • OSはAmazonLinux2の最新AMI、東京とオレゴンの各リージョンに起動しました。
  • オレゴンのEC2をWebSocketサーバ、東京のEC2をWebSocketクライアントとして利用しました。
  • オレゴンのEC2、WebSocketはTCP8000でListen、ELB(ALB)からの疎通許可を与えたセキュリティグループ設定を行いました。

ELB

  • WebSocketに対応するALB(Application Load Balancer)を利用しました。
  • HTTP(TCP80)、HTTPS(TCP443)を全インターネットに公開するセキュリティグループを付与しました。
  • HTTPSリスナー設定は、ACMで作成済みだった独自ドメイン用のワイルドカード証明書を利用しました。
  • ヘルスチェックの成功コード設定、「wscat」が戻すHTTPレスポンスコード「426」を正常とする設定としました

wscatのヘルスチェック応答

$ curl -v http://##.##.##.##:8000
* Rebuilt URL to: http://##.##.##.##:8000/
*   Trying ##.##.##.##...
* TCP_NODELAY set
* Connected to ##.##.##.## (##.##.##.##) port 8000 (#0)
> GET / HTTP/1.1
> Host: ##.##.##.##:8000
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 426 Upgrade Required
< Content-Length: 16
< Content-Type: text/plain
< Date: Fri, 23 Nov 2018 04:20:55 GMT
< Connection: keep-alive

Route53

  • ELBのDNS名(###-####.us-west-2.elb.amazonaws.com)をターゲットとするエイリアスレコードを作成。 - HTTPS通信に必要な独自ドメインによる名前解決を可能に設定しました。

CloudFront

  • Route53で設定したDNSレコードをオリジンとする、カスタムドメイン設定、HTTP/HTTPS用のDistributionsを作成しました。
  • CloudFrontからオリジン(ELB)の通信は「HTTPS」としました。
  • CloudFrontのHTTPS設定はデフォルトのDNS名、「###.cloudfront.net」を利用する設定としました。

wscat設定

インストール

サーバ、クライアントとなる2台のAmazon Linux 2の環境に、以下のコマンドでインストールを実施しました。

curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum -y install nodejs
sudo npm install -g wscat

サーバ

オレゴンのEC2環境でWebSocketサーバを起動しました。

wscat -l 8000

クライアント

WebSocketクライアントのEC2(東京)から、WebSocketサービスを公開したオレゴンのELB(ALB)、CloudFront宛の通信を試みました。

ELB

  • HTTP
wscat -c ws://####.us-west-2.elb.amazonaws.com:80
wscat -c ws://<ELBの独自ドメインFQDN>:80
  • HTTPS
wscat -c wss://<ELBの独自ドメインFQDN>:443

CloudFront

  • HTTP
wscat -c ws://<CloudFrontホスト名>.cloudfront.net:80
  • HTTPS
wscat -c wss://<CloudFrontホスト名>.cloudfront.net:443

結果

CloudFront、ELB(ALB)を経由した、HTTP、HTTPSによるWebSocket通信が可能な事を確認できました。

クライアント出力

$ wscat -c wss://#######.cloudfront.net:443
connected (press CTRL+C to quit)
> cloudfront ?

サーバ出力

$ wscat -l 8000 --no-color
listening on port 8000 (press CTRL+C to quit)
client connected
< cloudfront ?

まとめ

CloudFrontを経由したWebSocket、HTTP(TCP:80)だけでなく、HTTPS(TCP:443)を利用したセキュアな利用が可能な事を確認出来ました。

CloudFrontの接続ポイントは、2018年11月現在 26 か国 59 都市にある 132 個、 国内では、東京8拠点、大阪で1拠点が提供されており、クライアントに近い接続ポイントの利用とAWSのバックボーンによるネットワークの最適化が期待できます。

また、CloudFrontとオリジンのEC2(ELB)間の転送課金は免除、 トラフィックコミット (通常 10 TB/月以上)により、EC2(ELB)よるプライベート料金でCloudFront利用する事で、 AWSからのアウトバウンド通信に応じて発生するAWS費用を抑制できる可能性もあります。

AWS上でWebSocketを利用するシステムの最適化手段の一つとして、CloudFrontのアップデートをお試しください。