在使用 CloudFormation 模板或 OpenAPI 定义创建集成了 Lambda 的 REST API 后,为什么我会从 API Gateway 收到“由于配置导致执行失败”错误?
我使用 AWS CloudFormation 模板(或OpenAPI 定义)创建了一个集成了 AWS Lambda 的 Amazon API Gateway REST API。当尝试使用 API 方法调用 Lambda 函数时,我收到以下错误消息和 500 状态代码:“由于配置错误,执行失败。” 导致错误的原因是什么?如何解决该问题?
简短描述
如果您拥有集成了 Lambda 的 API Gateway API,则该 API 必须使用 HTTP 方法 POST 调用后端 Lambda 函数。如果您对后端集成请求使用任何其他 HTTP 方法(例如,ANY 或 GET),则调用将失败。然后,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 方法:
- CloudFormation 模板
- OpenAPI 定义
- AWS Command Line Interface (AWS CLI)
- 软件开发工具包(SDK)
- Cloud Development Kit (CDK)
**注意:**如果您使用 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
通过控制台来更新方法
- 在 API Gateway 控制台中,选择您的 API。
- 在 Resources(资源)窗格中,选择具有 Lambda 集成的 HTTP 方法。
- 在 Method Execution(方法执行)窗格中,选择 Integration Request(集成请求)。
- 在“Integration Request”(集成请求)窗格中,对于 HTTP method(HTTP 方法),单击 Lambda 函数名称右侧的铅笔图标编辑 Lambda 函数名称,然后单击右侧显示的复选标记图标。
- 当系统提示您向 Lambda 函数添加权限时,选择 OK(确定)。
- 部署您的 API。
- (可选)测试具有 Lambda 集成的 HTTP 方法。
注意:每次在向 Lambda 函数添加权限提示符中选择“OK”(确定)时,控制台都会向 Lambda 函数的资源策略添加一条新语句。请注意函数的资源策略大小,以确保其未达到资源策略大小限制。请参阅:函数配置、部署和执行。
有关更多信息,请参阅 API Gateway 入门和使用 API Gateway 控制台设置 API 集成请求。
使用 AWS CLI 更新方法
- 运行 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定义导入的方法更新
- 将 API 定义文件中的 httpMethod 属性值设置为 POST。有关说明,请参阅 x-amazon-apigateway-integration 对象和 aws-samples GitHub 存储库上的 Swagger 模板示例。
- 通过将编辑后的 API 定义文件导入 API Gateway 来更新 API。请参阅导入 OpenAPI 文件以更新现有 API 定义。
相关信息
AWS::ApiGateway::Method Integration
教程:创建具有两个 AWS 服务集成和一个 Lambda 非代理集成的 Calc REST API
我使用阶段变量在 Amazon API Gateway 中定义了我的 Lambda 集成。为什么当我调用 API 方法时收到“内部服务器错误”和 500 状态代码?
如何解决 API Gateway REST API 的 HTTP 502“Malformed Lambda proxy response”错误?
我如何解决来自 API Gateway 的“Invalid mapping expression specified”错误?
相关内容
- AWS 官方已更新 2 个月前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前