跳至内容

我使用 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 Gateway 控制台配置 Lambda 集成,则后端集成请求将自动设置为 POST

解决方法

**注意:**如果您在运行 AWS CLI 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

最佳做法是通过 AWS CloudFormation 管理所有堆栈资源,而不是在 CloudFormation 之外进行堆栈资源更改。

用于将后端集成请求的 HTTP 方法更改为 POST 的方法取决于原始模板定义。更新由 CloudFormation 部署的 API Gateway 的过程与更新由 OpenAPI 创建的 API Gateway 的过程不同。

在 CloudFormation 中创建的 API Gateway

对于 CloudFormation 创建的 API Gateway,必须更新堆栈模板。如果您在 CloudFormation 模板中定义了 AWS::ApiGateway::Method 资源来创建方法,请将 HttpMethod 属性更新为 POST。有关说明,请参阅示例

如果您的方法针对 AWS::ApiGateway::RestAPI 资源的 Body 属性使用了 OpenAPI 定义,请将 API 定义文件中的 httpMethod 设置为 POST。有关说明,请参阅 x-amazon-apigateway-integration 对象。此外,请参阅 aws-samples GitHub 存储库上的 example Swagger template(Swagger 模板示例)

要更新您的 API,请使用编辑后的模板运行 AWS CloudFormation 堆栈更新

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

    "httpMethod" : "POST"

在 CloudFormation 之外创建的 API Gateway

使用控制台更新方法

完成以下步骤:

  1. 打开 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。有关说明,请参阅 x-amazon-apigateway-integration 对象以及 aws-samples GitHub 存储库上的 example Swagger template(Swagger 模板示例)
  2. 要更新您的 API,请将编辑后的 API 定义文件导入 API Gateway。请参阅导入 OpenAPI 文件以更新现有 API 定义

相关信息

AWS::ApiGateway::Method Integration(AWS::ApiGateway::Method 集成)

教程: 创建包含两种 AWS 服务集成和一种 Lambda 非代理集成的计算器 REST API

我使用阶段变量在 API Gateway 中定义了我的 Lambda 集成。为什么我在调用 API 方法时收到“Internal server error”和 500 状态代码?

如何解决具有 Lambda 代理集成的 API Gateway REST API 中的 HTTP 502 错误?

如何解决来自 API Gateway 的“Invalid mapping expression specified”错误?