web-dev-qa-db-ja.com

インスタンスがELBの背後にある場合、AWSのメンテナンスページをどのように作成しますか?

ELBの背後にアプリケーションの新しいバージョンをデプロイする場合、AWSでどのようにメンテナンスページを作成しますか?新しい自動スケーリングされたインスタンスが起動している間に、ELBがメンテナンスインスタンスにトラフィックをルーティングし、完全に起動した後にのみ新しいインスタンスに「反転」するようにします。自動スケーリングを使用して、既存のインスタンスを停止し、新しいコードを持つ新しいインスタンスを起動します。

回避しようとしているシナリオは、ELBに新しいEC2インスタンスへの両方のトラフィックを提供すると同時に、メンテナンスページも提供することです。スティッキーセッションを有効にしていないため、ユーザーがメンテナンスモードページとEC2インスタンスにデプロイされたアプリケーションの間を行き来するのを防ぎたいと思います。コードの変更には古いコードの変更を壊すデータベースの変更が含まれる可能性があるため、新しいインスタンスを導入するためにスケールアップすることはできません(2から4インスタンスから2に戻すなど)。

34
BestPractices

AWSで最も簡単な方法は、DNSサービスである Route 5 を使用することです。

Weighted Round Robin の機能を使用できます。

「WRRを使用して、サーバーを運用環境に導入したり、A/Bテストを実行したり、さまざまなサイズの地域やデータセンター間でトラフィックのバランスを取ることができます。」

この機能に関するAWSドキュメント の詳細

編集:Route 53は最近、S3へのDNSフェイルオーバーを可能にする新しい機能を追加しました。詳細については、ドキュメントを確認してください: http://docs.aws.Amazon.com/Route53/latest/DeveloperGuide/dns-failover.html

22
Guy

Route53はこの問題の良い解決策ではありません。メンテナンスページが表示される前にDNSエントリの有効期限が切れるのにかなりの時間がかかります(そして、メンテナンスが完了してから更新されるまでに同じ時間がかかります)。この質問が行われた時点ではLambdaとCodeDeployトリガーが存在していなかったことがわかりますが、Lambdaを使用して比較的クリーンなソリューションを作成できることを他の人に知らせたいと思いました。 http://blog.ajhodges.com/2016/04/aws-lambda-setting-temporary.html

ソリューションの要点は、Lambda関数をCodeDeployイベントにサブスクライブすることです。これにより、展開中にロードバランサーの静的ページを提供するマイクロインスタンスでASGが置き換えられます。

7
asdag8

これは古い質問ですが、今日(2018年12月)同じ問題に直面した後、この問題を解決する別の方法があるようです。

今年の初め、AWSは Application Load Balancerへのリダイレクトと固定応答 のサポートを導入しました。手短に:

  • コンソールでELBを見つけます。
  • 適切なリスナーのルールを表示します。
  • アプリケーションのホスト名に固定の503応答ルールを追加します。
  • 必要に応じて、text/plainまたはtext/html応答(つまり、メンテナンスページのHTML)。
  • 変更内容を保存。

ルールがELBに伝達されると(私にとっては約30秒かかりました)、ブラウザーでホストにアクセスしようとすると、503メンテナンスページが表示されます。

展開が完了したら、追加したルールを削除するだけです。

7
Tom

私たちにとって素晴らしい仕事をしている別のソリューションを見つけました。単純な503 http応答を取得するために必要な手順は次のとおりです。

  1. EB環境を複製して別の環境を作成し、たとえばapp-environment-maintenanceなどのように呼び出します。
  2. 自動スケーリングの構成を変更し、最小サーバーと最大サーバーの両方をゼロに設定します。これにより、EC2サーバーの費用はかかりません。環境は灰色になり、リストに表示されます。
  3. 最後に、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にはエラーページがあります。これは要件です。

  1. エラーページを含む新しいS3 Webサイトホスティングバケットを作成します。応答コード、503などに個別のファイルを作成することを検討してください。ディレクトリの要件とルートについては#6を参照してください。
  2. S3バケットをCloudfrontディストリビューションに追加します。
  3. /error/*などのルートのCloudfrontディストリビューションに新しい動作を追加します。
  4. Cloudfrontでエラーページを設定して、503応答コードを処理し、/error/503-error.htmlなどのS3バケットルートを指すようにします

これで、ELBが503を終了すると、カスタムエラーページが表示されます。

以上です。カスタムエラーページを取得するための手順はかなりあることを知っています。Route53などを含め、推奨されるオプションを多数試しました。しかし、これらはすべて、ELBやCloudfrontなどでの動作に問題があります。

環境のホスト名を交換した後、伝播するのに約1分程度かかることに注意してください。

7
Jacob Thomason

展開プロセスでは、最初にcloudformationを実行して、事前定義された静的ページをs3からec2にコピーするec2マイクロインスタンス(メンテナンスインスタンス)をスピンアップします。 Cloudformationには、micro ec2インスタンスが接続されているelbが提供されます。次に、スクリプト(powershellまたはcli)を実行して、elbの終了するメンテナンスインスタンスからWebインスタンス(ec2)を削除します。

このようにして、展開プロセス中にメンテナンスインスタンスに切り替えます。

この例では、外部用と内部用の2つのエルブがあります。内部のエルブはこのプロセス中に更新されず、製品展開後のスモークテストがどのように行われるかです。テストが完了したら、別のスクリプトを実行してWebインスタンスをelbにアタッチし、メンテナンススタックを削除します。

1

私の知る限り、上記の答えが当てはまらない、または理想的ではない状況にありました。

(クラシック)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秒程度しかかかりません。

1
Mat Schaffer