我有这个步骤功能,有时会失败,我想在(发电机)数据库中记录这个。如果我可以创建一个新的错误处理步骤并且那个人只是从某个地方拿起“执行名称”(在上下文中找不到它)并将其记录为失败,那将会是什么方便。
这可能吗?
答案 0 :(得分:5)
是的,它可以,但它并不像你希望的那样直截了当。
您认为Lambda应该能够获取调用状态机的名称是正确的。 Lambda在上下文对象中传递,该对象返回调用者的信息。但是,当状态机调用Lambda时,该对象为null。这意味着两件事。你将不得不更加努力地获得你需要的东西,并且这可能会在将来实施。
现在,我知道实现这一目标的唯一方法是从另一个Lambda中开始执行状态机并在输入Json中传入名称。这是我在Java中的代码......
String executionName = //generate a unique name...
StartExecutionRequest startExecutionRequest = new StartExecutionRequest()
.withStateMachineArn(stateMachineArn)
.withInput(" {"executionName" : executionName} ") //make sure you escape the quotes
.withName(executionName);
StartExecutionResult startExecutionResult = sf.startExecution(startExecutionRequest);
String executionArn = startExecutionResult.getExecutionArn();
如果您这样做,您现在将在第一步的输入JSON 中拥有执行名称。如果你想在其他步骤中使用它,你应该传递它。
您可能还需要执行的ARN,以便您可以在活动或任务中调用状态机方法。您可以使用executionName ...
自己构建ARNARN:AWS:规定:我们 - 东 - 1:的 acountid 强>:执行:的 statemachinename 强>:<强> executionName 强>
答案 1 :(得分:3)
没有。除非你在事件中传递了这些信息,否则Lambda不知道它是否是步进功能的一部分。阶梯函数协调lambdas并维持lambda之间的状态。
答案 2 :(得分:0)
在使用步进功能在步进功能配置中指定某种键时,我强烈建议。对于我的脚步功能,我总是提供:
"ResultPath": "$",
"Parameters": {
"source": "StepFunction",
"type": "LAMBDA_METHOD_SWITCH_VALUE",
"payload.$": "$"
},
并让每个对lambda的调用使用type
字段来确定要调用的代码。当您的代码失败时,请将其包装在try / catch中,并显式使用传入的type
,它可以是确定下一步操作的步骤的名称。
答案 3 :(得分:0)
AWS Step Functions最近发布了一个称为上下文对象的功能。
在Parameters块内使用$$表示法,您可以访问有关执行的信息,包括执行名称,arn,状态机名称,arn和其他信息。
https://docs.aws.amazon.com/step-functions/latest/dg/input-output-contextobject.html
答案 4 :(得分:0)
您可以创建一个状态以提取上下文详细信息,然后所有其他状态都可以访问它们,例如:
{
"StartAt": "ExtractContextDetails",
"States": {
"ExtractContextDetails": {
"Parameters": {
"arn.$": "$$.Execution.Id"
},
"Type": "Pass",
"ResultPath": "$.contextDetails",
"Next": "NextStateName"
}
}
....
}