Configurar sessões persistentes para seu Classic Load Balancer - Elastic Load Balancing

Configurar sessões persistentes para seu Classic Load Balancer

Por padrão, um Classic Load Balancer roteia cada solicitação de forma independente para a instância registrada com a menor carga. No entanto, você pode usar o recurso sticky session (também conhecida como afinidade de sessão), que permite que o load balancer vincule a sessão de um usuário a uma instância específica. Isso garante que todas as solicitações do usuário durante a sessão sejam enviadas para a mesma instância.

O segredo para o gerenciamento de sticky sessions é determinar por quanto tempo o load balancer deve rotear consistentemente a solicitação do usuário para a mesma instância. Se sua aplicação tiver seu próprio cookie de sessão, você pode configurar o Elastic Load Balancing de forma que o cookie da sessão acompanhe a duração especificada pelo cookie de sessão da aplicação. Se sua aplicação não tiver seu próprio cookie de sessão, você pode configurar o Elastic Load Balancing para criar um cookie de sessão ao especificar sua própria duração de persistência.

O Elastic Load Balancing cria um cookie, chamado AWSELB, que é usado para mapear a sessão para a instância.

Requisitos
  • Um load balancer HTTP/HTTPS.

  • Pelo menos uma instância íntegra em cada Zona de disponibilidade.

Compatibilidade
  • A RFC para a propriedade do caminho de um cookie permite sublinhados. No entanto, o URI do Elastic Load Balancing codifica caracteres sublinhados como %5F, pois alguns navegadores, como o Internet Explorer 7, esperam que os sublinhados sejam codificados no URI como %5F. Por causa do possível impacto a navegadores que estejam funcionando no momento, o Elastic Load Balancing continuará a codificar em URI os caracteres sublinhados. Por exemplo, se o cookie tiver a propriedade path=/my_path, o Elastic Load Balancing mudará essa propriedade na solicitação encaminhada para path=/my%5Fpath.

  • Você não pode definir o sinalizador secure ou o sinalizador HttpOnly nos cookies de perdurabilidade da sessão baseado na duração. No entanto, esses cookies não contêm dados confidenciais. Observe que, se você definir o sinalizador secure ou o sinalizador HttpOnly em um cookie de perdurabilidade da sessão controlada pelo aplicativo, ele também será configurado no cookie AWSELB.

  • Se você tiver um ponto-e-vírgula no final no campo Set-Cookie de um cookie do aplicativo, o load balancer ignorará o cookie.

Persistência da sessão com base na duração

O load balancer usa um cookie especial, AWSELB, para rastrear a instância para cada solicitação a cada listener. Quando o load balancer receber uma solicitação, ele primeiro verificará se esse cookie está presente na solicitação. Se estiver, a solicitação será enviada para a instância especificada no cookie. Se não houver um cookie, o load balancer selecionará uma instância com base no algoritmo de balanceamento de carga existente. Um cookie é inserido na resposta para vincular solicitações subsequentes do mesmo usuário para essa instância. A configuração da política de perdurabilidade define a expiração de um cookie, que estabelece a validade de cada cookie. O load balancer não atualiza o tempo de expiração do cookie e não verifica se o cookie expirou antes de usá-lo. Após um cookie expirar, a sessão não será mais sticky. O cliente deve remover o cookie do armazenamento de cookies após a expiração.

Com solicitações de CORS (cross-origin resource sharing, compartilhamento de recursos de origem cruzada), alguns navegadores exigem SameSite=None; Secure para habilitar a perdurabilidade. Nesse caso, o Elastic Load Balancing cria um segundo cookie de persistência, o AWSELBCORS, que inclui as mesmas informações que o cookie de persistência original, além deste atributo SameSite. Os clientes recebem ambos os cookies.

Se uma instância falhar ou ficar não deixar de ser íntegra, o load balancer interromperá as solicitações de roteamento para essa instância e escolherá uma nova instância íntegra com base no algoritmo de balanceamento de carga existente. A solicitação é roteada para a nova instância como se não houvesse cookie e a sessão não for mais perdurável.

Se um cliente mudar para um listener com uma porta de back-end diferente, a perdurabilidade será perdida.

