我们有一个通用的lambda函数,我们正在尝试执行step函数。通用lambda函数正在寻找2个值:clusterId和policyJsonName。
我们能够从较早的状态机中获取clusterId,但是现在我们想在状态机中硬编码policyJsonName。因此,我们尝试使用步进函数的Input和Parameter选项,但这不起作用,并给我们带来了验证错误。
https://docs.aws.amazon.com/step-functions/latest/dg/input-output-inputpath-params.html
{
"Comment": "Job Orchestration EMR Step",
"dataset1": {"policyJsonName": "lambdainput"},
"StartAt": "EMRFetchClusterId",
"States": {
"EMRFetchClusterId": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:XXXXXX-fetch-clusterId",
"ResultPath": "$.clusterId",
"Next": "EMRAutoScaling"
},
"EMRAutoScaling": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:XXXX-add-auto-scaling",
"Parameters": {
"comment": "Provide input to autoscaling in lambda function",
"InputPath": "$.dataset1",
}
}
答案 0 :(得分:1)
在您提到的链接中,该部分:
{
"comment": "Example for InputPath.",
"dataset1": {
"val1": 1,
"val2": 2,
"val3": 3
},
"dataset2": {
"val1": "a",
"val2": "b",
"val3": "c"
}
}
这实际上是状态输入,它不是状态定义的一部分。您可以确认这一点,因为他们说以下话:
例如,假设您所在州的输入包括以下内容。
相反,如果要对值进行硬编码,则必须将其直接传递到Parameters
参数中,如下所示:
"Parameters": {
"policyJsonName": "lambdainput"
}
答案 1 :(得分:0)
感觉你想要这样的东西,
{
"Comment": "Job Orchestration EMR Step",
"StartAt": "EMRFetchClusterId",
"States": {
"EMRFetchClusterId": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:XXXXXX-fetch-clusterId",
"Next": "EMRAutoScaling"
},
"EMRAutoScaling": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:XXXX-add-auto-scaling",
"Parameters": {
"comment": "Provide input to autoscaling in lambda function",
"clusterId.$": "$.clusterId",
"policyJsonName": "lambdainput"
}
}
"clusterId.$": "$.clusterId"
特殊的 .$
后缀语法将在进入 $.clusterId
的有效负载中对 EMRAutoScaling
进行 json 路径查找,根据文档 here>
<块引用>
如果有效负载模板中的任何字段(无论嵌套多么深)的名称都以字符“.$”结尾,则其值将根据以下规则进行转换,并且该字段将被重命名以去除“.$”后缀。< /p>
而 "lambdainput"
只是按照您指定的硬编码。
注意事项
我删除了 "dataset1": {"policyJsonName": "lambdainput"},
,因为根据 Top level fields 允许的唯一顶级字段是 "Comment", "StartAt", "States", "Version", "TimeoutSeconds"
。