问题描述
我有一个使用此 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"
}
}
我希望它按原样传递给 FirstStep
、Worker
和 EndStep
输入而无需更改。
这可能吗?
解决方法
假设您使用一个对象调用 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