处理 AWS Step Functions 时如何处理 JSON 中的缺失值
How to handle missing values in JSON when processing AWS Step Functions
我有一个采用 JSON 负载的 Step Function。处理程序接受 Map 和 returns 相同的东西。
我遇到的问题 运行 是在将地图序列化回 JSON 时密钥丢失,这导致我在下一步出现异常。
我有以下将输入转换为 lambda 的通用结构的方法:
"SearchForPersonCustomer": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-west-2:xxxxx:function:searchForCustomer:$LATEST",
"Payload": {
"businessSearchInd": false,
"taxIdentifier.$": "$.sSN",
"firstName.$": "$.firstName",
"middleInitial.$": "$.middleInitial",
"lastName.$": "$.lastName",
"birthDate.$": "$.birthDate"
}
}
问题在于,虽然字段 middleInitial ("middleInitial":null
) 填充在 JSON 中,但先前的步骤输出不再对其进行序列化,因此当它尝试访问它时,步骤函数失败如下:
The JSONPath '$.middleInitial' specified for the field
'middleInitial.$' could not be found in the input
有没有办法处理这种边缘情况,以便如果缺少字段(在本例中为 middleInitial)在转换为有效负载时被假定为 null?
谢谢
您可以执行以下两项操作之一:如果这是来自 API,那么您可以设置方法或集成请求转换 - 如果默认值缺失,这将使您能够添加默认值。参见 this documentation。
或者,如果您不处理 API 那么您最好的选择是添加一个转换层 lambda 作为您的第一步 - 它接受任何事件并检查必填字段 - 它可以拒绝如果您不能默认它,或者它可以为您默认这些值,具体取决于您的要求。
Step Functions 本身是一个“愚蠢”的系统 - 它可以做一些非常基本的选择和重复逻辑,但它不能做出假设或解析或设置缺失的东西。这就是 Lambda 的用途 - 为您的 step 函数处理这类事情。 Step Function 应该只是一个向右传输数据的框架 lambda/resource/service
我认为您的问题归结为检测变量的存在。 Stepfunction“Choice”于 2020 年更新,以允许检测变量的存在(以及检测各种类型)。参见 https://aws.amazon.com/blogs/aws/aws-step-functions-adds-updates-to-choice-state-global-access-to-context-object-dynamic-timeouts-result-selection-and-intrinsic-functions-to-amazon-states-languages/
我有一个采用 JSON 负载的 Step Function。处理程序接受 Map
我遇到的问题 运行 是在将地图序列化回 JSON 时密钥丢失,这导致我在下一步出现异常。
我有以下将输入转换为 lambda 的通用结构的方法:
"SearchForPersonCustomer": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {
"FunctionName": "arn:aws:lambda:us-west-2:xxxxx:function:searchForCustomer:$LATEST",
"Payload": {
"businessSearchInd": false,
"taxIdentifier.$": "$.sSN",
"firstName.$": "$.firstName",
"middleInitial.$": "$.middleInitial",
"lastName.$": "$.lastName",
"birthDate.$": "$.birthDate"
}
}
问题在于,虽然字段 middleInitial ("middleInitial":null
) 填充在 JSON 中,但先前的步骤输出不再对其进行序列化,因此当它尝试访问它时,步骤函数失败如下:
The JSONPath '$.middleInitial' specified for the field 'middleInitial.$' could not be found in the input
有没有办法处理这种边缘情况,以便如果缺少字段(在本例中为 middleInitial)在转换为有效负载时被假定为 null?
谢谢
您可以执行以下两项操作之一:如果这是来自 API,那么您可以设置方法或集成请求转换 - 如果默认值缺失,这将使您能够添加默认值。参见 this documentation。
或者,如果您不处理 API 那么您最好的选择是添加一个转换层 lambda 作为您的第一步 - 它接受任何事件并检查必填字段 - 它可以拒绝如果您不能默认它,或者它可以为您默认这些值,具体取决于您的要求。
Step Functions 本身是一个“愚蠢”的系统 - 它可以做一些非常基本的选择和重复逻辑,但它不能做出假设或解析或设置缺失的东西。这就是 Lambda 的用途 - 为您的 step 函数处理这类事情。 Step Function 应该只是一个向右传输数据的框架 lambda/resource/service
我认为您的问题归结为检测变量的存在。 Stepfunction“Choice”于 2020 年更新,以允许检测变量的存在(以及检测各种类型)。参见 https://aws.amazon.com/blogs/aws/aws-step-functions-adds-updates-to-choice-state-global-access-to-context-object-dynamic-timeouts-result-selection-and-intrinsic-functions-to-amazon-states-languages/