1

AWS で Magento ストアを実行しており、ELB の背後で自動スケーリングをセットアップしています。常に少なくとも 2 つの Web サーバーを実行しています。各 Web サーバー インスタンスには、着信要求を処理する前に独自の Varnish Cache サーバーがあります。

問題は、CSS、画像などの静的コンテンツを変更すると、各フロントエンド EC2 インスタンスに SSH 接続し、キャッシュされたオブジェクトを Varnish から禁止する必要があることです。最初に AWS コンソールから手動でインスタンスの IP を取得し、次にインスタンスに SSH で接続する必要があるため、これは非常に面倒です。これには多くの時間がかかり、常に 2 ~ 3 台を超えるサーバーがある場合はあまり効率的ではありません。

Phoenix Media による PageCache 拡張機能のインストールを検討しましたが、そのモジュールの問題は、事前にわからない構成で varnish インスタンスの IP の静的リストを手動で入力する必要があることです。自動スケーリングサーバーが行き来するため、これは私たちの場合には機能しません。

実行中のすべてのフロントエンド サーバーに対して一度にキャッシュの無効化を設定する方法はありますか? デフォルトの VCL ファイルに必要なコードを追加しました。これにより、同じサブネット内の任意のインスタンスからのパージ/禁止が可能になります。すべての管理タスクには専用の EC2 があり、それを使用してすべてのフロントエンド サーバーにキャッシュ無効化リクエストを発行する予定です。

シェル スクリプトを作成し、AWS API を使用してすべてのフロントエンド インスタンスの IP のリストを取得し、それらすべてに禁止コマンドを発行できるのではないかと考えていました。これは機能しますか?セットアップするにはどうすればよいですか?

また、リポジトリからの最新のコードのプル中に変更されたすべてのファイルのキャッシュ無効化を自動化するために何かを行うことはできますか?

これを回避する最も効率的な方法は何でしょうか?

4

1 に答える 1

3

これは私がする方法です:

  1. elb の管理対象ノードを取得し (describe-load-balancers)、それらのノードのインスタンス ID を取得します
  2. 上記のインスタンス ID を配列に保存
  3. インスタンス ID の配列をループして、インスタンスのプライベート IP アドレスを取得します。
  4. これらのプライベート IP アドレスを別の配列に保存します
  5. このアレイをループしてから、これらのインスタンスに SSH で接続し、キャッシュ無効化スクリプト/コマンドを実行します。

ELB 管理対象ノードのプライベート IP アドレスを取得する簡単な方法を以下に示します。これは、使用する必要がある特定の AWS API に慣れるためだけのものです。

この目的で AWS CLI を使用しています。

以下のコマンドを実行して、インスタンス ID を取得します。

# aws elb describe-load-balancers --load-balancer-names my-elb | jq '.LoadBalancerDescriptions[].Instances[].InstanceId'
"i-12345678"
"i-87654321"

インスタンス ID を手元に用意したら、以下のコマンドを実行して、個々のインスタンスのプライベート IP アドレスを取得します。

# aws ec2 describe-instances --instance-ids i-12345678 i-87654321 | jq '.Reservations[].Instances[].PrivateIpAddress'
"10.0.1.1"
"10.0.1.2"

これで、ELB 管理ノードの IP アドレスを取得できました。したがって、このリストをループして、ode に ssh し、varnish コマンドを実行します。

ここで少しスクリプトを作成する必要があります。問題が発生した場合に備えて、スクリプトを作成し、別の質問を投稿してください。

上記で使用した AWS API はdescribe-load-balancersdescribe-instancesです。jqそして、jsonパーサーを使用して、必要な情報のみを取得しています。

于 2015-03-16T13:27:28.527 に答える