我使用 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 控制台
- 在 API Gateway 控制台中,选择您的 API。
- 在资源窗格中,选择 Lambda 集成的 HTTP 方法。
- 在方法执行窗格中,选择集成请求。
- 在集成请求窗格中,对于 HTTP 方法,选择 POST,然后选择复选标记图标 (Update)。
- 部署您的 API。
- (可选)测试 Lambda 集成的 HTTP 方法。
有关更多信息,请参阅在 Amazon API Gateway 中创建集成了 Lambda 的 REST API 和使用 API Gateway 控制台设置 API 集成请求。
更新 AWS CloudFormation 模板
如果您使用 CloudFormation 模板创建 API,请执行以下操作:
- 更新模板,将 IntegrationHttpMethod 属性值设置为 POST。
- 使用该模板更新 AWS CloudFormation 堆栈。此操作会更新您的 API。
更新您的 OpenAPI 定义
如果您使用 OpenAPI 定义创建 API,请执行以下操作:
- 更新 API 定义,将 httpMethod 属性值设置为 POST。有关更多信息,请参阅 x-amazon-apigateway-integration 对象和 aws-samples GitHub 存储库上的 Swagger 模板示例。
- 通过将更新后的 API 定义文件导入 API Gateway 来更新 API。