概要
AWSでマルチテナントのWebサービスを提供していますが、システムメンテナンス時に各テナントに一律メンテナンス画面を表示するための方法を紹介します
手っ取り早くWebサーバを立ち上げれば簡単に実現できるが、コスト(マシンコスト、管理コスト)がかかるので、極力マネージドサービス(S3、CloudFrontなど)で完結したい
凡例
説明がわかりやすくなるように以下の仮のドメイン名を説明文に含めています
実際の設定では環境に合わせて変更してください
- Webサービスのドメイン名「comefigo.com」
- テナントのサブドメイン名「tenant1.comefigo.com」、「tenant2.comefigo.com」
- メンテナンス画面用のサブドメイン名「maintenance.comefigo.com」
システム構成
各テナントはALBのリスナーのルーティングでサブドメイン(tenant1.comefigo.com / tenant2.comefigo.com)によって、遷移するインスタンスを振り分けている
メンテナンス時のシステム構成
- Route53の各サブドメインの遷移先をメンテナンス用のALBに設定変更(API経由で)
- メンテナンス用のALBのリダイレクト設定でメンテナンス用コンテンツ(maintenance.comefigo.com)にリダイレクトする
設定方法
- メンテナンス画面用のS3バケットの作成とCloudFrontの作成方法は「AWS S3でのhttps対応含む静的ウェブサイト公開」を参照してください
[補足]:
- CloudFrontと連携できるCertificate Managerはバージニア北部リージョンのみになるので、そのリージョンで新たに証明書を発行しておく必要がある(複数個所で同一ドメインに対する証明書を発行しても問題はない)
- Route53のメンテナンス画面用のレコードセットの設定は以下になります
Type:「A-IPv4 address」
Alias Target:「CloudFrontで作成したDistributionsのDomain Name(xxxxxxx.cloudfront.net)」
設定が完了し、メンテナンス画面が表示できることを確認してください
例)メンテナンス画面用のドメイン名を「maintenance.comefigo.com」とした際は、「https://maintenance.comefigo.com 」で表示されること
2. Application Load Balancer(ALB)を作成
[ステップ1 ロードバランサーの設定]:
・リスナーのロードバランサーのプロトコル:HTTP、ポート:80
[ステップ2 セキュリティ設定の構成]:
・警告メッセージが表示されるが、そのまま次へ
[ステップ3 セキュリティグループ]:
・外部通信できるHTTPS(443)ポートを開放したセキュリティグループを割り当て(あえて443ポート)
[ステップ4 ルーティングの設定]:
既存のターゲットグループ(80ポート)があればそれを選択し、なければ以下のように作成
・ターゲットグループ:新しいターゲットグループ
・プロトコル:HTTP
・ポート:80
・ヘルスチェックのプロトコル:HTTP
[ステップ5 ターゲットの登録]
・そのまま次へ
3. 作成したALBが「active」になったことを確認し、作成されたリスナーを削除し、新たに「リスナーの追加」します
ついでに前述で作成されたターゲットグループも削除しても問題ない!
ここからが肝です!
ALBの新規作成時には選べないリダイレクト設定はALBを作成後に「リスナーの追加」からできるようになります!
4. リスナーの追加
・プロトコルはHTTPS、ポートは443
・リダイレクト先を前述で作成したメンテナンス用ドメイン(maintenance.comefigo.com)
・パスは「/」
一律リダイレクト先のルートに転送するようにしていますが、コンテンツの配置に合わせて変更してください
・証明書はWebサービスが展開されているリージョンのものを使用します
5. ALBのDNS名で(HTTPS)アクセスし、メンテナンス画面に転送されることを確認してください
6. Route53で(メンテナンス用のドメイン以外)適当なサブドメイン(tenant1.comefigo.com)の「Alias Target」で手順2で作成したロードバランサーを選択する
7. 適当なサブドメイン名(tenant1.comefigo.com)でアクセスし、メンテナンス画面に転送されることを確認してください
以上!
本番運用時はAnsibleですべてのサブドメインの遷移先をメンテナンス用のロードバランサーに変更する