質問: ### 前提・実現したいこと エンジニア1年目で、個人開発にて、Ruby on Railsの勉強中です。 Ruby on Railsで作成したアプリケーションをAWSにてWebサーバ2台の冗長構成にしたいと思っております。 * AWSのVPC内に2台のEC2インスタンスを作成し、デプロイ。 * お名前.comでドメインを取得後、Route53で設定。 * ロードバランサーを作成。 ここまでは実現できており、ブラウザからアクセスをすると正常に表示されます。 しかし、それぞれのインスタンスにsshで接続し、ログ(log配下のnginx.access.log、production.log)を確認したところ2台ともに同時にログが出力されています。 出力されるログは同じものではなく、2台のWebサーバに同時にアクセスがいきブラウザにレスポンスが返されているように見受けられます。 通常であれば、リクエストに対してどちらか一方のWebサーバからレスポンスを返すもので、ログに関してもレスポンスを返すサーバにのみ出力されるものと認識しております。 質問内容としていは 1.そもそも、そのようなことが起こり得るのか(2台のWebサーバからレスポンスを返す) 2.正しい状態、リクエストがあったら2台のWebサーバのうち1台にのみアクセスがいき、そのサーバでのみlogが出力されるようにするにはどのようにすればよいのか。 の2点になります。 ■補足情報 * AWSのVPC内にパブリックサブネットを2つ作成し、それぞれに1つずつEC2インスタンスを作成。 * ロードバランサーのターゲットグループには作成したEC2インスタンスを登録。 * Route53のAレコードにはエイリアスでロードバランサーのAレコードを設定 * EC2のインスタンス内にはnginx、unicornをインストールして使用しています。 * etc/nginx/conf.d配下に「アプリケーション名.conf」を作成し、server.nameにはドメイン名を指定しています。
回答: これは正しい挙動です。 ELBの仕様では標準でラウンドロビンルールでリクエストが送られます。 https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html 現在の標準であるApplication Load Balancerの場合 > > ターゲットグループに設定されたルーティングアルゴリズムを使用して、ルールアクションのターゲットグループからターゲットを選択します。デフォルトのルーティングアルゴリズムはラウンドロビンです。 > > > ラウンドロビンは複数台のサーバがLBに設定されている場合、1リクエストごとに処理するサーバを順番に変えていくアルゴリズムです。 > > 通常であれば、リクエストに対してどちらか一方のWebサーバからレスポンスを返すもので、ログに関してもレスポンスを返すサーバにのみ出力されるものと認識しております。 > > > これは認識の通りです。 しかし、この例ではCSSや画像など複数のコンテンツを取得するので、リクエストは複数か発生します。 各リクエストはどちらか一方のサーバが応答していますが、複数のリクエストが発生しているため、結果的に同時にレスポンスが返ってきたように見えています。 > > 2.正しい状態、リクエストがあったら2台のWebサーバのうち1台にのみアクセスがいき、そのサーバでのみlogが出力されるようにするにはどのようにすればよいのか。 > > > 「正しい状態」にするのはELB単体では無理です。 2台のウェブサーバをそれぞれ別のLB配下にして、Route53のDNSフェイルオーバーという機能を利用することで達成できます。 ただしこの方法ですと、片方のサーバは通常時に無駄になってしまうためおすすめできません。 https://aws.amazon.com/jp/premiumsupport/knowledge-center/route-53-dns-health-checks/