我有这个有时会失败的步进功能,我想将它记录在(发电机)数据库中。方便的是,如果我可以创建一个新的错误处理步骤,并且那个人会从某个地方(在上下文中找不到它)拿起“执行名称”并将其记录为失败。
那可能吗?
我有这个有时会失败的步进功能,我想将它记录在(发电机)数据库中。方便的是,如果我可以创建一个新的错误处理步骤,并且那个人会从某个地方(在上下文中找不到它)拿起“执行名称”并将其记录为失败。
那可能吗?
AWS Step Functions 最近发布了一项称为上下文对象的功能。
在参数块中使用 $$ 表示法,您可以访问有关执行的信息,包括执行名称、arn、状态机名称、arn 等。
https://docs.aws.amazon.com/step-functions/latest/dg/input-output-contextobject.html
您可以创建一个状态来提取所有其他状态都可以访问的上下文详细信息,例如:
{
"StartAt": "ExtractContextDetails",
"States": {
"ExtractContextDetails": {
"Parameters": {
"arn.$": "$$.Execution.Id"
},
"Type": "Pass",
"ResultPath": "$.contextDetails",
"Next": "NextStateName"
}
}
....
}
是的,它可以,但它并不像你希望的那样直截了当。
您期望 Lambda 应该能够获取调用状态机的名称是正确的。Lambda 在返回调用者信息的上下文对象中传递。但是,当状态机调用您的 Lambda 时,该对象为空。这意味着两件事。您将不得不更加努力地获得所需的东西,并且将来可能会实施。
现在,我知道实现这一点的唯一方法是从另一个 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 自己构建 ARN...
arn:aws:states:us-east-1: acountid :execution: statemachinename : executionName
不会。除非您在事件中传递该信息,否则 Lambda 不知道它是否是阶跃函数的一部分。阶跃函数编排 lambda 并维护 lambda 之间的状态。
我强烈建议在使用步进函数时在步进函数配置中指定某种键。对于我的步进功能,我总是提供:
"ResultPath": "$",
"Parameters": {
"source": "StepFunction",
"type": "LAMBDA_METHOD_SWITCH_VALUE",
"payload.$": "$"
},
并让对 lambda 的每次调用都使用该type
字段来确定要调用的代码。当您的代码失败时,将其包装在 try/catch 中并显式使用传入type
的作为步骤名称来确定下一步要做什么。