Perché ricevo gli errori "Execution failed due to configuration" da API Gateway dopo aver utilizzato un modello CloudFormation o una definizione OpenAPI per creare una REST API con un'integrazione Lambda?

5 minuti di lettura
0

Ho usato un modello AWS CloudFormation (o definizione OpenAPI) per creare una REST API di Gateway Amazon API con integrazione con AWS Lambda. Quando provo a richiamare la mia funzione Lambda utilizzando il metodo API, ricevo il seguente messaggio di errore e un codice di stato 500: "Execution failed due to configuration error." Qual è la causa dell'errore e come posso risolvere il problema?

Breve descrizione

Se disponi di una REST API di API Gateway con integrazione Lambda, l'API deve richiamare la funzione Lambda di backend utilizzando il metodo HTTP POST. Se utilizzi un altro metodo HTTP (ad esempio, ANY o GET) per la richiesta di integrazione del backend, la chiamata dà esito negativo. API Gateway restituisce quindi un messaggio di errore simile al seguente esempio nei log Amazon CloudWatch:

Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 ms
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response headers: {Date=Mon, 14 Oct 2019 14:08:49 GMT, Content-Length=130, Connection=keep-alive, x-amzn-RequestId=abc1d2ef-34ab-56c7-de8f-90123a456789}
Mon Oct 14 14:08:49 UTC 2019 : Endpoint response body before transformations: <AccessDeniedException>
<Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>
Mon Oct 14 14:08:49 UTC 2019 : Lambda invocation failed with status: 403. Lambda request id: abc1d2ef-34ab-56c7-de8f-90123a456789
Mon Oct 14 14:08:49 UTC 2019 : Execution failed due to configuration error:
Mon Oct 14 14:08:49 UTC 2019 : Method completed with status: 500

**Nota:**puoi comunque configurare qualsiasi metodo HTTP per il frontend della tua REST API.

È necessario specificare il metodo POST per la richiesta di integrazione del backend se si crea una REST API con integrazione Lambda utilizzando uno dei seguenti:

**Nota:**se si utilizza la console API Gateway per configurare un'integrazione Lambda, la richiesta di integrazione del backend viene impostata automaticamente su POST.

Risoluzione

La best practice di CloudFormation consiste nel gestire tutte le risorse dello stack tramite AWS CloudFormation e non apportare modifiche alle risorse dello stack all'esterno di CloudFormation.

Il metodo utilizzato per modificare il metodo HTTP in POST per la richiesta di integrazione del backend dipende dalla definizione del modello originale. Ad esempio, il processo è diverso per aggiornare un API Gateway distribuito utilizzando CloudFormation rispetto a un API Gateway creato con OpenAPI o AWS CLI.

Per modificare il metodo di richiesta dell'integrazione in POST per i gateway API creati utilizzando CloudFormation

Per istruzioni, consulta Modifica di un modello di stack.

A. Se il tuo metodo è stato creato definendo la risorsa AWS::ApiGateway::Method nel tuo modello CloudFormation, aggiorna la proprietà HttpMethod su POST. Per istruzioni, consulta la sezione Esempi della documentazione di AWS::ApiGateway::Method.

B. Se il tuo metodo includeva una definizione OpenAPI come valore della proprietà Body della risorsa AWS::ApiGateway::RestAPI: Imposta il valore della proprietà httpMethod nel tuo file di definizione API su POST.  Per istruzioni, consulta x-amazon-apigateway-integration object e il modello Swagger di esempio nel repository GitHub aws-samples.

Aggiorna la tua API eseguendo gli aggiornamenti dello stack di AWS CloudFormation con il modello modificato:

"x-amazon-apigateway-integration" : {
    "type" : "aws",

    "httpMethod" : "POST"

Per modificare il metodo HTTP dell'integrazione backend in POST per gateway API creati all'esterno di CloudFormation

Metodo di aggiornamento tramite la console

  1. Nella console API Gateway, scegli la tua API.
  2. Nel riquadro Risorse, scegli il metodo HTTP con l'integrazione Lambda.
  3. Nel riquadro Esecuzione del metodo, scegli Richiesta di integrazione.
  4. Nel riquadro Richiesta di integrazione, per il metodo HTTP, modifica il nome della funzione Lambda facendo clic sull'icona a forma di matita a destra del nome della funzione, quindi fai clic sull'icona del segno di spunta che appare a destra.
  5. Quando viene richiesto di aggiungere l'autorizzazione alla funzione Lambda, scegli OK.
  6. Distribuisci l’API.
  7. (Facoltativo) Prova il metodo HTTP che dispone dell'integrazione con Lambda.

Nota: la console aggiunge una nuova istruzione alla policy delle risorse della funzione Lambda ogni volta che si seleziona OK nel prompt Aggiungi autorizzazione alla funzione Lambda. Prendi nota della dimensione della policy delle risorse della tua funzione per assicurarti che non raggiunga il relativo limite di dimensione. Consulta: Configurazione, distribuzione ed esecuzione della funzione.

Per ulteriori informazioni, consulta Guida introduttiva ad API Gateway e Configurazione di una richiesta di integrazione API tramite la console API Gateway.

Aggiorna il metodo utilizzando AWS CLI

  1. Esegui il metodo put-integration per aggiornare il metodo http di integrazione a POST:
aws apigateway put-integration \
--rest-api-id 1234123412 \
--resource-id a1b2c3 \
--http-method ANY \
--type AWS \
--integration-http-method POST \
--uri 'arn:aws:apigateway:us-west-2:lambda:path//2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:function_name/invocations
  1. Distribuisci le risorse configurate per un'API in una fase esistente:
aws apigateway create-deployment \
--rest-api-id 1234123412 \
--stage-name dev \
--description 'Deployment to an existing dev stage'

Nota: se ricevi errori durante l'esecuzione dei comandi di AWS CLI, assicurati di utilizzare la versione più recente di AWS CLI.

Aggiorna il metodo utilizzando l'importazione delle definizioni OpenAPI

  1. Imposta il valore della proprietà httpMethod nel tuo file di definizione API su POST. Per istruzioni, consulta x-amazon-apigateway-integration object e il modello Swagger di esempio nel repository GitHub aws-samples.
  2. Aggiorna la tua API importando il file di definizione dell'API modificato in API Gateway. Consulta Importazione di un file OpenAPI per aggiornare una definizione API esistente.

Informazioni correlate

AWS::ApiGateway::Method Integration

TUTORIAL: Crea una REST API di Calc con due integrazioni di servizi AWS e un'integrazione Lambda non proxy

Ho definito la mia integrazione Lambda nel Gateway Amazon API utilizzando una variabile di fase. Perché ricevo un "Errore interno del server" e un codice di stato 500 quando richiamo il metodo API?

Come posso risolvere gli errori HTTP 502 "Malformed Lambda proxy response" dalle REST API di API Gateway?

Come posso risolvere gli errori "Invalid mapping expression specified" da API Gateway?