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 propriedadepath=/my_path
, o Elastic Load Balancing mudará essa propriedade na solicitação encaminhada parapath=/my%5Fpath
. -
Você não pode definir o sinalizador
secure
ou o sinalizadorHttpOnly
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 sinalizadorsecure
ou o sinalizadorHttpOnly
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
Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/
. -
No painel de navegação, em Load Balancing (Balanceamento de carga), escolha Load balancers (Balanceadores de carga).
-
Escolha o nome do balanceador de carga para abrir sua página de detalhes.
-
Na guia Receptores, escolha Gerenciar receptores.
-
Na página Gerenciar receptores, localize o receptor a ser atualizado e escolha Editar em Durabilidade do cookie.
-
No pop-up Editar configuração de perdurabilidade de cookies, selecione Gerado pelo balanceador de carga.
-
(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.
-
Escolha Salvar alterações para fechar a janela pop-up.
-
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
-
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-namemy-duration-cookie-policy
--cookie-expiration-period 60 -
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-port443
--policy-namesmy-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. -
(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
Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/
. -
No painel de navegação, em Load Balancing (Balanceamento de carga), escolha Load balancers (Balanceadores de carga).
-
Escolha o nome do balanceador de carga para abrir sua página de detalhes.
-
Na guia Receptores, escolha Gerenciar receptores.
-
Na página Gerenciar receptores, localize o receptor a ser atualizado e escolha Editar em Durabilidade do cookie.
-
Selecione Gerado pela aplicação.
-
Em Nome de cookie, digite o nome do cookie do aplicativo.
-
Escolha Salvar alterações.
Para habilitar a perdurabilidade da sessão controlada por aplicativo usando a AWS CLI
-
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-namemy-app-cookie-policy
--cookie-namemy-app-cookie
-
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-port443
--policy-namesmy-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. -
(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
-
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" ] }, ... } ] }