微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS 步骤函数:如何在 Fargate 任务中将 InputPath 传递给 OutputPath 不变

如何解决AWS 步骤函数:如何在 Fargate 任务中将 InputPath 传递给 OutputPath 不变

我有一个使用此 Serverless plugin 定义的 AWS 步骤函数,包含 3 个步骤(FirstStep -> Worker -> EndStep -> Done):

stepFunctions:
  stateMachines:
    MyStateMachine:
      name: "MyStateMachine"
      deFinition:
        StartAt: FirstStep
        States:
          FirstStep:
            Type: Task
            Resource:
              Fn::GetAtt: [ FirstStep,Arn ]
            InputPath: $
            OutputPath: $
            Next: Worker

          Worker:
            Type: Task
            Resource: arn:aws:states:::ecs:runTask.sync
            InputPath: $
            OutputPath: $
            Parameters:
              Cluster: "#{EcsCluster}"
              TaskDeFinition: "#{EcsTaskDeFinition}"
              LaunchType: FARGATE
              Overrides:
                ContainerOverrides:
                  - Name: container-worker
                    Environment:
                      - Name: ENV_VAR_1
                        'Value.$': $.ENV_VAR_1
                      - Name: ENV_VAR_2
                        'Value.$': $.ENV_VAR_2
            Next: EndStep

            EndStep:
              Type: Task
              Resource:
                Fn::GetAtt: [ EndStep,Arn ]
              InputPath: $
              OutputPath: $
              Next: Done

          Done:
            Type: Succeed

我想将 InputPath 从 Worker 步骤 (Fargate) 不变地传播到 EndStep,但是当我从 AWS 管理控制台检查 EndStep 的步骤输入时,我看到与Fargate 任务改为传递:

{
  "Attachments": [...],"Attributes": [],"AvailabilityZone": "...","Clusterarn": "...","Connectivity": "CONNECTED","ConnectivityAt": 1619602512349,"Containers": [...],"cpu": "1024","CreatedAt": 1619602508374,"DesiredStatus": "STOPPED","ExecutionStoppedAt": 1619602543623,"Group": "...","InferenceAccelerators": [],"LastStatus": "STOPPED","LaunchType": "FARGATE","Memory": "3072","Overrides": {
    "ContainerOverrides": [
      {
        "Command": [],"Environment": [
          {
            "Name": "ENV_VAR_1","Value": "..."
          },{
            "Name": "ENV_VAR_2","Value": "..."
          }
        ],"EnvironmentFiles": [],"Name": "container-worker","ResourceRequirements": []
      }
    ],"InferenceAcceleratorOverrides": []
  },"PlatformVersion": "1.4.0","PullStartedAt": 1619602522806,"PullStoppedAt": 1619602527294,"StartedAt": 1619602527802,"StartedBy": "AWS Step Functions","StopCode": "EssentialContainerExited","StoppedAt": 1619602567040,"StoppedReason": "Essential container in task exited","StoppingAt": 1619602553655,"Tags": [],"TaskArn": "...","TaskDeFinitionArn": "...","Version": 5
}

基本上,如果初始输入是

{
  "ENV_VAR_1": "env1","ENV_VAR_2": "env2","otherStuff": {
    "k1": "v1","k2": "v2"
  }
}

我希望它按原样传递给 FirstStepWorkerEndStep 输入而无需更改。 这可能吗?

解决方法

假设您使用一个对象调用 step 函数(我们称之为 A),那么任务的...

  • ...InputPath 指定将 A 的哪一部分交给您的任务
  • ...ResultPath 指定在 A 中放置任务结果的位置
  • ...OutputPath 指定 A 的哪一部分交给下一个状态

来源:https://docs.aws.amazon.com/step-functions/latest/dg/input-output-example.html

因此,您当前正在使用 A 状态的结果(隐式)覆盖 Worker 中的所有内容。如果要丢弃 Worker 状态的结果,则必须指定:

ResultPath: null

来源:https://docs.aws.amazon.com/step-functions/latest/dg/input-output-resultpath.html#input-output-resultpath-null

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。