ALBを実戦投入しました

今年の夏に新機能として追加されたELBの新しいタイプApplication Load Balancerを実戦投入しました。ELB(Classic)でもWebSocketはつながるんですが冗長化すると不安定になるため正式にWebSocketをサポートしているALBに乗り換えました。

OpsWorksではALBは未サポート

ぼくは普段OpsWorksを使っているんですが、残念ながら2016年10月現在OpsWorksがサポートしているのは従来のELB(Classic)のみでALBはまだ使えません。

Application load balancer support in Opsworks?

いちおう要望は受け付けたという事みたいですが、実装されるか微妙ですね。

未サポートではあるんですが、ただOpsWorksの外でALBを設定する分には通常のEC2に対して設定するのと全く変わらないので普通に利用する事が可能です。確認はしてないですが、通常のEC2+ALBのケース範囲内であればAWSのサポートを受けることはできると思います。

ELBならOpsWorks内でELB管理のインスタンスのヘルスなども分かってましたが、ALBだとEC2コンソールを見ないと分からなくなります。あとはインスタンスを新規追加した場合はALBのターゲットグループに手動で追加する必要があるのでそこはとてもダルいですね。ただ、デメリットはこれくらいでした。

ALBの設定概要

設定方法は下記の記事を参考にさせて頂きました。ありがとうございます。

はじめての ALB なのに WebSocket を試す

記事に書かれてますが、ALBの設定方法は手順としては下記のような感じです。

  • ターゲットグループを作成する
  • ALBを作成する
  • ALBのリスナーにターゲットグループを紐付ける
  • ターゲットグループにEC2インスタンスを紐付ける

ターゲットグループというのが耳慣れないのですが、これはポート毎に定義できる冗長化設定という感じです。ELBだと冗長化はあくまでサーバーが軸になりサーバー数が4であれば80も443も4つの冗長化になるんですが、ALBでは考え方が少し違ってポート毎に冗長化の幅が違っても良いという考えです。ポート変換もできるので、たとえば80ポートにあるサーバーの8001,8002,8003,8004ポートを利用して冗長化するという事もできます。マルチコンテナ構成を意識した設定になっていますね。

ちなみに現状オートスケーリングはコマンドラインからしか設定できないようです。まぁOpsWorksユーザーはEC2ネイティブなオートスケーリングは相変わらず使えないので関係ない事ですが…。

WebSocket+SSLをALBで設定する

上記の記事にあるのはプレーンなWebSocketなので、いちおう実戦投入したSSL付きの設定です。下記のような感じにしています。マルチコンテナとかではないのでWebSocketは同じポート(3443)でサーバー2台分並んでます。

ロードバランサー側の設定

NewImage

パスのパターンでルーティングするターゲットグループを変えたりできるようですが、今回はシンプルな構成なので特には設定せずリスナーにターゲットグループをひとつ紐付けてるだけです。

ターゲットグループ側の設定

NewImage

維持設定がポイントで、複数台ぶらさげる場合には維持設定を有効にしておかないとWebSocketの接続がうまくいきませんでした。維持設定はセッション・アフィニティの事で、接続するサーバーをクライアントによって固定してくれます。

NewImage

今回は2つ並べてます。

NewImage

ヘルスチェックはWebSocket用のポートでは難しいので異なるポートでヘルスチェックさせてます。ヘルスチェックの設定も柔軟になってますね。

NewImage

これで気持ちよくWebSocketがつながるようになりました。安定していると思います。

ALBを使ってみて

まだ1ヶ月も使ってないので大した感想はないのですが、ELBとは違いHTTP/2やWebSocketに対応し、設定もマルチコンテナを意識した柔軟な作りになっていてなかなか良いんじゃないかなと思いました。ただ、ELBのように普通にサーバーをぶら下げて使う分には設定がどうも面倒なんですよね…。Classic ELBがWebSocketサポートしてくれたら最高なんですが。ないのかなぁ。