如何在不使用 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,
}
);
🔴 背景:如果提供的 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()仅当输入中定义了该属性时才应用函数:
但是,如果输入有很多可选值,你的阶跃函数可能会像这样😓:
这会导致可扩展性问题:
- 🧑💻 DX:正如您在执行图视图中看到的,在 AWS 控制台中调试非常痛苦。
- 🛑 AWS 限制:就我而言,CloudFormation 模板的硬性大小限制为 1MB,包含 10 个可选属性时就会达到此限制。
- 💸成本:在标准工作流程中,计费取决于状态转换次数,而状态转换次数与可选属性的数量成正比。
- 🚀性能:选项操作未并行处理,因此可选属性越多,速度越慢。
因此,您需要处理可选参数的可扩展性问题。
🟢 让HandleOptionalParametersCDK 构造函数为您处理可选参数
CDKHandleOptionalParameters构造会使用您提供的任何数据处理方式处理每个已定义的值,同时忽略未定义的值。而且,无论可选参数的数量多少,它都只需 9 个常见的流程任务即可完成 🎉:
让我们来详细分析一下:
结论
从现在开始,不要再用 Lambda 函数处理带有大量可选参数的大型状态机输入了!😉
文章来源:https://dev.to/slsbytheodo/handle-optional-input-parameters-in-aws-step-functions-without-lambda-424m







