Elastic Load Balancing
Classic Load Balancers

Configuración de sesiones sticky para balanceador de carga clásico

De forma predeterminada, un Classic Load Balancer direcciona cada solicitud de manera independiente a la instancia registrada con menor carga. Sin embargo, puede utilizar la característica de sesión sticky (también denominada afinidad de sesión) que permite que el balanceador de carga vincule una sesión del usuario a una instancia concreta. Con ello se garantiza que todas las solicitudes de ese usuario durante la sesión se envían a la misma instancia.

La clave para administrar las sesiones sticky consiste en determinar durante cuánto tiempo deberá direccionar el balanceador de carga la solicitud del usuario a la misma instancia. Si la aplicación tiene su propia cookie de sesión, entonces puede configurar Elastic Load Balancing de modo que la cookie sesión respete la duración especificada por la cookie de sesión de la aplicación. Si la aplicación no tiene su propia cookie de sesión, entonces puede configurar Elastic Load Balancing de modo que cree una cookie de sesión especificando su propia duración de persistencia.

Elastic Load Balancing creará una cookie, denominada AWSELB, que se utilizará para asignar la sesión a la instancia.

Requisitos

  • Un balanceador de carga HTTP/HTTPS.

  • Al menos una instancia en buen estado en cada zona de disponibilidad.

Compatibilidad

  • El RFC de la propiedad de ruta de una cookie admite los guiones bajos. Sin embargo, en los URI de Elastic Load Balancing los guiones bajos se codifican como %5F, porque algunos navegadores (como Internet Explorer 7, entre otros), esperan que los guiones bajos se codifiquen como %5F según las normas de los URI. Debido a la posible repercusión en los navegadores que se utilizan actualmente, Elastic Load Balancing continúa codificando los caracteres de guion bajo según las normas de los URI. Por ejemplo, si la cookie tiene la propiedad path=/my_path, en la solicitud reenviada Elastic Load Balancing la cambia y envía path=/my%5Fpath.

  • No se pueden establecer las marcas secure ni HttpOnly en las cookies de las sesiones sticky basadas en duración. Sin embargo, estas cookies no contienen información confidencial. Tenga en cuenta que si establece la marca secure o HttpOnly en una cookie de sesión sticky controlada por la aplicación, también se establece en la cookie AWSELB.

  • Si hay un signo de punto y coma final en el campo Set-Cookie de una cookie de aplicación, el balanceador de carga hace caso omiso de la cookie.

Sesiones sticky basadas en duración

El balanceador de carga utiliza una cookie especial para realizar el seguimiento de la instancia de cada solicitud a cada agente de escucha. Cuando el balanceador de carga recibe una solicitud, primero comprueba si esta cookie está presente en la solicitud. En caso afirmativo, la solicitud se envía a la instancia especificada en la cookie. Si no hay ninguna cookie, el balanceador de carga elige una instancia en función del algoritmo de balanceo de carga existente. Se inserta una cookie en la respuesta para vincular las solicitudes posteriores del mismo usuario a esa instancia. La configuración de la política de persistencia define el vencimiento de la cookie, que establece el periodo de validez de cada cookie. El balanceador de carga no actualiza el tiempo de caducidad de la cookie ni comprueba si ha caducado antes de usarla. Una vez que la cookie ha vencido, la sesión ya no es sticky. El cliente debe quitar la cookie de su almacén de cookies una vez caducada.

Si se produce un error en una instancia o esta pasa a encontrarse en mal estado, el balanceador de carga deja de direccionar las solicitudes a esa instancia y elige una nueva instancia en buen estado basándose en el algoritmo de balanceo de carga existente. La solicitud se redirecciona a la nueva instancia como si no hubiera ninguna cookie y la sesión deja de ser sticky.

Si un cliente cambia a un agente de escucha con un puerto backend diferente, la persistencia se pierde.

Para habilitar las sesiones sticky basadas en duración en un balanceador de carga desde la consola

  1. Abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.

  2. En el panel de navegación, en LOAD BALANCING, elija Load Balancers.

  3. Seleccione el balanceador de carga.

  4. En la pestaña Descriptions (Descripciones), elija Edit stickiness (Editar persistencia).

  5. En la página Edit stickiness (Editar persistencia), seleccione Enable load balancer generated cookie stickiness (Habilitar persistencia de la cookie generada por el balanceador de carga).

  6. (Opcional) En Expiration Period (Período de vencimiento), escriba el período de vencimiento de la cookie en segundos. Si no especifica un periodo de vencimiento, la sesión sticky durará lo mismo que la sesión del navegador.

  7. Seleccione Save.

