在使用 CloudFormation 模板或 OpenAPI 定义创建集成了 Lambda 的 REST API 后,为什么我会从 API Gateway 收到“由于配置导致执行失败”错误?

上次更新日期:2022 年 5 月 4 日

我使用 AWS CloudFormation 模板(或OpenAPI 定义)创建了一个集成了 AWS Lambda 的 Amazon API Gateway REST API。当尝试使用 API 方法调用 Lambda 函数时,我收到以下错误消息和 500 状态代码:“由于配置错误,执行失败。” 导致错误的原因是什么?如何解决该问题?

简短描述

如果您拥有集成了 Lambda 的 API Gateway API,则该 API 必须使用 HTTP 方法 POST 调用后端 Lambda 函数。如果您对后端集成请求使用任何其他 HTTP 方法(例如,ANYGET),则调用将失败。然后,API Gateway 会在您的 Amazon CloudWatch Logs 中返回类似于以下示例的错误消息:

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

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

如果您使用以下任何方法创建集成了 Lambda 的 REST API,则必须为后端集成请求指定 POST 方法:

注意:如果您使用 API Gateway 控制台配置 Lambda 集成,则后端集成请求会自动设置为 POST

解决方法

CloudFormation 的最佳实践是通过 AWS CloudFormation 管理所有堆栈资源,而非在 CloudFormation 之外更改堆栈资源。

使用何种方法将 HTTP 更改为后端集成请求的 POST 取决于原始模板定义。例如,更新使用 CloudFormation 部署的 API 网关与使用 OpenAPI 或 AWS CLI 创建的 API 网关的过程并不相同。

对于使用 CloudFormation 创建的 API 网关,将集成的请求方法更改为 POST

有关说明,请参阅修改堆栈模板

A.如果你的方法是通过在 CloudFormation 模板中定义 AWS::ApiGateway::Method 资源创建的,请将 HttpMethod 属性更新为 POST。有关说明,请参阅 AWS::ApiGateway::Method 文档的示例部分。

B.如果你的方法包含 OpenAPI 定义作为 AWS::ApiGateway::RestAPI 资源的 Body 属性的值:将 API 定义文件中的 httpMethod 属性值设置为 POST。  有关说明,请参阅 x-amazon-apigateway-integration 对象和 aws-samples GitHub 存储库上的 Swagger 模板示例

通过使用编辑过的模板运行 AWS CloudFormation 堆栈更新来更新您的 API:

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

    "httpMethod" : "POST"

对于在 CloudFormation 之外创建的 API 网关,将后端集成的 HTTP 方法更改为 POST

通过控制台来更新方法

  1. API Gateway 控制台中,选择您的 API。
  2. Resources(资源)窗格中,选择具有 Lambda 集成的 HTTP 方法。
  3. Method Execution(方法执行)窗格中,选择 Integration Request(集成请求)。
  4. 在“Integration Request”(集成请求)窗格中,对于 HTTP method(HTTP 方法),单击 Lambda 函数名称右侧的铅笔图标编辑 Lambda 函数名称,然后单击右侧显示的复选标记图标。
  5. 当系统提示您向 Lambda 函数添加权限时,选择 OK(确定)。
  6. 部署您的 API
  7. (可选)测试具有 Lambda 集成的 HTTP 方法

注意:每次在向 Lambda 函数添加权限提示符中选择“OK”(确定)时,控制台都会向 Lambda 函数的资源策略添加一条新语句。请注意函数的资源策略大小,以确保其未达到资源策略大小限制。请参阅:函数配置、部署和执行

有关更多信息,请参阅 API Gateway 入门使用 API Gateway 控制台设置 API 集成请求

使用 AWS CLI 更新方法

  1. 运行 put-integration 方法将集成 http 方法更新为 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

2.将为 API 配置的资源部署到现有阶段:

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

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

使用OpenAPI定义导入的方法更新

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