首页 > 解决方案 > 从 API Gateway 调用 AWS Step Function 同步 Express Workflow 并从响应输出中消除状态机详细信息

问题描述

我一直在搞乱步进函数,并找到了一个很好的解决方案来编排使用新的同步快速工作流从 API 网关调用的 lambda,但遇到了一个问题,我无法调整输出上的外部 json。我可以使用 ResultPath 和 OutputPath 修改 json 响应的“输出”节点中的所有内容,但其他所有内容都会保留并发送回用户(不需要的信息,如 BillingDetails)。

我必须使用 HTTP API 网关,因为它是唯一可以同步调用步骤函数的网关,并且您不能在那里转换响应,所以我正在寻找是否有任何方法可以转换此响应而无需创建一些额外的在 Step Function 之上的层,这会破坏首先使用它们的整个目的。

如何让 Step Function 仅返回“输出”json 节点并过滤掉其他所有内容?

Step 函数定义如下所示:

{
  "Comment": "Simple Lambda Function",
  "StartAt": "Invoke Lambda function",
  "States": {
    "Invoke Lambda function": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "ResultPath": "$",
      "OutputPath": "$.Payload",
      "Parameters": {
        "FunctionName": "LAMBDA ARN",
        "Payload": {
          "input.$": "$"
        }
      },
      "End": true
    }
  }
}

该状态机通过 API 网关的输出产生以下内容:

{
    "billingDetails": {
        "billedDurationInMilliseconds": 500,
        "billedMemoryUsedInMB": 64
    },
    "executionArn": "ARN",
    "input": "{\r\n        \"sendToQueue\": \"true\",\r\n        \"retryNumber\": 1,\r\n        \"uploadFile\": \"testS3file\"\r\n    }",
    "inputDetails": {
        "__type": "com.amazonaws.swf.base.model#CloudWatchEventsExecutionDataDetails",
        "included": true
    },
    "name": "name",
    "output": "{\"statusCode\":200,\"body\":\"{\\\"input\\\": {\\\"sendToQueue\\\": \\\"true\\\", \\\"retryNumber\\\": 1, \\\"uploadFile\\\": \\\"testS3file\\\"}}\"}",
    "outputDetails": {
        "__type": "com.amazonaws.swf.base.model#CloudWatchEventsExecutionDataDetails",
        "included": true
    },
    "startDate": 1.618947563121E9,
    "stateMachineArn": "ARN",
    "status": "SUCCEEDED",
    "stopDate": 1.618947563572E9
}

标签: amazon-web-servicesaws-api-gatewayaws-step-functions

解决方案


我有同样的问题,并询问了一些内部 AWS 人员,他们说此时无法更改输出。

就像您建议的那样,解决方法是 API Gateway -> Lambda -> Step Function 而不是 API Gateway -> Step Function。


推荐阅读