ELBの背後にアプリケーションの新しいバージョンをデプロイする場合、AWSでどのようにメンテナンスページを作成しますか?新しい自動スケーリングされたインスタンスが起動している間に、ELBがメンテナンスインスタンスにトラフィックをルーティングし、完全に起動した後にのみ新しいインスタンスに「反転」するようにします。自動スケーリングを使用して、既存のインスタンスを停止し、新しいコードを持つ新しいインスタンスを起動します。
回避しようとしているシナリオは、ELBに新しいEC2インスタンスへの両方のトラフィックを提供すると同時に、メンテナンスページも提供することです。スティッキーセッションを有効にしていないため、ユーザーがメンテナンスモードページとEC2インスタンスにデプロイされたアプリケーションの間を行き来するのを防ぎたいと思います。コードの変更には古いコードの変更を壊すデータベースの変更が含まれる可能性があるため、新しいインスタンスを導入するためにスケールアップすることはできません(2から4インスタンスから2に戻すなど)。
AWSで最も簡単な方法は、DNSサービスである Route 5 を使用することです。
Weighted Round Robin の機能を使用できます。
「WRRを使用して、サーバーを運用環境に導入したり、A/Bテストを実行したり、さまざまなサイズの地域やデータセンター間でトラフィックのバランスを取ることができます。」
編集:Route 53は最近、S3へのDNSフェイルオーバーを可能にする新しい機能を追加しました。詳細については、ドキュメントを確認してください: http://docs.aws.Amazon.com/Route53/latest/DeveloperGuide/dns-failover.html
Route53はこの問題の良い解決策ではありません。メンテナンスページが表示される前にDNSエントリの有効期限が切れるのにかなりの時間がかかります(そして、メンテナンスが完了してから更新されるまでに同じ時間がかかります)。この質問が行われた時点ではLambdaとCodeDeployトリガーが存在していなかったことがわかりますが、Lambdaを使用して比較的クリーンなソリューションを作成できることを他の人に知らせたいと思いました。 http://blog.ajhodges.com/2016/04/aws-lambda-setting-temporary.html
ソリューションの要点は、Lambda関数をCodeDeployイベントにサブスクライブすることです。これにより、展開中にロードバランサーの静的ページを提供するマイクロインスタンスでASGが置き換えられます。
これは古い質問ですが、今日(2018年12月)同じ問題に直面した後、この問題を解決する別の方法があるようです。
今年の初め、AWSは Application Load Balancerへのリダイレクトと固定応答 のサポートを導入しました。手短に:
text/plain
またはtext/html
応答(つまり、メンテナンスページのHTML)。ルールがELBに伝達されると(私にとっては約30秒かかりました)、ブラウザーでホストにアクセスしようとすると、503メンテナンスページが表示されます。
展開が完了したら、追加したルールを削除するだけです。
私たちにとって素晴らしい仕事をしている別のソリューションを見つけました。単純な503 http応答を取得するために必要な手順は次のとおりです。
app-environment-maintenance
などのように呼び出します。最後に、AWS CLIを使用して環境CNAMEをスワップし、メイン環境をメンテナンスモードに移行できます。例えば:
aws elasticbeanstalk swap-environment-cnames \
--profile "$awsProfile" \
--region "$awsRegion" \
--output text \
--source-environment-name app-prod \
--destination-environment-name app-prod-maintenance
これにより、app-prod
環境がメンテナンスモードに切り替わります。実行中のEC2インスタンスがないため、ELBは503をスローします。Cloudfrontは、以下に説明するように、希望に応じて503をキャッチし、カスタム503エラーページを返すことができます。
Cloudfrontを使用したカスタムエラーページのボーナス構成:
多くの人がHTTPSなどに使用するように、Cloudfrontを使用します。Cloudfrontにはエラーページがあります。これは要件です。
/error/*
などのルートのCloudfrontディストリビューションに新しい動作を追加します。/error/503-error.html
などのS3バケットルートを指すようにしますこれで、ELBが503を終了すると、カスタムエラーページが表示されます。
以上です。カスタムエラーページを取得するための手順はかなりあることを知っています。Route53などを含め、推奨されるオプションを多数試しました。しかし、これらはすべて、ELBやCloudfrontなどでの動作に問題があります。
環境のホスト名を交換した後、伝播するのに約1分程度かかることに注意してください。
展開プロセスでは、最初にcloudformationを実行して、事前定義された静的ページをs3からec2にコピーするec2マイクロインスタンス(メンテナンスインスタンス)をスピンアップします。 Cloudformationには、micro ec2インスタンスが接続されているelbが提供されます。次に、スクリプト(powershellまたはcli)を実行して、elbの終了するメンテナンスインスタンスからWebインスタンス(ec2)を削除します。
このようにして、展開プロセス中にメンテナンスインスタンスに切り替えます。
この例では、外部用と内部用の2つのエルブがあります。内部のエルブはこのプロセス中に更新されず、製品展開後のスモークテストがどのように行われるかです。テストが完了したら、別のスクリプトを実行してWebインスタンスをelbにアタッチし、メンテナンススタックを削除します。
私の知る限り、上記の答えが当てはまらない、または理想的ではない状況にありました。
(クラシック)ELBが付属しているように見える64ビットAmazon Linux/2.9.0で実行するRails 2.3でPumaを実行するアプリケーションRubyアプリケーションがあります。
そのため、ALB 503の処理はオプションではありませんでした。
また、DNS TTLを常に尊重するとは思わないさまざまなハードウェアクライアントもあるため、Route53は危険です。
うまく機能しているように見えたのは、プラットフォームに付属しているnginxのセカンダリポートです。
これを.ebextensions/maintenance.config
として追加しました
files:
"/etc/nginx/conf.d/maintenance.conf":
content: |
server {
listen 81;
server_name _ localhost;
root /var/app/current/public/maintenance;
}
container_commands:
restart_nginx:
command: service nginx restart
https://Gist.github.com/pitch-Gist/2999707 のコピーをpublic/maintenance/index.html
にドロップしました
メンテナンスを設定するために、デフォルトの80ではなくポート81を指すようにELBリスナーを切り替えます。追加のインスタンス、s3バケット、またはクライアントが新しいDNSを待機することはありません。
Beanstalk(バックエンドでのクラウド形成を待機している可能性が高い)の適用には、おそらく15秒程度しかかかりません。