ELB †
NLB: TCPロードバランサー †
WebSocket? †
- ws://, wss:// はデフォルト設定では使えない
- ALBはws://, wss:// をサポートしている
Proxy Protocolを有効にする †
- ロードバランサーの Proxy Protocol のサポートを設定する
Proxy Protocol を有効にすると、送信元 IP アドレス、送信先 IP アドレス、ポート番号などの接続情報が含まれる、人間が読んで理解できるヘッダーがリクエストヘッダーに追加されます。これにより、ヘッダーがリクエストの一部としてバックエンドインスタンスに送信されます。
- ELBとアプリケーション両方がproxy protocolの有効化が必要
- 両方の切替時にサービス断が発生するので注意
セキュリティポリシー更新 †
- aws cliを使う場合
- ポリシー名一覧取得
aws elb describe-load-balancer-policies --query "PolicyDescriptions[].{PolicyName:PolicyName}"
[
{
"PolicyName": "ELBSecurityPolicy-2014-10"
},
{
"PolicyName": "ELBSecurityPolicy-2014-01"
},
{
"PolicyName": "ELBSecurityPolicy-2011-08"
},
{
"PolicyName": "ELBSample-ELBDefaultNegotiationPolicy"
},
{
"PolicyName": "ELBSample-OpenSSLDefaultNegotiationPolicy"
}
]
- ELBの一覧とセキュリティポリシーの取得
aws elb describe-load-balancers --query "LoadBalancerDescriptions[].{LoadBalancerName:LoadBalancerName,Policies:Policies.OtherPolicies}"
[
{
"Policies": [
"ELBSecurityPolicy-2014-01"
],
"LoadBalancerName": "example-lb"
},
...
]
- 全リージョンのELB一覧とポリシーをファイルに出力
AWS_PROFILE=default; for region in $(aws --profile $AWS_PROFILE ec2 describe-regions --query "Regions[].[RegionName]" --output text); do \
echo "---- $region"; aws --profile $AWS_PROFILE --region $region elb describe-load-balancers --query "LoadBalancerDescriptions[].{LoadBalancerName:LoadBalancerName,Policies:Policies.OtherPolicies}"; \
done > $AWS_PROFILE.elb.$(date +%Y%m%d-%H%M%S).log
- セキュリティポリシーの更新。set-load-balancer-policies-of-listenerに直接ELBSecurityPolicy-2014-10を指定してもエラーになった。"ELBSecurityPolicy-*"は予約語で使えなかった。
aws elb create-load-balancer-policy --load-balancer-name example-lb --policy-name ref-ELBSecurityPolicy-2014-10 --policy-type-name SSLNegotiationPolicyType --policy-attributes AttributeName=Reference-Security-Policy,AttributeValue=ELBSecurityPolicy-2014-10
aws elb set-load-balancer-policies-of-listener --load-balancer-name example-lb --load-balancer-port 443 --policy-names ref-ELBSecurityPolicy-2014-10
- セキュリティポリシーの削除。Management Consoleで設定するとセーブする度に、"AWSConsole-SSLNegotiationPolicy-*"という名前のポリシーが増える
aws elb delete-load-balancer-policy --load-balancer-name example-lb --policy-name AWSConsole-SSLNegotiationPolicy-example-lb-123456789
- 指定したELBを、リージョン毎に一括更新する
ELB_NAMES=(my-elb-01 my-elb-02)
ELB_POLICY=ELBSecurityPolicy-2014-10
AWS_PROFILE=default
AWS_REGION=ap-northeast-1
for elb_name in "${ELB_NAMES[@]}"; do \
aws --profile $AWS_PROFILE --region $AWS_REGION elb create-load-balancer-policy --load-balancer-name $elb_name --policy-name ref-${ELB_POLICY} --policy-type-name SSLNegotiationPolicyType --policy-attributes AttributeName=Reference-Security-Policy,AttributeValue=$ELB_POLICY ; \
sleep 10; \
aws --profile $AWS_PROFILE --region $AWS_REGION elb set-load-balancer-policies-of-listener --load-balancer-name $elb_name --load-balancer-port 443 --policy-names ref-${ELB_POLICY}
done
Cross-Zone Load Balancingは有効にする †
Cross-Zone Load Balancing: Enabledにした方が良い。
デフォルトはDisabled:
- アクセス数の例
- ELB: 1台
- EC2: AZ:1a(1台), 1b(2台)
- ELBから、1aに50%, 1bに50%に割り振られる。1aには1台なので50%分のアクセス数があり、1bは2台なのでそれぞれ25%のアクセスがある。
- Cross-Zone Load Balancing: Enabledにした場合は、それぞれ33%ずつのアクセスがある
Listener TCP/HTTPの違い †
- Listener HTTP
- ELB配下のHTTPサーバがKeep-Aliveが使える場合、リクエストを連結し、接続を再利用する(1リクエストに異なるクライアントからのリクエストが含まれる)
- HTTPヘッダ transfer-encoding: chunked を外し、Content-Lengthを追加し、chunkに分割されていないクライアントにレスポンスを返す
アクセス元のIPアドレスで記録/制限する †
- ELBからのアクセスの場合、ELBのIPアドレス(10.x.x.x)がアクセスログに記録される
- httpの場合:「X-Forwarded-For」ヘッダが付く
- httpsでELBのSSL Termination機能を使った場合:「X-Forwarded-For」ヘッダが付く
elb-create-lb test-lb \
--availability-zones ap-northeast-1a,ap-northeast-1b \
--listener "protocol=HTTP, lb-port=80, instance-port=80" \
--listener "protocol=HTTPS, lb-port=443, instance-port=80, cert-id=arn:aws:iam::ACCOUNT_NO:server-certificate/SSL-NAME"
- httpsでELBではSSLデコードせず、ホスト側にSSL証明書をいれた場合:「X-Forwarded-For」ヘッダは付かないため、以下の方法が使えない
elb-create-lb test-lb \
--availability-zones ap-northeast-1a,ap-northeast-1b \
--listener "protocol=HTTP, lb-port=80, instance-port=80" \
--listener "protocol=TCP, lb-port=443, instance-port=443"
ELBからのアクセスのみを許可 †
- EC2 > Security Groups > 該当セキュリティグループを選択
- Create a new rule: HTTP
- Source: amazon-elb/amazon-elb-sg
ELBとmod_rpafのテスト †
- テスト用 elb作成(SSL Terminationを使わない普通のELB)
LB_NAME=test-lb
elb-create-lb $LB_NAME \
--availability-zones ap-northeast-1a,ap-northeast-1b \
--listener "protocol=HTTP, lb-port=80, instance-port=80" \
--listener "protocol=TCP, lb-port=443, instance-port=443"
DNS_NAME test-lb-274673121.ap-northeast-1.elb.amazonaws.com
|
|