AWS Step Function:检查是否为空

AWS Step Function: check for null

步进函数定义如下:

{
  "StartAt": "Decision_Maker",
  "States": {
    "Decision_Maker":{
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.body.MyData",
          "StringEquals": "null", //that doesn't work :(
          "Next": "Run_Task1"
        }],
        "Default": "Run_Task2"
    },
    "Run_Task1": {
      "Type": "Task",
      "Resource": "url_1",
      "Next": "Run_Task2"
    },
    "Run_Task2": {
      "Type": "Task",
      "Resource": "url_2",
      "End": true
    }
  }
}

基本上是在 2 个任务之间进行选择。 输入数据是这样的:

{
    "body": {
        "prop1": "value1",
        "myData": {
            "otherProp": "value"
        }
    }
}

问题是有时 JSON 中没有 myData。所以输入可能是这样的:

{
    "body": {
        "prop1": "value1",
        "myData": null
    }
}

如何检查 myData 是否为空?

根据我的经验,选择类型无法处理空值。最好的方法是在第一个状态下使用 lambda 预处理您的输入,然后 return 事件将其格式化为“null”。下面的代码片段可能会有所帮助。

def lambda_handler(event, context):
if event['body']['MyData']:
    return event
else:
    event['body']['MyData']="null"
    return event

注意:这也处理空字符串。

自 2020 年 8 月起,Amazon States Language 现在具有 isNullisPresent 选择规则。 使用这些您可以本地检查 null 或在 Choice 状态中的状态输入中存在键。

示例:

{ "Variable": "$.possiblyNullValue", "IsNull": true }

https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-choice-state.html#amazon-states-language-choice-state-rules

顺序很重要。先设置“IsPresent": false,然后设置"IsNull": true,最后设置标量比较。

    "Check MyValue": {
      "Comment": "Check MyValue",
      "Type": "Choice",
      "Default": "ContinueWithMyValue",
      "Choices": [
        {
          "Or": [
            {
              "Variable": "$.MyValue",
              "IsPresent": false
            },
            {
              "Variable": "$.MyValue",
              "IsNull": true
            },
            {
              "Variable": "$.MyValue",
              "BooleanEquals": false
            }
          ],
          "Next": "HaltProcessing"
        },
        {
          "Variable": "$.MyValue",
          "BooleanEquals": true,
          "Next": "ContinueWithMyValue"
        }
      ]
    },