Classic Load Balancer のスティッキーセッションの設定
デフォルトでは、Classic Load Balancerは負荷が最小の登録されたインスタンスに各リクエストを個別にルーティングします。スティッキーセッション機能 (セッションアフィニティとも呼ばれる) を使用することによって、ロードバランサーがユーザーのセッションを特定のアプリケーションインスタンスにバインドするように設定できます。これにより、ユーザーのセッション中のすべてのリクエストが同じインスタンスに送信されます。
スティッキーセッションの管理において重要なのは、ロードバランサーがユーザーのリクエストを同じインスタンスに一貫してルーティングする期間の決定です。アプリケーションに独自のセッション Cookie がある場合は、アプリケーションのセッション Cookie で指定されている期間に従うセッション Cookie を作成するように Elastic Load Balancing を設定できます。アプリケーションに独自のセッション Cookie がない場合は、独自の維持期間を指定することによってセッション Cookie を作成するように Elastic Load Balancing を設定できます。
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 として AWSALBCORS を作成します。この Cookie
には、元の維持 Cookie と同じ情報に加えて、この SameSite
属性が含まれます。クライアントは両方の Cookie を受け取ります。
インスタンスでエラーや異常が発生した場合、ロードバランサーはそのインスタンスへのリクエストのルーティングを停止し、既存の負荷分散アルゴリズムに基いて新しい正常なインスタンスを選択します。リクエストは、Cookie がなく、セッションが維持されていない場合と同様に、新しいインスタンスにルーティングされます。
クライアントが異なるバックエンドポートを持つリスナーに切り替えた場合、維持設定は失われます。
コンソールを使用してロードバランサーの期間ベースのスティッキーセッションを有効にするには
-
https://console.aws.amazon.com/ec2/
で Amazon EC2 コンソールを開きます。 -
ナビゲーションペインの [LOAD BALANCING] で [ロードバランサー] を選択します。
-
ロードバランサーを選択します。
-
[Description] タブで、[Edit stickiness] を選択します。
-
[Edit stickiness] ページで、[Enable load balancer generated cookie stickiness] をクリックします。
-
(オプション) [Expiration Period] に Cookie の有効期間を秒単位で入力します。有効期限を指定しない場合、スティッキーセッションはブラウザセッションが終わるまで保持されます。
-
[Save] を選択します。
AWS CLI を使用してロードバランサーの期間ベースのスティッキーセッションを有効にするには
-
次の create-lb-cookie-stickiness-policy コマンドを使用し、Cookie の有効期間を 60 秒に設定して、ロードバランサーが生成する Cookie の維持ポリシーを作成します。
aws elb create-lb-cookie-stickiness-policy --load-balancer-name
my-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-name
my-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-name
my-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-2016-08" ] }, ... ], ... "Policies": { "LBCookieStickinessPolicies": [ { "PolicyName": "my-duration-cookie-policy", "CookieExpirationPeriod": 60 } ], "AppCookieStickinessPolicies": [], "OtherPolicies": [ "ELBSecurityPolicy-2016-08" ] }, ... } ] }
アプリケーション制御によるセッションの維持
ロードバランサーは、特殊な Cookie を使用して、最初のリクエストを処理したインスタンスにセッションを関連付けますが、ポリシー設定で指定されているアプリケーション Cookie の有効期間に従います。ロードバランサーは、アプリケーションの応答に新しいアプリケーション Cookie が含まれている場合のみ、新しい維持 Cookie を挿入します。ロードバランサー維持 Cookie はリクエストごとに更新されることはありません。アプリケーション Cookie が明示的に削除されるかまたは有効期限切れになると、新しいアプリケーション Cookie が発行されない限り、セッションは sticky ではなくなります。
バックエンドインスタンスによって設定された属性 (path
、port
、domain
、secure
、httponly
、discard
、max-age
、expires
、version
、comment
、commenturl
、および samesite
) が Cookie でクライアントに送信されます。
インスタンスでエラーや異常が発生した場合、ロードバランサーはそのインスタンスへのリクエストのルーティングを停止し、既存の負荷分散アルゴリズムに基いて新しい正常なインスタンスを選択します。ロードバランサーは、セッションが新しい正常なインスタンスで "維持" されていると見なし、エラーが発生したインスタンスが正常な状態に戻っても、継続して新しいインスタンスにリクエストをルーティングします。
コンソールを使用してアプリケーション制御によるセッション維持を有効にするには
-
https://console.aws.amazon.com/ec2/
で Amazon EC2 コンソールを開きます。 -
ナビゲーションペインの [LOAD BALANCING] で [ロードバランサー] を選択します。
-
ロードバランサーを選択します。
-
[Description] タブで、[Edit stickiness] を選択します。
-
[Edit stickiness ] ページで、[Enable application generated cookie stickiness] を選択します。
-
[Cookie Name] にアプリケーション Cookie の名前を入力します。
-
[Save] を選択します。
AWS CLI を使用してアプリケーション制御によるセッション維持を有効にするには
-
次の create-app-cookie-stickiness-policy コマンドを使用して、アプリケーションが生成する Cookie の維持ポリシーを作成します。
aws elb create-app-cookie-stickiness-policy --load-balancer-name
my-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-name
my-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-name
my-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-2016-08" ] }, { "Listener": { "InstancePort": 80, "LoadBalancerPort": 80, "Protocol": "TCP", "InstanceProtocol": "TCP" }, "PolicyNames": [] } ], ... "Policies": { "LBCookieStickinessPolicies": [], "AppCookieStickinessPolicies": [ { "PolicyName": "my-app-cookie-policy", "CookieName": "my-app-cookie" } ], "OtherPolicies": [ "ELBSecurityPolicy-2016-08" ] }, ... } ] }