メニュー
Elastic Load Balancing
クラシックロードバランサー

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 を使用します。ロードバランサーがリクエストを受け取ると、まずこの Cookie がリクエスト内にあるかどうかを調べます。ある場合は、Cookie で指定されているインスタンスにリクエストが送信されます。Cookie がない場合は、ロードバランサーが既存の負荷分散アルゴリズムに基いてインスタンスを選択します。同じユーザーの後続のリクエストをそのインスタンスにバインドするために Cookie が応答に挿入されます。スティッキーポリシー設定では、各 Cookie の有効期間を設定する Cookie 期限を定義します。クッキーが期限切れになった後、セッションはスティッキーではなくなります。

インスタンスでエラーや異常が発生した場合、ロードバランサーはそのインスタンスへのリクエストのルーティングを停止し、既存の負荷分散アルゴリズムに基いて新しい正常なインスタンスを選択します。リクエストは、Cookie がなく、セッションが維持されていない場合と同様に、新しいインスタンスにルーティングされます。

クライアントが異なるバックエンドポートを持つリスナーに切り替えた場合、維持設定は失われます。

コンソールを使用してロードバランサーの期間ベースのスティッキーセッションを有効にするには

  1. https://console.aws.amazon.com/ec2/) にある Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインの [LOAD BALANCING] で [Load Balancers] を選択します。

  3. ロードバランサーを選択します。

  4. [Description] タブで、[Edit stickiness] を選択します。

  5. [Edit stickiness] ページで、[Enable load balancer generated cookie stickiness] をクリックします。

  6. (オプション) [Expiration Period] に Cookie の有効期間を秒単位で入力します。有効期限を指定しない場合、スティッキーセッションはブラウザセッションが終わるまで保持されます。

  7. [Save] を選択します。

AWS CLI を使用してロードバランサーの期間ベースのスティッキーセッションを有効にするには

  1. 次の create-lb-cookie-stickiness-policy コマンドを使用し、Cookie の有効期間を 60 秒に設定して、ロードバランサーが生成する Cookie の維持ポリシーを作成します。

    Copy
    aws elb create-lb-cookie-stickiness-policy --load-balancer-name my-loadbalancer --policy-name my-duration-cookie-policy --cookie-expiration-period 60
  2. 次の set-load-balancer-policies-of-listener コマンドを使用して、特定のロードバランサーのセッション維持を有効にします。

    Copy
    aws elb set-load-balancer-policies-of-listener --load-balancer-name my-loadbalancer --load-balancer-port 443 --policy-names my-duration-cookie-policy

    注記

    set-load-balancer-policies-of-listener コマンドは、指定されたロードバランサーのポートに関連付けられた現在の一連のポリシーを置き換えます。このコマンドを使用するたびに、--policy-names を指定して有効にするすべてのポリシーを一覧表示します。

  3. (省略可) 次の describe-load-balancers コマンドを使用して、ポリシーが有効になっていることを確認します。

    Copy
    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 ではなくなります。

インスタンスでエラーや異常が発生した場合、ロードバランサーはそのインスタンスへのリクエストのルーティングを停止し、既存の負荷分散アルゴリズムに基いて新しい正常なインスタンスを選択します。ロードバランサーは、セッションが新しい正常なインスタンスで "維持" されていると見なし、エラーが発生したインスタンスが正常な状態に戻っても、継続して新しいインスタンスにリクエストをルーティングします。

コンソールを使用してアプリケーション制御によるセッション維持を有効にするには

  1. https://console.aws.amazon.com/ec2/) にある Amazon EC2 コンソールを開きます。

  2. ナビゲーションペインの [LOAD BALANCING] で [Load Balancers] を選択します。

  3. ロードバランサーを選択します。

  4. [Description] タブで、[Edit stickiness] を選択します。

  5. [Edit stickiness ] ページで、[Enable application generated cookie stickiness] を選択します。

  6. [Cookie Name] にアプリケーション Cookie の名前を入力します。

  7. [Save] を選択します。

AWS CLI を使用してアプリケーション制御によるセッション維持を有効にするには

  1. 次の create-app-cookie-stickiness-policy コマンドを使用して、アプリケーションが生成する Cookie の維持ポリシーを作成します。

    Copy
    aws elb create-app-cookie-stickiness-policy --load-balancer-name my-loadbalancer --policy-name my-app-cookie-policy --cookie-name my-app-cookie
  2. 次の set-load-balancer-policies-of-listener コマンドを使用して、ロードバランサーのセッション維持を有効にします。

    Copy
    aws elb set-load-balancer-policies-of-listener --load-balancer-name my-loadbalancer --load-balancer-port 443 --policy-names my-app-cookie-policy

    注記

    set-load-balancer-policies-of-listener コマンドは、指定されたロードバランサーのポートに関連付けられた現在の一連のポリシーを置き換えます。このコマンドを使用するたびに、--policy-names を指定して有効にするすべてのポリシーを一覧表示します。

  3. (省略可) 次の describe-load-balancers コマンドを使用して、維持ポリシーが有効になっていることを確認します。

    Copy
    aws elb describe-load-balancers --load-balancer-name my-loadbalancer
  4. 応答には、指定したポートのリスナーに対してポリシーが有効になっていることを示す次の情報が出力されます。

    {
        "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" 
                    ]
                }, 
                ...
            }
        ]
    }