In che modo posso risolvere gli errori 504 ricevuti quando utilizzo Application Load Balancer?

Ultimo aggiornamento: 25-04-2022

Ho riscontrato errori HTTP 504 nei log di accesso di Application Load Balancer, nei parametri di Amazon CloudWatch o durante la connessione al mio servizio tramite Application Load Balancer. Come posso risolvere il problema?

Breve descrizione

Un errore HTTP 504 è un codice di stato HTTP che indica che un gateway o un proxy è scaduto.

Gli errori HTTP 504 di Application Load Balancer possono verificarsi se:

  • Il bilanciatore del carico non è riuscito a stabilire una connessione alla destinazione prima del timeout della connessione (10 secondi).
  • Il bilanciatore del carico ha stabilito una connessione alla destinazione ma la destinazione non ha risposto prima del timeout di inattività.
  • L'ACL di rete per la sottorete non ha consentito il traffico dalle destinazioni ai nodi del bilanciatore del carico sulle porte effimere (1024-65535).
  • La destinazione restituisce un valore di intestazione Content-Length più grande del corpo dell'entità. Il bilanciatore del carico è scaduto in attesa dei byte mancanti.
  • La destinazione è una funzione AWS Lambda e il servizio non ha risposto prima del timeout di connessione.

Risoluzione

Controlla il timeout di inattività dei bilanciatori del carico e modificane il valore, se necessario

Gli errori HTTP 504 dei bilanciatori del carico possono verificarsi se l'istanza di back-end non ha risposto alla richiesta entro il periodo di timeout di inattività configurato. Per impostazione predefinita, il timeout di inattività per Application Load Balancer è di 60 secondi.

Se i parametri di CloudWatch sono abilitati, consulta Parametri CloudWatch per Application Load Balancer. Il parametro HTTPCode_ELB_5XX indica l'errore 504 che è stato originato dal bilanciatore del carico. Se non ci sono punti di dati di parametri HTTPCode_ELB_504_Count, gli errori 504 vengono restituiti dai server delle applicazioni, non dal bilanciatore del carico.

Controlla i valori massimi e medi per il parametro CloudWatch TargetResponseTime. Il valore di timeout può indicare il tempo trascorso dopo la ricezione della richiesta del bilanciatore del carico dalla destinazione.

Per risolvere questo problema:

Modificare il timeout di inattività per il bilanciatore del carico in modo che la richiesta HTTP venga completata entro il periodo di timeout di inattività.

-oppure-

Modifica la tua applicazione in modo che risponda più velocemente alla richiesta HTTP. Assicurati che l'applicazione non richieda più tempo per rispondere rispetto al timeout di inattività configurato.

(Facoltativo) Aggiungi i seguenti filtri personalizzati nei registri delle applicazioni dei server Web di back-end per determinare la causa dei tempi di risposta lenti:

Server Web Apache

a- Apache : %D in log format
b- Nginx: $request_time and $upstream_response_timein log format
c- IIS: “time-taken” in log format
d- Apache Tomcat Access logs: %D in log format

Assicurati che il tuo bilanciatore del carico consenta il traffico con le destinazioni registrate

Verifica che i gruppi di sicurezza di rete associati al bilanciatore del carico e alle destinazioni di back-end consentano il traffico reciproco in entrambe le direzioni sulle porte di controllo del traffico e dell'integrità. Assicurati che l'ACL di rete per la sottorete consenta il traffico dalle destinazioni ai nodi del bilanciatore del carico sulle porte effimere (1024-65535).

Nota: una best practice consiste nell'utilizzare le seguenti regole per i gruppi di sicurezza per l'Application Load Balancer.

Se esamini il parametro CloudWatch TargetConnectionErrorCount con la statistica della somma, è probabile che siano visualizzati punti dati positivi. Ad esempio, il numero di connessioni che non sono state stabilite correttamente tra il bilanciatore del carico e la destinazione.

Per maggiori informazioni, consulta Configurazione dell'impostazione del timeout di inattività per il bilanciatore del carico.

Assicurati che la tua funzione Lambda risponda prima del timeout di connessione

Se la tua destinazione è una funzione Lambda, controlla la durata del parametro delle prestazioni con le statistiche massime per verificare la quantità di tempo elaborata dall'evento. Per ulteriori informazioni, consulta Utilizzo dei parametri delle prestazioni.