ちょっと話題の記事

AWS Global AcceleratorにHTTP over QUICを通す #reinvent

2018.12.03

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

ども、ゲストの大瀧です。
AWSの年次イベントre:Invent 2018で発表された新サービスGlobal Accelaratorは、AWSが誇るエッジロケーションのスケーラビリティを活かしたGSLBサービスです。CloudFrontやELBなど既存のリバースプロキシ/ロードバランササービスと比較すると、Global Accelaratorは唯一UDPを通すサービスだったりします。そこで今回は、UDPを扱うホットなWeb関連技術であるHTTP over QUICをGlobal Accelaratorで扱ってみた様子をレポートします。

動作確認環境

  • QUICサーバー : LiteSpeed Web Server 5.3.4
  • QUICクライアント : LiteSpeed QUIC (LSQUIC) Client Library (Dockerイメージ dalongrong/lsquic-client - Docker Hub )
  • AWS環境 : QUICサーバー(Amazon Linux 2 on EC2)、Global Acceleratorともにus-west-2リージョンで実行
  • TLSサーバー証明書 : Let's Encrypt

構成図にすると以下の感じです。

Global Acceleratorの転送先(エンドポイント)はALB、NLB、Elastic IPの3つから選べますが、ALB、NLBはUDPを扱えないため今回の用途ではElastic IP一択です。複数インスタンスで負荷分散かつ冗長構成にしたい場合はEC2 + Elastic IPのセットを複数用意しGlobal Acceleratorのエンドポイントに設定することになります。

QUICサーバーのセットアップ

QUICはTLSサーバー証明書で暗号化通信を行うので、あらかじめ用意し以下のパスで保存しました。

  • 証明書 : /opt/configs/cert
  • 秘密鍵 : /opt/configs/key

QUICをサポートするWebサーバーはいくつかありますが、今回はLiteSpeed Web Server(以下LSWS)を利用します。QUICを扱えるLSWSのエディションは商用ライセンスのEnterprise Editionですが、無償で利用できる15日間の評価ライセンスおよびFree Startライセンスがあるので今回はFree Startライセンスを選択しました(要クレジットカード登録)。

ライセンスを取得するとシリアルナンバーがメールで送付されるので、インストール時に使うために控えておきます。

では、LSWSを実行するEC2インスタンスを立ち上げます。今回はAmazon Linux 2 AMIを利用しElastic IPをセット、セキュリティグループではLSWSのために以下のInboundポートを許可します。

  • 7080/TCP : LSWSのWeb管理画面
  • 8088/TCP : Webサーバーのデフォルトのサービスポート(ヘルスチェック用)
  • 8088/UDP : Webサーバーのデフォルトのサービスポート

