ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

CLB から ALB に切り替えるときにハマるポイント

はじめに

クラウドインテグレーション事業部の尾谷です。
 
今日は、AWS 環境構築支援で Elastic Load Balancing - Classic (以降 CLB) から Elastic Load Balancing - Application (以降 ALB) の切り替えを行う際にハマったお話を投稿致します。
 

概要

  1. CLB ⇒ ALB の切り替えを実施した。
  2. CLB 配下にはインスタンスが 1 台だけありバーチャルホストで複数のサーバーをホストさせた。
  3. CLB 配下の EC2 インスタンスは HTTP (80) と HTTPS (443) を混在させていた。
  4. ALB 移行ウィザードというツールで移行するとターゲットグループが一つになり、HTTP (80) の通信と HTTPS (443) 通信が混合した。
  5. mod_rewrite でリダイレクトした際に挙動がおかしくなりページが正しく表示されなくなった。
  6. ターゲットグループを二つに分けることで解消した。

1. 前提

Route 53 には CLB の DNS 名がエイリアスレコードとして設定されていました。

  • example.com. ⇒ CLB の DNS 名
    f:id:otanikohei:20200219153013p:plain
    簡易構成図

CLB のリスナーには、HTTPS (443) と HTTP (80) が登録されており、HTTPS は AWS Certificate Manager (以降 ACM) による証明書を設定していました。

f:id:otanikohei:20200210203028p:plain
CLB - リスナータブ

CLB 配下のインスタンスは 1 台だけ登録しておりました。

f:id:otanikohei:20200210204728p:plain
CLB - インスタンス

そして、EC2 インスタンスには mod_rewrite *1の設定がされており、80 ポートに届いたリクエストを HTTPS (443) にリダイレクトさせていました。

RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

2. ロードバランサ―移行ウィザード

CLB から ALB の切り替えは、移行ウィザードを使いました。*2
aws.amazon.com

移行ウィザードを進めていき、上記ページの 手順5. のところで、ターゲットグループの登録をしました。
ここで気を付けていただきたいのですが、HTTP (80) と HTTPS (443) が一つのターゲットグループに登録されます。
意識せずにウィザードを進めると、今回のようなリダイレクトが設定されたサイトでは、不具合が発生します。

f:id:otanikohei:20200210214004p:plain
80 と 443 が一つのターゲットグループに登録される

4. ラウンドロビン

以上より、移行ツールで新しく出来上がった ALB には、HTTP (80) と HTTPS (443) が混在したターゲットグループがアタッチされました。 こんなイメージです。

f:id:otanikohei:20200219150827p:plain
正しくリダイレクトされない

この ALB の DNS 名にアクセスすると、正しくページが表示されたり、真っ白になったり、Apache のウェルカム画面が表示されたりして、もうよく分からない状態になりました。

f:id:otanikohei:20200210220622p:plain
ターゲットグループのポートは 80 なのに、ロードバランサーの リスナールールでは、HTTP と HTTPS の両方で利用されていました

5. 別のターゲットグループを作成することで解消

そこで、HTTPS (443) 用のターゲットグループを新たに作成しました。

f:id:otanikohei:20200210220942p:plain
443 用のターゲットグループを新しく作成
そして、ロードバランサ―のリスナータブから、ルールの表示/編集 をクリックして、
f:id:otanikohei:20200210221125p:plain
443 のリスナールールを編集
ルールの編集 (鉛筆アイコン) をクリック、
f:id:otanikohei:20200210221435p:plain
ルールの編集
ルールに鉛筆アイコンが表示されるのでクリック、
f:id:otanikohei:20200210221542p:plain
ルールの編集
削除 (バケツアイコン) をクリックしてルールを削除したら、新しく手動で作成したターゲットグループを登録しました。
f:id:otanikohei:20200210221707p:plain
削除 (バケツアイコン)

上記の設定変更で、リダイレクトも正しく動作するようになりましたが、解決するまでにかなりの時間がかかりましたが、大変勉強になりました。

まとめ

以下にも記載されていますが、 ALB がアプリケーション層 (HTTP、HTTPS) で動作するのに対し、CLB はトランスポート層 から アプリケーション層 (TCP、SSL/TLS、HTTP、HTTPS) の間で動作します。
このように記載すると CLB の方が優れているようにも見えますが、ALB にはパスルーティングという便利な機能が使えます。
CLB と ALB は似て非なるものなので、理解するとトラブルシューティングができるかと思います。 aws.amazon.com

最後までお読み下さり、ありがとうございました。

*1:参考にしたサイト
https://httpd.apache.org/docs/current/mod/mod_rewrite.html

*2:CLB には、ALB や NLB にはない「移行」というタブがあり、 移行ウィザードを使うと、元の CLB は削除されず、新たに ALB が作成されますので切り戻しができます。

f:id:otanikohei:20200210212553p:plain
ロードバランサ―移行ウィザード
数回クリックするだけで、自動で ALB を作成してくれるので今回初めて利用しました。
移行ウィザードの確認画面で「変更」ボタンをクリックすると、新しく作成される ALB の名前を変更できます。
※ これは Elastic Load Balancing 全体に言えることですが、ここで変更しておかないと変更ができません。
f:id:otanikohei:20200210213323p:plain
編集ボタンをクリックすると、ALB 名が変更できる