首页 > 解决方案 > AWS Step Functions - 在不发生迭代时利用空 Map 状态输出

问题描述

我有一个包含 3 个步骤的工作流程:

  1. 任务 - 上传 N 个文件
    • 生成 N 个作业定义的数组,用作步骤 2 映射状态的输入
  2. 地图 - 处理每个作业
    • 由于地图状态,这被执行了 N 次
  3. 任务 - 做一些其他的事情

我想要的是仅在步骤 2 中发生任何迭代时才执行步骤 3。按照这种设计方式,步骤 1 通常不会产生任何输出,因此基本上跳过了步骤 2。

我注意到在我概述的场景中,步骤 2 的输出只是[],通常它包含大量有关迭代的信息。是否可以执行这种工作流程?

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

解决方案


步骤 1 后的选择状态以检查 Map 中是否至少有一条记录,我们无法检查数组的长度,因此isPresent在 map 的第一个元素上使用$.inputForMap[0]

步骤定义

{
   "StartAt":"Dummy Step 1 Output",
   "States":{
      "Dummy Step 1 Output":{
         "Type":"Pass",
         "Result":[
            "iter 1",
            "iter2"
         ],
         "ResultPath":"$.inputForMap",
         "Next":"does map has atleast one record?"
      },
      "does map has atleast one record?":{
         "Type":"Choice",
         "Choices":[
            {
               "Variable":"$.inputForMap[0]",
               "IsPresent":true,
               "Next":"loop on map"
            }
         ],
         "Default":"End of Step Function"
      },
      "End of Step Function":{
         "Type":"Pass",
         "End":true
      },
      "Step three":{
         "Type":"Pass",
         "Next":"End of Step Function"
      },
      "loop on map":{
         "Type":"Map",
         "Next":"Step three",
         "Iterator":{
            "StartAt":"Step 2 - Looping on map",
            "States":{
               "Step 2 - Looping on map":{
                  "Type":"Pass",
                  "End":true
               }
            }
         },
         "ItemsPath":"$.inputForMap",
         "MaxConcurrency":1
      }
   }
}

当 Map 不为空时

在此处输入图像描述

地图为空时

在此处输入图像描述


推荐阅读