Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Ho utilizzato un modello CloudFormation o una definizione OpenAPI per creare una REST API con integrazione Lambda. Perché ricevo errori "Execution failed" da Gateway API?
Ho utilizzato un modello AWS CloudFormation per creare una REST API di Gateway Amazon API con integrazione AWS Lambda. Quando utilizzo il metodo API per invocare la mia funzione Lambda, ricevo un messaggio di errore e un codice di stato 500.
Breve descrizione
Se hai una REST API di Gateway API con integrazione Lambda, l'API deve utilizzare il metodo POST HTTP per invocate la funzione Lambda di backend. Se utilizzi un altro metodo HTTP per la richiesta di integrazione del backend, ad esempio ANY o GET, l'invocazione ha esito negativo. Gateway API restituisce quindi un messaggio di errore simile al seguente esempio in Amazon CloudWatch Logs:
Mon Oct 14 14:08:49 UTC 2019 : Received response. Status: 403, Integration latency: 3 msMon 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 REST API.
Se crei una REST API con integrazione Lambda, utilizza uno dei seguenti metodi per specificare POST per la richiesta di integrazione del backend:
- Modello CloudFormation
- Definizione OpenAPI
- Interfaccia della linea di comando AWS (AWS CLI)
- SDK
- Cloud Development Kit (CDK)
Nota: se utilizzi la console Gateway API per configurare un'integrazione Lambda, la richiesta di integrazione del backend viene impostata automaticamente su POST.
Risoluzione
Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori relativi ad AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.
È consigliabile gestire tutte le risorse dello stack tramite AWS CloudFormation e non apportare modifiche alle risorse dello stack al di fuori di CloudFormation.
La strada da utilizzare per modificare il metodo HTTP in POST per la richiesta di integrazione del backend dipende dalla definizione del modello originale. Il processo di aggiornamento di un Gateway API distribuito da CloudFormation è diverso dal processo di aggiornamento di un Gateway API creato da OpenAPI.
Gateway API creati in CloudFormation
Per i Gateway API creati da CloudFormation, devi aggiornare il modello di stack. Se hai definito la risorsa AWS::ApiGateway::Method nel modello CloudFormation per creare il metodo, aggiorna la proprietà HttpMethod impostandola su POST. Per istruzioni, consulta Esempi.
Se il metodo utilizza una definizione OpenAPI per la proprietà Body della risorsa AWS::ApiGateway::RestAPI, imposta httpMethod nel file di definizione dell'API su POST. Per istruzioni, consulta l'oggetto x-amazon-apigateway-integration. Inoltre, consulta l'esempio di modello Swagger nel repository GitHub aws-samples.
Aggiorna l'API eseguendo gli aggiornamenti dello stack di AWS CloudFormation con il modello modificato:
"x-amazon-apigateway-integration" : { "type" : "aws", "httpMethod" : "POST"
Gateway API creati al di fuori di CloudFormation
Utilizza la console per aggiornare il metodo
Completa i seguenti passaggi:
- Apri la console Gateway API.
- Scegli l'API.
- In Risorse, scegli il metodo HTTP integrato con Lambda.
- In Esecuzione metodo, scegli Richiesta di integrazione.
- In Richiesta di integrazione, per Metodo HTTP, modifica il nome della funzione Lambda.
- Quando compare il prompt Aggiungi autorizzazione alla Funzione Lambda, scegli OK.
- Distribuisci l’API.
- (Facoltativo) Prova il metodo HTTP integrato con Lambda.
Nota: ogni volta che selezioni OK in risposta al prompt Aggiungi autorizzazione alla Funzione Lambda, la console aggiunge una nuova istruzione alla policy delle risorse della funzione Lambda. Assicurati di non superare il limite di dimensione della policy delle risorse. Per ulteriori informazioni, consulta Configurazione, implementazione ed esecuzione della funzione e Configurazione di una richiesta di integrazione API tramite la console Gateway API.
Utilizza AWS CLI per aggiornare il metodo
Completa i seguenti passaggi:
-
Per aggiornare il metodo HTTP di integrazione impostandolo su POST, esegui il comando put-integration:
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 -
Per distribuire le risorse configurate per un'API in una fase esistente, esegui il comando create-deployment:
aws apigateway create-deployment \--rest-api-id 1234123412 \ --stage-name dev \ --description 'Deployment to an existing dev stage'
Utilizza un'importazione di definizioni OpenAPI per aggiornare il metodo
Completa i seguenti passaggi:
- Nel file di definizione dell'API, imposta il valore della proprietà httpMethod su POST. Per istruzioni, consulta Oggetto x-amazon-apigateway-integration e l'esempio di modello Swagger nel repository GitHub aws-samples.
- Aggiorna l'API importando il file di definizione dell'API modificato in Gateway API. Consulta Importazione di un file OpenAPI per aggiornare una definizione API esistente.
Informazioni correlate
AWS::ApiGateway::Method Integration (Integrazione AWS::ApiGateway::Method)
Come posso risolvere gli errori "Invalid mapping expression specified" da Gateway API?
- Lingua
- Italiano
