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 在这里可能会帮助别人避免我花时间试图弄清楚这个问题。它被传入,只是没有出现在步骤函数控制台中。
对于在步骤函数中执行的 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 在这里可能会帮助别人避免我花时间试图弄清楚这个问题。它被传入,只是没有出现在步骤函数控制台中。