Classic Load Balancer のスティッキーセッションの設定
Classic Load Balancer のデフォルトでは、各リクエストは登録済みインスタンスに対し、負荷が最小になるように個別にルーティングされます。スティッキーセッション機能 (セッションアフィニティとも呼ばれる) を使用することによって、ロードバランサーがユーザーのセッションを特定のアプリケーションインスタンスにバインドするように設定できます。これにより、ユーザーのセッション中のすべてのリクエストが同じインスタンスに送信されます。
スティッキーセッションの管理において重要なのは、ロードバランサーがユーザーのリクエストを同じインスタンスに一貫してルーティングする期間の決定です。アプリケーションに独自のセッション Cookie がある場合は、Elastic Load Balancing のセッション Cookie を設定し、アプリケーションのセッション Cookie で指定された維持期間を受け入れさせることができます。アプリケーションに独自のセッション Cookie がない場合は、Elastic Load Balancing を設定し、独自の維持期間を指定しながらセッション Cookie を作成させることができます。
Elastic Load Balancing は、AWSELB という名前の Cookie を作成し、セッションをインスタンスにマッピングするために使用します。
要件
-
HTTP/HTTPS ロードバランサー。
-
各アベイラビリティーゾーンに少なくとも 1 つの正常なインスタンスがあること。
互換性
-
Cookie の path プロパティの RFC では、アンダースコアが許容されています。ただし、Elastic Load Balancing の URI ではアンダースコアは
%5Fとしてエンコードされます。Internet Explorer 7 などの一部のブラウザーでは、アンダースコアを%5Fとしてエンコードする URI が想定されているためです。現在使用されているブラウザーに影響が及ぶ可能性があることを考慮し、Elastic Load Balancing では、引き続きアンダースコア文字を URI エンコードしています。例えば、Cookie にプロパティpath=/my_pathがある場合、Elastic Load Balancing は転送されたリクエスト内のこのプロパティをpath=/my%5Fpathに変更します。 -
期間ベースのセッション維持 Cookie の
secureフラグやHttpOnlyフラグを設定することはできません。ただし、これらの Cookie に重要なデータは含まれません。アプリケーション制御によるセッション維持 Cookie にsecureまたはHttpOnlyフラグを設定した場合、AWSELB Cookie にも設定されます。 -
アプリケーション クッキーの
Set-Cookieフィールドで末尾にセミコロンがある場合、ロードバランサーはそのクッキーを無視します。
期間ベースのセッションの維持
ロードバランサーは、各リスナーへのリクエストごとに特殊な Cookieである AWSELB を使用してインスタンスを追跡します。ロードバランサーがリクエストを受け取ると、まずこの Cookie がリクエスト内にあるかどうかを調べます。ある場合は、Cookie で指定されているインスタンスにリクエストが送信されます。Cookie がない場合は、ロードバランサーが既存の負荷分散アルゴリズムに基いてインスタンスを選択します。同じユーザーの後続のリクエストをそのインスタンスにバインドするために Cookie が応答に挿入されます。スティッキーポリシー設定では、各 Cookie の有効期間を設定する Cookie 期限を定義します。ロードバランサーは、Cookie の有効期限を更新せず、Cookie を使用する前に失効しているかどうかを確認しません。クッキーが期限切れになった後、セッションはスティッキーではなくなります。クライアントは、Cookie の失効時に Cookie ストアから削除する必要があります。
CORS (クロスオリジンリソース共有) リクエストの場合、一部のブラウザは維持を有効にするために SameSite=None; Secure を必要とします。この場合、Elastic Load Balancing は別の維持 Cookie として AWSELBCORS を作成します。この Cookie には、元の維持 Cookie と同じ情報に加えて SameSite 属性が含まれます。クライアントは両方の Cookie を受け取ります。
インスタンスでエラーや異常が発生した場合、ロードバランサーはそのインスタンスへのリクエストのルーティングを停止し、既存の負荷分散アルゴリズムに基いて新しい正常なインスタンスを選択します。リクエストは、Cookie がなく、セッションが維持されていない場合と同様に、新しいインスタンスにルーティングされます。
クライアントが異なるバックエンドポートを持つリスナーに切り替えた場合、維持設定は失われます。
コンソールを使用してロードバランサーの期間ベースのスティッキーセッションを有効にするには
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/
) を開きます。 -
ナビゲーションペインの [ロードバランシング] で [ロードバランサー] を選択します。
-
ロードバランサーの名前を選択して、その詳細ページを開きます。
-
[リスナー] タブで、[リスナーを追加] を選択します。
-
[リスナーを管理] ページで、更新するリスナーを見つけて、[Cookie の維持設定] で [編集] を選択します。
-
[Cookie の維持設定]ポップアップで、ロードバランサーによって生成]を選択します。
-
(オプション) [有効期間] に Cookie の有効期間を秒単位で入力します。有効期限を指定しない場合、スティッキーセッションはブラウザセッションが終わるまで保持されます。
-
[変更を保存] をクリックして、ポップアップウィンドウを閉じます。
-
変更を保存を選択してロードバランサーの詳細ページに戻ります。
AWS CLI を使用してロードバランサーの期間ベースのスティッキーセッションを有効にするには
-
次の create-lb-cookie-stickiness-policy コマンドを使用し、Cookie の有効期間を 60 秒に設定して、ロードバランサーが生成する Cookie の維持ポリシーを作成します。
aws elb create-lb-cookie-stickiness-policy --load-balancer-namemy-loadbalancer--policy-namemy-duration-cookie-policy--cookie-expiration-period 60 -
次の set-load-balancer-policies-of-listener コマンドを使用して、特定のロードバランサーのセッション維持を有効にします。
aws elb set-load-balancer-policies-of-listener --load-balancer-namemy-loadbalancer--load-balancer-port443--policy-namesmy-duration-cookie-policy注記
set-load-balancer-policies-of-listenerコマンドは、指定されたロードバランサーのポートに関連付けられた現在の一連のポリシーを置き換えます。このコマンドを使用するたびに、--policy-namesを指定して有効にするすべてのポリシーを一覧表示します。 -
(オプション) 次の describe-load-balancers コマンドを使用して、ポリシーが有効化されていることを確認します。
aws elb describe-load-balancers --load-balancer-namemy-loadbalancer応答には、指定したポートのリスナーに対してポリシーが有効になっていることを示す次の情報が出力されます。
{ "LoadBalancerDescriptions": [ { ... "ListenerDescriptions": [ { "Listener": { "InstancePort": 443, "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-certificate", "LoadBalancerPort": 443, "Protocol": "HTTPS", "InstanceProtocol": "HTTPS" }, "PolicyNames": [ "my-duration-cookie-policy", "ELBSecurityPolicy-TLS-1-2-2017-01" ] }, ... ], ... "Policies": { "LBCookieStickinessPolicies": [ { "PolicyName": "my-duration-cookie-policy", "CookieExpirationPeriod": 60 } ], "AppCookieStickinessPolicies": [], "OtherPolicies": [ "ELBSecurityPolicy-TLS-1-2-2017-01" ] }, ... } ] }
アプリケーション制御によるセッションの維持
ロードバランサーは、特殊な Cookie を使用して、最初のリクエストを処理したインスタンスにセッションを関連付けますが、ポリシー設定で指定されているアプリケーション Cookie の有効期間に従います。ロードバランサーは、アプリケーションの応答に新しいアプリケーション Cookie が含まれている場合のみ、新しい維持 Cookie を挿入します。ロードバランサー維持 Cookie はリクエストごとに更新されることはありません。アプリケーション Cookie が明示的に削除されるかまたは有効期限切れになると、新しいアプリケーション Cookie が発行されない限り、セッションは sticky ではなくなります。
バックエンドインスタンスによって設定された属性 (path、port、domain、secure、httponly、discard、max-age、expires、version、comment、commenturl、および samesite) が Cookie でクライアントに送信されます。
インスタンスでエラーや異常が発生した場合、ロードバランサーはそのインスタンスへのリクエストのルーティングを停止し、既存の負荷分散アルゴリズムに基いて新しい正常なインスタンスを選択します。ロードバランサーは、セッションが新しい正常なインスタンスで "維持" されていると見なし、エラーが発生したインスタンスが正常な状態に戻っても、継続して新しいインスタンスにリクエストをルーティングします。
コンソールを使用してアプリケーション制御によるセッション維持を有効にするには
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/
) を開きます。 -
ナビゲーションペインの [ロードバランシング] で [ロードバランサー] を選択します。
-
ロードバランサーの名前を選択して、その詳細ページを開きます。
-
[リスナー] タブで、[リスナーを追加] を選択します。
-
[リスナーを管理] ページで、更新するリスナーを見つけて、[Cookie の維持設定] で [編集] を選択します。
-
[アプリケーションによって生成] を選択します。
-
[Cookie 名] にアプリケーション Cookie の名前を入力します。
-
[Save changes] (変更の保存) をクリックします。
AWS CLI を使用してアプリケーション制御によるセッション維持を有効にするには
-
次の create-app-cookie-stickiness-policy コマンドを使用して、アプリケーションが生成する Cookie の維持ポリシーを作成します。
aws elb create-app-cookie-stickiness-policy --load-balancer-namemy-loadbalancer--policy-namemy-app-cookie-policy--cookie-namemy-app-cookie -
次の set-load-balancer-policies-of-listener コマンドを使用して、ロードバランサーのセッション維持を有効にします。
aws elb set-load-balancer-policies-of-listener --load-balancer-namemy-loadbalancer--load-balancer-port443--policy-namesmy-app-cookie-policy注記
set-load-balancer-policies-of-listenerコマンドは、指定されたロードバランサーのポートに関連付けられた現在の一連のポリシーを置き換えます。このコマンドを使用するたびに、--policy-namesを指定して有効にするすべてのポリシーを一覧表示します。 -
(省略可) 次の describe-load-balancers コマンドを使用して、維持ポリシーが有効になっていることを確認します。
aws elb describe-load-balancers --load-balancer-namemy-loadbalancer -
応答には、指定したポートのリスナーに対してポリシーが有効になっていることを示す次の情報が出力されます。
{ "LoadBalancerDescriptions": [ { ... "ListenerDescriptions": [ { "Listener": { "InstancePort": 443, "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-certificate", "LoadBalancerPort": 443, "Protocol": "HTTPS", "InstanceProtocol": "HTTPS" }, "PolicyNames": [ "my-app-cookie-policy", "ELBSecurityPolicy-TLS-1-2-2017-01" ] }, { "Listener": { "InstancePort": 80, "LoadBalancerPort": 80, "Protocol": "TCP", "InstanceProtocol": "TCP" }, "PolicyNames": [] } ], ... "Policies": { "LBCookieStickinessPolicies": [], "AppCookieStickinessPolicies": [ { "PolicyName": "my-app-cookie-policy", "CookieName": "my-app-cookie" } ], "OtherPolicies": [ "ELBSecurityPolicy-TLS-1-2-2017-01" ] }, ... } ] }