AWS Step Function 中的 lambda 能否知道它所在步骤的名称?

Can a lambda in an AWS Step Function know the name of the step it is in?

对于在步骤函数中执行的 lambda,我有点期望我可以从 lambda 上下文中获取当前步骤的名称,但它似乎并不那么简单。

有没有办法获取在 Step Function 中执行的 lambda 中当前步骤的名称?

更新:自 2019 年 5 月 23 日起,此答案已过时,因为 AWS 引入了一种在步骤函数中访问当前步骤的方法,请参阅已接受的答案。


看来你是对的,当前步骤不会通过 context 变量公开。

因此,可以让您识别状态机当前处于哪个阶段的信息应该从上一步(即从上一个 lambda)传递。这似乎是最正确的选择。

或者,作为解决方法,您可以尝试在调用 lambda 函数之前插入 pass 状态,以传递可以帮助您识别当前阶段的 ID。

假设您的状态机中有两个步骤:

"Step1Test": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxx:function:step1test",
  "Next": "Step2Test"
},

"Step2Test": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxx:function:step2test",
  "End": true
}

以下是如何为您的 lambda 函数提供通过 event.stepId

传递的当前步骤 ID
"Step1TestEnter": {
  "Type": "Pass",
  "Next": "Step1Test",
  "Result": "Step1Test",
  "ResultPath": "$.stepId"    
},

"Step1Test": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxx:function:step1test",
  "Next": "Step2TestEnter"
},

"Step2TestEnter": {
  "Type": "Pass",
  "Next": "Step2Test",
  "Result": "Step2Test",
  "ResultPath": "$.stepId"     
},

"Step2Test": {
  "Type": "Task",
  "Resource": "arn:aws:lambda:us-east-1:xxxxxxxxxx:function:step2test",
  "End": true
}

我强烈建议在使用步进函数时在步进函数配置中指定某种键。对于我的步骤函数,我总是提供:

"ResultPath": "$",
"Parameters": {
  "source": "StepFunction",
  "type": "LAMBDA_METHOD_SWITCH_VALUE",
  "payload.$": "$"
},

并且让每个对 lambda 的调用都使用 type 字段来确定要调用的代码。我发现这更容易实现。

AWS Step Functions 发布了上下文对象,您可以在其中访问有关执行的信息。

您可以使用它将执行 arn 发送到您的 lambda。

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

基于 documentation,我使用 Parameters$$ 将步骤函数上下文对象传递到我的 lambda 函数中。为了测试它是否正常工作,我想我可以转到步进函数控制台,开始新的执行并在“步进输入”选项卡上查看传递到步进函数的上下文对象。令我沮丧的是,它没有在那里显示。我向 lambda 函数添​​加了一些诊断日志记录,将输入序列化为 JSON 并注销到 CloudWatch。 Cloudwatch 日志显示正在传入上下文对象。

无论如何,我想我会 post 在这里可能会帮助别人避免我花时间试图弄清楚这个问题。它被传入,只是没有出现在步骤函数控制台中。