Come posso risolvere gli errori HTTP 502 generati dalle REST API di Gateway API con l'integrazione proxy Lambda?

4 minuti di lettura
0

Ho configurato l'integrazione proxy Gateway Amazon API affinché funzioni con una funzione AWS Lambda. Quando richiamo la mia REST API, ricevo un errore di configurazione e un codice di stato HTTP 502. Come posso risolvere il problema?

Breve descrizione

Se le autorizzazioni della funzione Lambda non sono corrette o la risposta alla richiesta API non è formattata correttamente, Gateway API restituirà un codice di stato HTTP 502.

Esempio di messaggi di errore HTTP 502 visualizzati in Amazon CloudWatch Logs

Wed Aug 03 08:10:00 UTC 2022 : Execution failed due to configuration error:
WE Aug 03 09:10:00 UTC 2022 : Method completed with status: 502

-oppure-

Wed Aug 03 08:20:33 UTC 2022 : Lambda execution failed with status 200 due to customer function error: [Errno 13] Permission denied: '/var/task/lambda_function.py'. Lambda request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Wed Aug 03 08:20:33 UTC 2022 : Method completed with status: 502

Affinché Gateway API gestisca una risposta della funzione Lambda, la funzione deve restituire l'output secondo il seguente formato JSON:

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

Per ulteriori informazioni, consulta la sezione Output format of a Lambda function for proxy integration.

Risoluzione

1.    Controlla i parametri CloudWatch della REST API servendoti del pannello di controllo delle API in Gateway API.
-oppure-
Controlla gli eventi dei log della tua REST API nella console Amazon CloudWatch.

2.    Nei log, controlla il formato della risposta della funzione Lambda alla tua API. Se la risposta non è nel formato JSON richiesto, riformattala.

3.    Verifica che la policy delle risorse della funzione Lambda consenta l'accesso per richiamare la funzione con Gateway API.

4. Se l'esecuzione della funzione Lambda non va a buon fine a causa di un problema di autorizzazione del pacchetto, verifica le autorizzazioni. Per ulteriori informazioni, consulta la sezione Come posso risolvere gli errori "permission denied" o "unable to import module" durante il caricamento di un pacchetto di implementazione Lambda?

5.    Verifica che il nome e la configurazione del gestore della funzione Lambda siano validi.

6.    Se l'esecuzione della funzione Lambda fallisce durante il runtime, controlla i log della funzione Lambda e aggiorna il codice.

7.    Dopo aver apportato le modifiche, puoi testare il tuo metodo REST API nella console Gateway API.

Esempio di funzione Lambda Node.js con risposta formattata in modo corretto

Nota: le funzioni Lambda Node.js supportano gestori asincroni e gestori non asincroni. La seguente funzione di esempio utilizza un gestore asincrono.

exports.handler = async (event) => {

    const responseBody = {
        "key3": "value3",
        "key2": "value2",
        "key1": "value1"
    };

    const response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };

    return response;
};

In questo esempio di risposta, ci sono quattro campi:

  • statusCode è un numero intero interpretato da Gateway API, che viene restituito al chiamante del metodo API.
  • il valore headers viene raccolto e poi rispedito con la risposta di Gateway API.
  • il valore body deve essere convertito in una stringa se stai restituendo i dati in formato JSON.
    Nota: puoi usare JSON.stringify per gestirlo nelle funzioni Node.js. Altri runtime richiedono soluzioni diverse, ma il concetto è lo stesso.
  • isBase64Encoded è un campo obbligatorio se stai lavorando con dati binari. Se non utilizzi questo campo, è consigliabile impostare il valore su FALSE.

Informazioni correlate

Configurazione della registrazione dei log di CloudWatch per una REST API su API Gateway

Monitoraggio dell'esecuzione delle API REST con i parametri di Amazon CloudWatch