今回は検証のため0.0.0.0/0への許可ルールを設定しましたが、Web管理画面は管理者の特定のグローバルIPアドレス、サービスポートはGlobal AcceleratorのIPアドレス(こちらからダウンロードできるip-ranges.jsonファイルのうち"service": "GLOBALACCELERATOR"の要素(参考)"service": "ROUTE53_HEALTHCHECKS"に限定するのが良いかもしれません。

EC2インスタンスを起動したらSSH接続し以下のURLにあるバイナリをダウンロード、インストールします。

インストール手順は、以下のドキュメントないしライセンスのメール記載の手順を参考にします。

wget https://www.litespeedtech.com/packages/5.0/lsws-5.3.4-ent-x86_64-linux.tar.gz
tar zxf lsws-5.3.4-ent-x86_64-linux.tar.gz
cd lsws-5.3.4/
vim serial.no # 空の新規ファイルを作成し、シリアルナンバーを入力
./install.sh
# ライセンス許諾に同意し、管理画面のユーザー名/パスワードを入力

これでLSWSが起動しました。続いてWeb管理画面(https://<ECインスタンスのElastic IP>:7080/)にアクセスし、サーバー証明書とQUICを有効化します。

  1. [Cofiguration]タブ - [Listeners]をクリック
  2. Defaultリスナーの右側にある[View/Edit]リンクをクリック
  3. [Address Settings]の右側にある[Edit]をクリック
  4. [Secure]を[Yes]に変更し[Save]をクリック
  5. [SSL]タブをクリック
  6. [SSL Private Key & Certificate]の右側の[Edit]をクリックし、[Private Key File]と[Certificate File]に事前に用意したTLS証明書ファイル名と秘密鍵ファイル名を入力、[Save]をクリック
  7. [Security & Features]の右側の[Edit]をクリックし、[Allow QUIC]を[Yes]に設定し[Save]をクリック

これでOKです。Amazon Linuxでは既定でiptablesが無効になっていますが、ディストリビューションによっては以下のチェック項目を確認いただくのが良いと思います。

Global Acceleratorのセットアップ

続いてGlobal Acceleratorを構成します。[Create accelerator]ボタンからアクセラレータを作成、、任意のアクセラレータ名を設定しリスナで[Ports]に8088、[Protocol]に[UDP]を選択します。

エンドポイントグループの設定では、EC2インスタンスを実行するリージョン(今回はus-west-2)を選択し、[Configure health checks]をクリックしてヘルスチェック設定を確認します。

ここで気づいたのですが、ヘルスチェックはRoute 53の仕組みを流用しているようでUDPをサポートしていません。なので、LSWS側でTCPのポートも合わせて開いておく必要がありセキュリティグループのInbound設定に含めておきました。

エンドポイントの追加では[Endpoint type]で[Elastic IP address]を選び、[Endpoint]でEC2インスタンスに割り当てたElastic IPを選択します。

そういえば、エンドポイント側の設定項目にポート番号が含まれていないので、現状ではリスナーポートとターゲットポートは同じものしか設定できないようです。作成が完了したら、[Static IP addresses]のうちどちらかをメモしておきます。

動作確認

本当はGoogle Chromeでアクセスしてみたかったのですが、LSWSがサポートするQUICのバージョンが影響しているのか接続できませんでした。代わりにLiteSpeedが公開しているQUIC Client Libraryを含んでいるDockerイメージで代用し、-sオプションにStatic IP addressesとポート番号8088-HオプションでTLS証明書に対応するドメイン名を指定します。

$ docker run --rm \
  dalongrong/lsquic-client \
  http_client -s 13.248.139.xxx:8088 -p / -H xxx.xxx.com
HTTP/1.1 200 OK
etag: "27d9-5c0018b8-a61ac6b598777ea8;;;"
last-modified: Thu, 29 Nov 2018 16:50:00 GMT
content-type: text/html
content-length: 10201
accept-ranges: bytes
date: Mon, 03 Dec 2018 00:51:07 GMT
server: LiteSpeed
alt-svc: quic=":8088"; ma=2592000; v="35,39,43,44"

<!DOCTYPE html>
<html lang="en">
<head>
  :(以下略)

接続できました!アクセスログがLSWSのインストールパス以下lsws/DEFAULT/logs/access.logにあるので見てみると。。。

lsws/DEFAULT/logs/access.log

99.82.170.xxx - - [03/Dec/2018:00:51:07 +0000] "GET / HTTP/1.1" 200 10201 "-" "LSQUIC"
99.82.170.xxx - - [03/Dec/2018:01:00:46 +0000] "GET / HTTP/1.1" 200 10201 "-" "LSQUIC"
99.82.170.xxx - - [03/Dec/2018:01:00:49 +0000] "GET / HTTP/1.1" 200 10201 "-" "LSQUIC"

ログが記録されていますね。アクセス元IPは、Global AcceleratorのStatic IP addressesとはまた別のIPアドレスになっています。クライアントのIPアドレスが仕組み上取得できない点には注意が必要ですね。

まとめ

Global AcceleratorでHTTP over QUICを通す検証として、EC2でLiteSpeed Web Serverを実行する様子をご紹介しました。QUICはIETF対応やHTTP/3への変遷などまだまだ動きの速い分野ですが、一気に広がる可能性もある注目の技術なので引き続き注視していきたいですね。