インフラブログ

とあるWEBサイトのインフラを構築運用するメモ

AWS ELB(Elastic Load Balancing)作成

インターネットからのHTTPリクエストを受けるproxyサーバRailsが動くアプリケーションサーバの間にロードバランサであるELBを挟んで複数のアプリケーションサーバにリクエストを振るようにします。ちなみにELBはZeus製と聞いたことがあります。

AWS Mamagement Consle上のブラウザ操作で簡単作成できるのですが、環境の複製を作るといった場合に同じ操作をするのはしんどいので、スクリプトで作成できるようにします。

こんな感じ

stage = "staging"
subnet = "xxxx"
sg = "xxx"
elb_name = "#{stage}-lb-1"

#ロードバランサの作成
# subnets指定することでそのsubnetsにいるインスタンスだけにフォワードする
# scheme : internalでsubnet内に配置
# http(tcp:80)をlistenしてhttp(tcp:80)にフォワードする

lb = AWS::ELB::LoadBalancerCollection.new.create(elb_name,
  :subnets =>  [subnet],
  :security_groups => [sg],
  :scheme => "internal",  
  :listeners => [{
    :port => 80,
    :protocol => :http,
    :instance_port => 80,
    :instance_protocol => :http,
  }]
)

#ヘルスチェックの設定
# unhealthy_threshold 
#   ヘルスチェックの結果、連続okでない回数がこの指定値以上になれば
#   インスタンスにリクエストを送らない(out of service)
# healthy_threshold
#   out of serviceのインスタンスにヘルスチェックを行った際、この指定値以上に連続okとなれば
#   このインスタンへのリクエスト配信を再開する(inservice)
# interval - 6秒に1回ELBが配下のインスタンスにヘルスチェック用リクエストを飛ばす
# timeout - 配下のインスタンスからの応答待ち時間(超えたらunhealth+1)
# target - ヘルスチェックのリクエストにtcp:80でGET/healthを使用する
lb.configure_health_check(
  :healthy_threshold => 2,
  :unhealthy_threshold => 10,
  :interval => 6,
  :timeout => 5,
  :target => "HTTP:80/health"
)

#インスタンスをELB配下に登録する(web=stagingのタグを持つインスタンスが対象)
lb.instances.register(AWS::EC2.new.instances.tagged("web").tagged_values(stage).select{|ins| ins })

# クッキーでのスティッキーポリシーの作成
# cookie_name - リクエスト振り分けをスティッキーにする際にキーとして使用する名前
AWS::ELB::Client.new.create_app_cookie_stickiness_policy(
  :load_balancer_name => elb_name,
  :policy_name => "lb-cookie-session",
  :cookie_name => "_session_id"
)

# ELBリスナーにポリシー適用
# tcp80ポートリスナーに上記のcookie sticknessポリシーを適用する
AWS::ELB::Client.new.set_load_balancer_policies_of_listener(
  :load_balancer_name => elb_name,
  :load_balancer_port => 80,
  :policy_names => ["lb-cookie-session"]
)