发布于 2026-01-06 1 阅读
0

如何在不使用 Lambda 的情况下处理 AWS Step Functions 中的可选输入参数

如何在不使用 Lambda 的情况下处理 AWS Step Functions 中的可选输入参数

太长不看

如果您想对状态机中的输入对象应用数据处理,而又不想面对处理可选参数的难题,可以使用HandleOptionalParametersCDK 构造如下:

const transformInputValuesTo1ItemArraysTask = new HandleOptionalParameters(
  scope,
  "Handle optional parameters",
  {
      requiredProperties: ["requiredProperty"],
      optionalProperties: ["optionalProperty1", "optionalProperty2"],
      // Apply States.Array intrinsinc function on every input values:
      dataProcessing: "States.Array($.value)",
      // Other examples:

      // Encode every input values and return the object with same input keys but with encoded values:
      // dataProcessing: "States.Base64Encode($.value)",

      // Concatenate the value with the property name, with the JsonPath $.propertyName:
      // dataProcessing: "States.Format('Current key is {} and associated value is {}.', $.propertyName, $.value)",
  }
);

new StateMachine(
  scope,
  "State machine using HandleOptionalParameters construct",
  {
      definition: processObjectValuesTask,
  }
);
Enter fullscreen mode Exit fullscreen mode

🔴 背景:如果提供的 JsonPath 不存在,AWS Step Functions 将抛出异常。

AWS Step Functions 凭借其内置函数,允许您对状态机执行输入进行数据处理。

例如,假设你需要将输入对象的所有值放入一个数组中:转换输入

要使用 Amazon 状态语言将值转换为包含该值的 1 元素数组,可以使用以下States.Array()内置函数:

转换一个物品对象

要转换输入对象的每个值,您可以States.Array()对每个属性应用以下操作:

转换多项对象

但是,在处理对象输入时,必须确保要处理的每个属性都存在于输入中,否则执行将失败❌:

执行状态“将输入值转换为数组”(事件 ID #2)时发生错误。函数“States.Array($.optionalProperty)”出现以下错误:在输入中找不到字段“$.optionalProperty”的 JsonPath 参数。{ "requiredProperty": 1 }

事实上,如果foo确实未定义:

如果某些属性是可选的,则会失败

因此,您需要处理这些可选的输入参数。

🟠 选择:大输入情况下的虚假好主意

选择状态是 AWS Step Functions 的另一种常见流程状态,它允许您根据运行时评估的条件来决定状态机执行的分支。因此,您可以使用选择状态来评估输入中是否存在可选属性,并且States.Array()仅当输入中定义了该属性时才应用函数:

通过选择避免失败

但是,如果输入有很多可选值,你的阶跃函数可能会像这样😓:

Choices解决方案不具备可扩展性。

这会导致可扩展性问题:

  • 🧑‍💻 DX:正如您在执行图视图中看到的,在 AWS 控制台中调试非常痛苦。
  • 🛑 AWS 限制:就我而言,CloudFormation 模板的硬性大小限制为 1MB,包含 10 个可选属性时就会达到此限制。
  • 💸成本:在标准工作流程中,计费取决于状态转换次数,而状态转换次数与可选属性的数量成正比。
  • 🚀性能:选项操作未并行处理,因此可选属性越多,速度越慢。

因此,您需要处理可选参数的可扩展性问题。

🟢 让HandleOptionalParametersCDK 构造函数为您处理可选参数

CDKHandleOptionalParameters构造会使用您提供的任何数据处理方式处理每个已定义的值,同时忽略未定义的值。而且,无论可选参数的数量多少,它都只需 9 个常见的流程任务即可完成 🎉:

以可扩展的方式处理可选参数

让我们来详细分析一下:

CDK 结构解释

结论

从现在开始,不要再用 Lambda 函数处理带有大量可选参数的大型状态机输入了!😉

文章来源:https://dev.to/slsbytheodo/handle-optional-input-parameters-in-aws-step-functions-without-lambda-424m