Para habilitar las sesiones sticky basadas en duración en un balanceador de carga desde la AWS CLI

  1. Utilice el siguiente comando create-lb-cookie-stickiness-policy para crear una política de persistencia de cookies generada por el balanceador de carga con un periodo de vencimiento de cookies de 60 segundos:

    aws elb create-lb-cookie-stickiness-policy --load-balancer-name my-loadbalancer --policy-name my-duration-cookie-policy --cookie-expiration-period 60
  2. Utilice el siguiente comando set-load-balancer-policies-of-listener para habilitar la persistencia de sesiones para el balanceador de carga especificado:

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

    nota

    El comando set-load-balancer-policies-of-listener reemplaza el conjunto actual de políticas asociadas con el puerto del balanceador de carga especificado. Cada vez que se utiliza el comando, debe especificar la opción --policy-names para enumerar todas las políticas que hay que habilitar.

  3. (Opcional) Utilice el siguiente comando describe-load-balancers para comprobar que la política está habilitada:

    aws elb describe-load-balancers --load-balancer-name my-loadbalancer

    La respuesta incluye la siguiente información, que muestra que la política está habilitada para el agente de escucha en el puerto especificado:

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

Sesiones sticky controladas por la aplicación

El balanceador de carga utiliza una cookie especial para asociar la sesión con la instancia que controló la solicitud inicial, pero respeta la vida útil de la cookie de aplicación especificada en la configuración de la política. El balanceador de carga solo inserta una nueva cookie de persistencia si la respuesta de la aplicación incluye una nueva cookie de aplicación. La cookie de persistencia del balanceador de carga no se actualiza con cada solicitud. Si la cookie de aplicación se elimina de forma explícita o vence, la sesión deja de ser sticky hasta que se emite una nueva cookie de aplicación.

Si se produce un error en una instancia o esta pasa a encontrarse en mal estado, el balanceador de carga deja de direccionar las solicitudes a esa instancia y elige una nueva instancia en buen estado basándose en el algoritmo de balanceo de carga existente. El balanceador de carga trata la sesión como si estuviera "pegada" a la nueva instancia en buen estado y continúa direccionando las solicitudes a esa instancia aunque la instancia que sufrió el error vuelva a estar en buen estado.

Para habilitar las sesiones sticky controladas por la aplicación desde la consola

  1. Abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.

  2. En el panel de navegación, en LOAD BALANCING, elija Load Balancers.

  3. Seleccione el balanceador de carga.

  4. En la pestaña Descriptions (Descripciones), elija Edit stickiness (Editar persistencia).

  5. En la página Edit stickiness (Editar persistencia), seleccione Enable application generated cookie stickiness (Habilitar aplicación de la cookie generada por el balanceador de carga).

  6. En Cookie name (Nombre de cookie), escriba el nombre de la cookie de la aplicación.

  7. Seleccione Save.

Para habilitar las sesiones sticky controladas por la aplicación desde la AWS CLI

  1. Utilice el siguiente comando create-app-cookie-stickiness-policy para crear una política de persistencia de cookies generadas por la aplicación:

    aws elb create-app-cookie-stickiness-policy --load-balancer-name my-loadbalancer --policy-name my-app-cookie-policy --cookie-name my-app-cookie
  2. Utilice el siguiente comando set-load-balancer-policies-of-listener para habilitar la persistencia de sesiones para un balanceador de carga:

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

    nota

    El comando set-load-balancer-policies-of-listener reemplaza el conjunto actual de políticas asociadas con el puerto del balanceador de carga especificado. Cada vez que se utiliza el comando, debe especificar la opción --policy-names para enumerar todas las políticas que hay que habilitar.

  3. (Opcional) Utilice el siguiente comando describe-load-balancers para comprobar que la política de persistencia de sesiones está habilitada:

    aws elb describe-load-balancers --load-balancer-name my-loadbalancer
  4. La respuesta incluye la siguiente información, que muestra que la política está habilitada para el agente de escucha en el puerto especificado:

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