AWS Step函数:如何在状态机中传递静态键值对(不使用类型:pass)?

时间:2019-06-10 20:27:42

标签: amazon-web-services aws-lambda aws-step-functions

我们有一个通用的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",
    }
}

2 个答案:

答案 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"