Skip to content

我使用 CloudFormation 範本或 OpenAPI 定義來建立具有 Lambda 整合的 REST API。為什麼我會收到來自 API Gateway 的 "Execution failed" (執行失敗) 錯誤?

3 分的閱讀內容
0

我使用 AWS CloudFormation 範本建立了具有 AWS Lambda 整合的 Amazon API Gateway REST API。當我使用 API 方法調用 Lambda 函式時,出現錯誤訊息和 500 狀態碼。

簡短描述

如果您擁有具有 Lambda 整合的 API Gateway REST API,則該 API 必須使用 POST HTTP 方法調用後端 Lambda 函式。如果您使用任何其他 HTTP 方法 (例如 ANYGET) 進行後端整合請求,則調用將會失敗。然後,API Gateway 會在 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

**注意:**您仍然可以為 REST API 前端設定任何 HTTP 方法

如果您建立具有 Lambda 整合的 REST API,請使用下列其中一種方法為後端整合請求指定 POST:

**注意:**如果您使用 API 閘道主控台設定 Lambda 整合,則後端整合請求會自動設定為 POST

解決方法

**注意:**如果您在執行 AWS CLI 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

最佳做法是透過 AWS CloudFormation 管理所有堆疊資源,並且不要在 CloudFormation 之外變更堆疊資源。

用來將 HTTP 方法變更為後端整合請求的 POST 取決於原始範本定義。更新由 CloudFormation 部署的 API 閘道的流程,與更新由 OpenAPI 建立的 API 閘道的流程不同。

在 CloudFormation 中建立的 API 閘道

對於 CloudFormation 建立的 API 閘道,您必須更新堆疊範本。如果您在 CloudFormation 範本中定義了 AWS::ApiGateway::Method 資源來建立方法,則請將 HttpMethod 屬性更新為 POST。如需說明,請參閱範例

如果您的方法在 AWS::ApiGateway::RestAPI 資源的 Body 屬性中使用 OpenAPI 定義,請將 API 定義檔中的 httpMethod 設定為 POST。如需說明,請參閱 x-amazon-apigateway-integration 物件。另請參閱 aws-samples GitHub 儲存庫中的範例 Swagger 範本

若要更新您的 API,請使用已編輯的範本執行 AWS CloudFormation 堆疊更新

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

    "httpMethod" : "POST"

在 CloudFormation 之外建立的 API 閘道

使用主控台更新方法

請完成下列步驟:

  1. 開啟 API Gateway console (API Gateway 主控台)。
  2. 選擇您的 API。
  3. Resources (資源) 中,選擇與 Lambda 整合的 HTTP 方法。
  4. Method Execution (方法執行) 中,選擇 Integration Request(整合請求)。
  5. Integration Request (整合請求) 中,於 HTTP method (HTTP 方法) 編輯 Lambda 函式名稱。
  6. 當系統提示 Add Permission to Lambda Function (向 Lambda 函式新增權限) 時,選擇 OK (確定)。
  7. 部署您的 API
  8. (選用) 測試與 Lambda 整合的 HTTP 方法

**注意:**每次在 Add Permission to Lambda Function (為 Lambda 函式新增權限) 提示中選取 OK (確定) 時,主控台都會在 Lambda 函式的資源政策中新增一個陳述式。確認沒有超出資源政策大小限制。如需詳細資訊,請參閱函式組態、部署和執行使用 API Gateway 主控台設定 API 整合請求

使用 AWS CLI 更新方法

請完成下列步驟:

  1. 若要將整合 HTTP 方法更新為 POST,請執行 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
  2. 若要將 API 的已設定資源部署到現有階段,請執行 create-deployment 命令:

    aws apigateway create-deployment \--rest-api-id 1234123412 \
    --stage-name dev \
    --description 'Deployment to an existing dev stage'

使用 OpenAPI 定義匯入來更新方法

請完成下列步驟:

  1. 在您的 API 定義檔中,將 httpMethod 屬性值設為 POST。如需說明,請參閱 aws-samples GitHub 儲存庫中的 x-amazon-apigateway-integration 物件範例 Swagger 範本
  2. 若要更新您的 API,請將編輯後的 API 定義檔匯入 API 閘道。請參閱匯入 OpenAPI 檔案以更新現有的 API 定義

相關資訊

AWS::ApiGateway::Method 整合

教學課程: 建立一個包含兩個 AWS 服務整合和一個 Lambda 非 Proxy 整合的計算器 REST API

我使用階段變數在 API Gateway 中定義了 Lambda 整合。為什麼在我調用 API 方法時,會收到「內部伺服器錯誤」和 500 狀態碼?

如何使用 Lambda 代理程式整合解決 API Gateway REST API 的 HTTP 502 錯誤?

如何解決 API Gateway 的 "Invalid mapping expression specified" (指定的對應表達式無效) 錯誤?