使用同步 StepFunctions 处理 API Gateway 中的错误

Ant*_*chd 1 amazon-web-services aws-api-gateway openapi aws-step-functions

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

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

这是代码:

Step 函数定义为无服务器

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"
Run Code Online (Sandbox Code Playgroud)

这是我的 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
Run Code Online (Sandbox Code Playgroud)

使用此配置,我总是传递 200 statusCode 情况。但由于我的代码抛出错误,因此我的主体响应出现错误。

我错过了什么?

Col*_*n B 5

快速扫描您的代码后,我认为您错过了两件事。

首先,在step函数中,您的错误状态是“Fail”类型,这意味着step函数停止并且没有任何内容返回到API网关,因此它所能做的就是报告200(或在open中设置的默认状态代码) API 定义)。

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

因此,您的后备状态应该是“Pass”类型并输出错误信息,包括状态代码。

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

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