この記事は公開されてから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のアップデートをお試しください。