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

2016.09.16

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

こんにちは、菅野です。
ALB がリリースされ、DevelopersIO で公開されたいくつかのブログエントリーを見ていて
WebSocket に対応したというのが気になったので実際に試してみました。

WebSocket って?

一昔前、Web のシステムを作成していた人ならほとんどの方が思ったであろう「Push通知が欲しい」を
実現したプロトコルです。
通常の HTTP ではクライアントから要求されないとサーバーから発信できませんでしたが、WebSocketを
使うとサーバーが好きなタイミングでクライアントへメッセージを送信する事が可能になります。
WebSocketについて調べてみた

今回のテストの構成

非常にシンプルな構成です。
AWS Design-4

アクセスするURL

  • Web ページは「http://ALBのDNS名/index.php」
  • WebSocket は「ws://ALBのDNS名/ws/server.php」

用意するターゲットグループ

  • 「/*」へのアクセスはインスタンスへ80ポートで接続
  • 「/ws/*」へのアクセスはインスタンスへ9000ポートで接続

ターゲットグループの作成

Web ページアクセス用「tg-webpage」

  • 名前を入力します
  • ヘルスチェックのパスに「/index.php」を指定します
    スクリーンショット_2016-09-14_10_34_39

WebSocket アクセス用「tg-websocket」

  • 名前とポート(9000)を入力します
  • ヘルスチェックのパスに「/index.php」を指定します
  • このままだとヘルスチェックとして「/index.php」へ9000ポートでアクセスするので
    ヘルスチェックの詳細設定で「上書き」を選択しポートに「80」と入力します
    スクリーンショット_2016-09-15_20_23_41

インスタンスを登録しておく

スクリーンショット_2016-09-14_10_08_21
スクリーンショット_2016-09-14_10_00_49

ALB の作成

注意点

  • 必ず異なる AZ にある二つのサブネットが必要です

名前を入力します

スクリーンショット_2016-09-14_10_20_54

先ほど作成したターゲットグループを登録します

スクリーンショット_2016-09-14_10_21_43

ターゲットグループを追加する

  • 作成時には一つのターゲットグループしか登録できないので、残りは ALB 作成後に追加します
    スクリーンショット_2016-09-14_10_25_20

最後にアイドルタイムアウトを指定します

  • 後ほど書きますが1分毎にサーバーから何かを送るつもりなのでそれより長い「300秒」にしておきます。
    スクリーンショット_2016-09-15_21_33_55

ALB はできたが

ALB はできました。EC2 インスタンスもあります。
サーバー側とクライアント側のコンテンツがありません。一から作る気力もありません。
apache だけインストールすれば、ちょいちょいでできるものはないかと探していたらありました。
WebSocket Example
ありがとうございます。ありがたく使わせていただきます。

このサンプルはチャットができるものになっています。確かに WebSocket は使っていますが、
結局クライアント側のアクションに対してサーバーが動くのでイメージしていたものと違います。
軽く改造して、1分毎にサーバーから時刻とサーバー名を送りつけるような仕様に変更しました。

やっと動かすところ

動かします
スクリーンショット 2016-09-15 21.08.50

サーバーから1分毎に情報が送信されてきていますので成功です。
冷静に書いてますが、実は感動しています。ブラウザから何も送信していないのに、
何も要求していないのに情報が送られてきてるんですよ!Push通知ですよ!

さいごに

いかがでしたでしょうか。
ここまでの内容で、URL のパスによるターゲットの分岐と WebSocket 対応を試す事ができました。
ここまで読んでお気づきの方もいると思いますが、今回スティッキーセッションは無効のままです。
WebSocket の特徴として、「最初につないだらつながったまま」なので不要なのでしょうね。
もう一つ、アイドルタイムアウトは長めにしておきましょう。無通信時間との兼ね合いで
ALB に切断させられてしまって少々はまりました。

皆さんも、長い付き合いになると思いますので ALB について色々と試してみてください。

感想

ALB がリリースされてからずっとうずうずしていましたが、やっとまともに使ってすっきりです。
ALB を初めてさわった感想としては、ターゲットグループが分かれている事に若干取っ付きにくさを感じましたが
最初だけで今ではむしろ管理し易くていいんじゃないかと思ってます。

1点だけ不満があるとすれば、サブネットを必ず二つ指定しないといけない点です。
AゾーンにしかEC2インスタンスが無いのにCゾーンにもサブネットを用意しないといけなくなりますし、
暖機申請の時にCゾーンにインスタンスが無くても問題にならないのでしょうか。

ALB については今後もブログネタになると思いますので、気になる点は少しずつ解消して公開していきます。

参考ページ

これらのページを参考にさせていただきました。
ありがとうございました。
PHPのみでHTML5のWebSocketを体験する方法
WebSocket Example
WebSocketについて調べてみた
いまさらHTML5 (WebSocket編)