使用同步步骤函数处理API网关错误



我正在处理一个具有以下工作流程的项目:API网关(使用开放API定义)触发AWS的Step函数。有两个步骤,如果出现错误,在状态机定义中有一个catch块。

但是我面临一个错误处理的问题。即使我的代码抛出错误(例如400),我的Postman(或其他REST API测试工具)也会返回200。我想要一个500/400…

代码如下:

步骤函数定义为无服务器

stepFunctions:
stateMachines:
PostPayment:
name: testfunction
type: EXPRESS
definition:
Comment: 'test'
StartAt: Function1
States:
Function1:
Type: Task
Resource: !GetAtt Function1.Arn
Catch:
- ErrorEquals: ['HandledError']
Next: Fallback
Next: Function2
Function2:
Type: Task
Resource: !GetAtt Function2.Arn
Catch:
- ErrorEquals: ['HandledError']
Next: Fallback
End: true
Fallback:
Type: Fail
Cause: "Error occured",
Error: "Error"

这是我的openapi yml

x-amazon-apigateway-request-validator: all
x-amazon-apigateway-integration:
requestParameters:
integration.request.path.id: method.request.path.id
requestTemplates:
application/json:
Fn::Sub: |-
{
"input": "{"id": "$input.params().path.get('id')"}",
"stateMachineArn": "<ARN>"
}
httpMethod: POST
type: aws
credentials: !GetAtt ApiGatewayExecutionRole.Arn
uri: !GetAtt StartSyncExecution.Arn
responses:
"200":
statusCode: 200
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).output).body
"401":
statusCode: 401
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).cause).errorMessage
"400":
statusCode: 400
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).cause).errorMessage
"404":
statusCode: 404
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).cause).errorMessage
"500":
statusCode: 500
responseTemplates:
application/json: $util.parseJson($util.parseJson($input.body).cause).errorMessage

在这个配置中,我总是传入200 statusCode。但是我有一个错误作为正文响应,因为我的代码抛出了一个错误。

我错过什么了吗?

快速浏览你的代码后,我认为你遗漏了两件事。

首先,在阶跃函数中,您的错误状态类型为&;fail &;这意味着步进函数停止并且不返回任何东西给API网关,因此它所能做的就是报告200(或开放API定义中设置的默认状态码)。

要将非标准状态代码返回给客户端,您必须从步骤函数返回一些内容,然后在API网关中使用数据转换来覆盖状态函数。

所以你的回退状态应该是"Pass"并输出错误信息,包括状态码。

然后在网关中检测状态码,并使用它来使用速度模板覆盖响应状态码。

请看https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-override-request-response-parameters.html的例子。

最新更新