【问题标题】:Can a lambda in an AWS Step Function know the name of the step it is in?AWS Step Function 中的 lambda 可以知道它所在步骤的名称吗?
【发布时间】:2021-02-16 07:57:23
【问题描述】:

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

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

【问题讨论】:

  • 我现在很喜欢,但请尝试查看上下文对象(假设您使用的是正确的 lambda)
  • 感谢您的回复-但我已经检查了上下文,那里什么都没有:(

标签: aws-lambda aws-step-functions


【解决方案1】:

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


看起来你是对的,当前步骤不会通过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
}

【讨论】:

  • 感谢您的回答!插入传递状态确实是我一直在做的事情,但由于我想普遍应用它(这样同一个 lambda 可以多次出现,但根据步骤使用不同的配置),它变得非常难看。我会给它一些时间,如果没有其他问题,我会将其标记为最佳答案。
  • 呸打败了我^.^
  • 还有其他方法吗?看起来如果我有多个步骤,我将不得不在整个代码中添加 Pass state dummy。这也是反模式吗? @FreeWillaert
  • 正如我所说,它变得丑陋。不过我最近没有使用这个,也许有改进
【解决方案2】:

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

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

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

【讨论】:

  • 太好了,终于! :)
  • 这是否也包含在与事件一起发送到您的处理函数的“上下文”对象中? (即: def lambda_handler(event, context): )还是我必须在状态定义的参数部分中显式访问它?
  • 似乎需要使用Parameters 部分和$$ 表示法传递。例如。 state.$: $$.State
  • 你能详细说明我收到could not be used to start the Task: [The field \"Context\" is not supported by Step Functions] ``` 错误通知 Lambda: Next: Failed OutputPath: $.Payload Parameters: FunctionName: ... Payload.$: $ Context.$: $$ ` ``
【解决方案3】:

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

无论如何,我想我会在这里发布这个,也许可以帮助别人避免我花时间试图解决这个问题。它被传入,只是没有显示在 step 函数控制台中。

【讨论】:

  • 它是否作为单独的参数传递给您的 lambda?您能否更新您的答案并提供完整的代码示例?谢谢!
【解决方案4】:

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

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

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

【讨论】:

  • 你能提供更多细节或例子吗?如果我对您的解释正确,那么 StepFunc 中的所有任务都会调用同一个条目 Lambda,然后再调用正确的 lambda。您如何将变量传递给这样的单个 lambda?参数是否与每个单独的状态一起使用?
  • 我现在看到了!参数进入各个状态,并在事件中传递给任务(lambda)。 StepFunction 没有在输入中显示它们,但是查看 Lambda 中的事件对象,它就在那里。您甚至可以从 StepFunc 的 JSON 中填充参数,以获取传递到 Lambda 的动态参数。不错!
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 2020-05-02
  • 2022-01-22
相关资源
最近更新 更多