Para habilitar sticky sessions com base na duração para um load balancer usando o console
  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.

  2. No painel de navegação, em Load Balancing (Balanceamento de carga), escolha Load balancers (Balanceadores de carga).

  3. Escolha o nome do balanceador de carga para abrir sua página de detalhes.

  4. Na guia Receptores, escolha Gerenciar receptores.

  5. Na página Gerenciar receptores, localize o receptor a ser atualizado e escolha Editar em Durabilidade do cookie.

  6. No pop-up Editar configuração de perdurabilidade de cookies, selecione Gerado pelo balanceador de carga.

  7. (Opcional) Em Período de expiração, digite o período de expiração do cookie, em segundos. Se você não especificar um período de expiração, a sticky session durará por toda a sessão do navegador.

  8. Escolha Salvar alterações para fechar a janela pop-up.

  9. Escolha Salvar alterações para retornar à página de detalhes do balanceador de carga.

Para habilitar sticky sessions com base na duração para um load balancer usando a AWS CLI
  1. Use o comando create-lb-cookie-perdurabilidade-policy para criar uma política de perdurabilidade de cookies gerada pelo load balancer com um período de expiração do cookie 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. Use o comando set-load-balancer-policies-of-listener para habilitar a perdurabilidade da sessão para o load balancer 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

    O comando set-load-balancer-policies-of-listener substitui o conjunto atual de políticas associado à porta especificada do load balancer. Sempre que você usar esse comando, especifique a opção --policy-names para listar todas as políticas a serem habilitadas.

  3. (Opcional) Use o comando describe-load-balancers para verificar se a política foi habilitada:

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

    A resposta inclui as informações a seguir, que mostram que a política está ativada para o listener na porta especificada:

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

Persistência da sessão controlada pela aplicação

O load balancer usa um cookie especial para associar a sessão com a instância que lidou com a solicitação inicial, mas segue a vida do cookie do aplicativo especificado na configuração da política. O load balancer só inserirá um novo cookie de perdurabilidade se a resposta do aplicativo incluir um novo cookie do aplicativo. O cookie de perdurabilidade do load balancer não será atualizado com cada solicitação. Se o cookie for explicitamente removido ou expirar, a sessão deixará de ser perdurável até ser emitido um novo cookie do aplicativo.

Os seguintes atributos definidos por instâncias back-end são enviados para clientes no cookie: path, port, domain, secure, httponly, discard, max-age, expires, version, comment, commenturl e samesite.

Se uma instância falhar ou ficar não deixar de ser íntegra, o load balancer interromperá as solicitações de roteamento para essa instância e escolherá uma nova instância íntegra com base no algoritmo de balanceamento de carga existente. O load balancer trata a sessão agora como "grudada" à nova instância íntegra e continua a rotear solicitações para essa instância, mesmo se a instância falha retornar.

Para habilitar a perdurabilidade da sessão controlada por aplicativo usando o console
  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.

  2. No painel de navegação, em Load Balancing (Balanceamento de carga), escolha Load balancers (Balanceadores de carga).

  3. Escolha o nome do balanceador de carga para abrir sua página de detalhes.

  4. Na guia Receptores, escolha Gerenciar receptores.

  5. Na página Gerenciar receptores, localize o receptor a ser atualizado e escolha Editar em Durabilidade do cookie.

  6. Selecione Gerado pela aplicação.

  7. Em Nome de cookie, digite o nome do cookie do aplicativo.

  8. Escolha Salvar alterações.

Para habilitar a perdurabilidade da sessão controlada por aplicativo usando a AWS CLI
  1. Use o comando create-app-cookie-stickiness-policy para criar uma política de perdurabilidade de cookie gerada pelo aplicativo:

    aws elb create-app-cookie-stickiness-policy --load-balancer-name my-loadbalancer --policy-name my-app-cookie-policy --cookie-name my-app-cookie
  2. Use o comando set-load-balancer-policies-of-listener para habilitar a perdurabilidade da sessão para um load balancer:

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

    O comando set-load-balancer-policies-of-listener substitui o conjunto atual de políticas associado à porta especificada do load balancer. Sempre que você usar esse comando, especifique a opção --policy-names para listar todas as políticas a serem habilitadas.

  3. (Opcional) Use o comando describe-load-balancers para verificar se a política de perdurabilidade está habilitada:

    aws elb describe-load-balancers --load-balancer-name my-loadbalancer
  4. A resposta inclui as informações a seguir, que mostram que a política está ativada para o listener na porta especificada:

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