AWS Step Function 中的 lambda 能否知道启动它的 step 函数的 "execution name"?
Can a lambda in an AWS Step Function know the "execution name" of the step function that launched it?
我的步进函数有时会失败,我想将其记录在(发电机)数据库中。如果我可以创建一个新的错误处理步骤并且那个人会从某个地方拿起 "execution name"(没有在上下文中找到它)并将其记录为失败,那将会很方便。
这可能吗?
没有。除非您在事件中传递该信息,否则 Lambda 不知道它是否是步骤函数的一部分。步骤函数编排 lambda 并维护 lambda 之间的状态。
是的,它可以,但它并不像您希望的那样简单。
您期望 Lambda 应该能够获取调用状态机的名称是正确的。 Lambda 在上下文对象中传递,该对象包含有关调用者的 returns 信息。但是,当状态机调用您的 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...
自行构建 ARN
arn:aws:states:us-east-1:acountid:execution:statemachinename:executionName
我强烈建议在使用步进函数时在步进函数配置中指定某种键。对于我的步骤函数,我总是提供:
"ResultPath": "$",
"Parameters": {
"source": "StepFunction",
"type": "LAMBDA_METHOD_SWITCH_VALUE",
"payload.$": "$"
},
并且让每个对 lambda 的调用都使用 type
字段来确定要调用的代码。当您的代码失败时,将其包装在 try/catch 中并显式使用传入的 type
,它可以作为步骤的名称来确定下一步要做什么。
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"
}
}
....
}
我的步进函数有时会失败,我想将其记录在(发电机)数据库中。如果我可以创建一个新的错误处理步骤并且那个人会从某个地方拿起 "execution name"(没有在上下文中找到它)并将其记录为失败,那将会很方便。
这可能吗?
没有。除非您在事件中传递该信息,否则 Lambda 不知道它是否是步骤函数的一部分。步骤函数编排 lambda 并维护 lambda 之间的状态。
是的,它可以,但它并不像您希望的那样简单。
您期望 Lambda 应该能够获取调用状态机的名称是正确的。 Lambda 在上下文对象中传递,该对象包含有关调用者的 returns 信息。但是,当状态机调用您的 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:states:us-east-1:acountid:execution:statemachinename:executionName
我强烈建议在使用步进函数时在步进函数配置中指定某种键。对于我的步骤函数,我总是提供:
"ResultPath": "$",
"Parameters": {
"source": "StepFunction",
"type": "LAMBDA_METHOD_SWITCH_VALUE",
"payload.$": "$"
},
并且让每个对 lambda 的调用都使用 type
字段来确定要调用的代码。当您的代码失败时,将其包装在 try/catch 中并显式使用传入的 type
,它可以作为步骤的名称来确定下一步要做什么。
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"
}
}
....
}