3つのEC2サーバーでAWS Load Balancerを使用していますが、サイトがメンテナンス中のときにメンテナンスページを提供しようとしています。
このページは503 HTTPコードを返す必要があります。これは、メンテナンスモードに適したコードであり、SEOで起こりうる問題を防ぐためです。
サーバーのいずれかから503コードを返すと、Load Balancerはそれを「サービス停止中」にし、すべてのサーバーが503を返すと、Webサイトは空白のページを返します(すべてのサーバーが切断されているため)。
私の質問は:
1)正常なサーバーがない場合に、ロードバランサーからの訪問者にメッセージを表示するカスタム静的ページを提供する方法はありますか?
2)または、サーバーを「異常」としてマークする理由として503を考慮しないようにロードバランサのヘルスチェックを構成する方法は?
ありがとう!
アプリサーバーに追加のルートを実装することもできます。たとえば、/ hcm(ヘルスチェックメンテナンス用)で、常に200 OKと応答します。メンテナンスの時期になったら、プログラムでELBヘルスチェックを変更して、/または/index.htmlではなく、200 OKを返す/ hcmターゲットを使用します。どちらも503 Service Unavailableを返します。メンテナンスを終了するときに、これらの変更を元に戻します。
503要件を満たしていない可能性がありますが、これに適したオプションはs3およびdnsフェイルオーバーを使用することです https://aws.Amazon.com/blogs/aws/create-a-backup-website-using-route-53 -dns-failover-and-s3-website-hosting /
私はこれを行う簡単な方法を探していました。 DBのアップグレード中に503エラーを世界中に返す必要がありますが、開発者が公開する前にテストできるように、開発者のIPをホワイトリストにいくつか登録します。
1つのスポットソリューションが見つかりました:EC2のローダーバランサーに移動し、対象とするロードバランサーを選択します。以下に、リスナーが表示されます。リスナーをクリックして、ルールを編集します。次のようなルールを作成します。
これで、全員がかなりのメンテナンスページを503エラーコードで返し、最初のルールの2つのIPアドレスのみがサイトを閲覧できるようになります。順序は重要です。2つのIP例外が一番上にあり、リストの下位にあります。最後の項目はデフォルトで常にそこにあります。
アプリケーションロードバランサーのリスナールール: https://docs.aws.Amazon.com/elasticloadbalancing/latest/application/listener-update-rules.html
ロードバランサーは、背後に正常なサーバーがなくなったときに503
を提供するため、特別なことを行うべきではありません。
ヘルスチェックで200
以外を返すと、ELBは設定された数のヘルスチェックに失敗した後、マシンをロードバランサーから外します。
つまり、要約すると、メンテナンス時にアプリから503
を提供できる可能性がありますが、ヘルスチェックのために常に200
を返す必要があります。ページのコンテンツを気にしない場合は、単にロードバランサーからマシンを削除(またはヘルスチェックに失敗)するだけで、LBが適切な処理を行います。