对于在 step 函数中执行的 lambda,我有点期望我可以从 lambda 上下文中获取当前 step 的名称,但似乎没有那么简单。
有没有办法在 Step Function 中执行的 lambda 中获取当前步骤的名称?
对于在 step 函数中执行的 lambda,我有点期望我可以从 lambda 上下文中获取当前 step 的名称,但似乎没有那么简单。
有没有办法在 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
}
AWS Step Functions 发布了上下文对象,您可以在其中访问有关您的执行的信息。
您可以使用它将执行 arn 发送到您的 lambda。
https://docs.aws.amazon.com/step-functions/latest/dg/input-output-contextobject.html
根据文档,我正在使用Parameters
并将$$
step 函数上下文对象传递给我的 lambda 函数。为了测试它是否正常工作,我想我可以转到 step 函数控制台,开始一个新的执行,然后在“Step Input”选项卡上看到上下文对象被传递到 step 函数中。令我沮丧的是,它没有显示在那里。我向 lambda 函数添加了一些诊断日志记录,将输入序列化为 JSON 并注销到 CloudWatch。Cloudwatch 日志显示上下文对象正在被传入。
无论如何,我想我会在这里发布这个也许可以帮助某人避免我花时间试图弄清楚这个。它被传入,只是没有显示在 step 函数控制台中。
我强烈建议在使用步进函数时在步进函数配置中指定某种键。对于我的步进功能,我总是提供:
"ResultPath": "$",
"Parameters": {
"source": "StepFunction",
"type": "LAMBDA_METHOD_SWITCH_VALUE",
"payload.$": "$"
},
并让对 lambda 的每次调用都使用该type
字段来确定要调用的代码。我发现这更容易实现。