首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将机器输入和Lambda函数输出传递到映射状态

如何将机器输入和Lambda函数输出传递到映射状态
EN

Stack Overflow用户
提问于 2021-09-20 23:42:22
回答 1查看 609关注 0票数 1

电流设置:

我目前有一个Step函数状态机,它启动一个任务状态(它调用一个Lambda函数),然后是一个映射状态(向批处理提交作业),定义如下

状态机定义

(注:省略了区域和帐户id,并替换了虚拟变量ACCOUNT_INFO__)

代码语言:javascript
复制
{
  "StartAt": "Populate EFS",
  "States": {
    "Populate EFS": {
      "Next": "MapState",
      "Type": "Task",
      "InputPath": "$",
      "ResultPath": "$.populate_efs_result",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "arn:aws:lambda:{ACCOUNT_INFO}:function:PopulateEFSLambda",
        "Payload.$": "$"
      }
    },
    "MapState": {
      "Type": "Map",
      "End": true,
      "ResultPath": "$.metadata.run_info",
      "InputPath": "$",
      "Iterator": {
        "StartAt": "TaskState",
        "States": {
          "TaskState": {
            "Type": "Task",
            "End": true,
            "InputPath": "$",
            "ResultPath": null,
            "Resource": "arn:aws:states:::batch:submitJob.sync",
            "Parameters": {
              "JobDefinition": "arn:aws:batch:{ACCOUNT_INFO}:job-definition/BatchJobDefCfn:1",
              "JobName": "test",
              "JobQueue": "arn:aws:batch:{ACCOUNT_INFO}:job-queue/BatchQueue123",
              "ContainerOverrides": {
                "Command": [
                  "sh",
                  "-c",
                  "entrypoint.pl -i /NGS/${sequencer}/${run_id}/ -s ${sample_name}"
                ],
                "Environment": [
                  {
                    "Name": "run_id",
                    "Value.$": "$.run_id"
                  },
                  {
                    "Name": "sample_name",
                    "Value.$": "$.sample_name"
                  },
                  {
                    "Name": "sequencer",
                    "Value.$": "$.sequencer"
                  }
                ]
              }
            }
          }
        }
      }
    }
  }
}

状态机输入

代码语言:javascript
复制
{
  "metadata": {
    "run_info": [
      {
        "sample_name": "SAMPLE_X",
        "sequencer": "Nextseq"
      },
      {
        "sample_name": "SAMPLE_Y",
        "sequencer": "Nextseq"
      },
      {
        "sample_name": "SAMPLE_Z",
        "sequencer": "Nextseq"
      }
    ]
  }
}

Lambda输出(为简化而缩短)

代码语言:javascript
复制
{"populate_efs_result": {
    "ExecutedVersion": "$LATEST",
    "Payload": "RUN_1"}

预期结果:

第二步(MapState)需要来自机器输入(sample_namesequencer)的信息,以及Lambda函数在populate_efs_result.Payload (run_id)中返回的信息,因此都需要包含在Map状态输入的事件对象中。但是,到目前为止,在我的尝试中,映射状态的输入要么是机器输入,要么是Lambda输出,而不是两者都是。

我尝试过在Map状态定义中更改InputPathItemsPath参数,并尝试在Map状态定义中包括以下内容,但这些方法都不起作用:Parameters: {"new_run_id.$": "$.populate_efs_result.Payload"}

EN

回答 1

Stack Overflow用户

发布于 2021-09-27 17:23:47

一个简单但不那么优雅的解决方案可能是在Map状态内移动lambda步骤。优点是来自lambda的响应将位于map状态的上下文中(如果您的lambda响应特定于map状态的每个迭代,则可能需要此响应)。缺点是您的lambda函数需要在映射的每一次迭代中执行,而lambda函数是快速而廉价的,它仍然不是一个完美的解决方案。

另一种方法是将执行输入传递给该lambda,然后扩展lambda以修改run_info数组以包括所需的数据。然后将修改后的数组作为InputPath传递到映射状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69261917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档