我使用 AWS CloudFormation 或 OpenAPI (Swagger) 创建了一个集成了 Lambda 的 API Gateway API。尝试调用 API 方法时,为什么会显示“Execution failed due to configuration”(由于配置而导致执行失败)通用的错误消息和 500 状态代码?

上次更新时间:2019 年 10 月 16 日

我使用 AWS CloudFormation 模板OpenAPI (Swagger) 定义创建了一个集成了 AWS Lambda 的 Amazon API Gateway API。当我尝试调用 API 方法时,我的函数无法调用,并且出现通用的“Execution failed due to configuration error:”消息和 500 状态代码。为什么会出现此错误?

简要描述

当您拥有集成了 Lambda 的 API Gateway API 时,API 必须使用 HTTP 方法 POST 调用后端 Lambda 函数。如果您对后端集成请求使用任何其他 HTTP 方法(例如 ANY 或 GET),则调用将失败,并且您会在日志中看到类似以下内容的错误消息:

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

注意:您仍然可以为 API 的前端设置任何 HTTP 方法

使用 API Gateway 控制台配置 Lambda 集成时,它会为您将后端请求设置为 POST。但是,在使用 CloudFormation 模板、OpenAPI 定义或 AWS 命令行界面 (AWS CLI) 创建集成了 Lambda 的 API 时,则必须自己指定 POST 方法。

解决方法

通过执行以下任一操作,将后端集成请求的 HTTP 方法更改为 POST:

使用 API Gateway 控制台

  1. API Gateway 控制台中,选择您的 API。
  2. 资源窗格中,选择 Lambda 集成的 HTTP 方法。
  3. 方法执行窗格中,选择集成请求
  4. 集成请求窗格中,对于 HTTP 方法,选择 POST,然后选择复选标记图标 (Update)。
  5. 部署您的 API
  6. (可选)测试 Lambda 集成的 HTTP 方法

有关更多信息,请参阅在 Amazon API Gateway 中创建集成了 Lambda 的 REST API使用 API Gateway 控制台设置 API 集成请求

更新 AWS CloudFormation 模板

如果您使用 CloudFormation 模板创建 API,请执行以下操作:

  1. 更新模板,将 IntegrationHttpMethod 属性值设置为 POST
  2. 使用该模板更新 AWS CloudFormation 堆栈。此操作会更新您的 API。

更新您的 OpenAPI 定义

如果您使用 OpenAPI 定义创建 API,请执行以下操作:

  1. 更新 API 定义,将 httpMethod 属性值设置为 POST。有关更多信息,请参阅 x-amazon-apigateway-integration 对象和 aws-samples GitHub 存储库上的 Swagger 模板示例
  2. 通过将更新后的 API 定义文件导入 API Gateway 来更新 API。