タイトル

Need for Answer

ラベル elb の投稿を表示しています。 すべての投稿を表示
ラベル elb の投稿を表示しています。 すべての投稿を表示

2014年12月4日木曜日

ELB配下にあるDjangoにリクエストプロトコルを判断させたい

ELB配下にあるEC2にプロトコルを渡したい、そんなこと有りますよね!
何が困ってそんなことをって話なのですが、下記2点に該当する人だと思います。

  1. ELBにSSLアクセラレーションさせてる(HTTPS→HTTP変換)
  2. EC2にApache→Djangoを使ってる
で詳細な問題って何?な話なのですが、「ELBが渡してくるリクエストヘッダと、Djangoが解釈するリクエストヘッダが微妙に違う」ってことです。ちなみにこんなかんじです。

  • ELBが送るリクエストヘッダ → X-Forwarded-Proto:https
  • Djangoが解釈したいリクエストヘッダ → X-Forwarded-Protocol:https

なので、「リクエストヘッダの内容を判断して、Djangoに送るヘッダを書き換えよう」ってのが具体的なアクションになります。

という事で、Apacheのconfigを作ってみました。


#
# for Django
#
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
SetEnvIf X-Forwarded-Proto https PROTO_HTTPS
RequestHeader set X-Forwarded-Protocol "https" env=PROTO_HTTPS

2014年11月24日月曜日

ELBからのヘルスチェックは適当に200を返そう

Elastic Load Balancing(ELB)便利ですね!ELBの後ろにnginxを置いてる人、多いと思います!

…なのですが、ELBのHTTPヘルスチェックのためにファイルを置くのめんどくさい!ELBにはHTTPで応答できるかだけ監視して欲しいってこと…あると思います!

ということでこんな設定でどうでしょうか!

map $http_user_agent $bot {
  default                  0;
  ~*(ELB-HealthChecker)    1;
}

server {
    if ($bot = 1) {
      return 200;
    }
}

2014年10月1日水曜日

AWSのELBのエフェメラルポートは1024-65535

タイトルに書いてあることが全てなのですが、Amazon Web ServicesのElastic Load Balancingのエフェメラルポートは1024-65535です。ここに書いてあります。
Network ACLs - Amazon Virtual Private Cloud

これが何か?という話なのですが、「Amazon Virtual Private CloudのNetworkACLを使うと、エフェメラルポートを指定する必要がある」ということなんですね。ここでポイントになるのが、「クライアント→ELB→EC2」という通信路の「ELB→EC2」部分のエフェメラルポートになります。

ちなみにLinuxの使うエフェメラルポートは32768-61000です。念のため確認するにはこんな感じのコマンドです。

cat /proc/sys/net/ipv4/ip_local_port_range

どーでもいいんだけど、NetworkACLってTCPフラグで書けるようにならないのかな…