【问题标题】:AWS Step Function: Pass array type value to Task ParameterAWS Step Function:将数组类型值传递给任务参数
【发布时间】:2021-09-04 02:03:34
【问题描述】:

背景:

我正在创建一个用于预置 AWS Step Function 机器的 Terraform 模块。 Step Function 定义由 Map 状态组成,该状态通过 CodeBuild Task 状态迭代动态数组输入。在 CodeBuild 任务的 EnvironmentVariablesOverride 参数中,我将传递数组输入的相应 Map 迭代。

问题:

我还没有弄清楚在 CodeBuild Task Parameter 字段中提供 EnvironmentVariablesOverride 属性的语法。

这是状态机定义:

resource "aws_sfn_state_machine" "this" {
  name     = <name>
  role_arn = <role_arn>

  definition = <<EOF
{
  "StartAt": "Parallelize Stack",
  "States": {
    "Parallelize Stack": {
      "Type": "Map",
      "End": true,
      "Iterator": {
        "StartAt": "Deploy",
        "States": {
          "Deploy": {
            "Type": "Map",
            "Parameters": {
              "Path.$": "$$.Map.Item.Value"
            },
            "End": true,
            "Iterator": {
              "StartAt": "Plan",
              "States": {
                "Plan": {
                  "Type": "Task",
                  "Resource": "arn:aws:states:::codebuild:startBuild",
                  "Parameters": {
                    "ProjectName": "${var.build_name}",
                    "EnvironmentVariablesOverride.$": "[
                      {
                        "name": "PATH",
                        "type": "PLAINTEXT",
                        "value": "$.Path"
                      },
                      {
                        "name": "COMMAND",
                        "type": "PLAINTEXT",
                        "value": "plan"
                      }
                    ]"
                  },
                  "Next": "Approval"
                },
                "Approval": {
                  "Type": "Task",
                  "Resource": "${aws_sfn_activity.manual_approval.id}",
                  "End": true
                }
              }
            }
          }
        }
      }
    }
  }
}
  EOF
}

尝试:

  1. 使用上面指定的EnvironmentVariablesOverride 值:
"EnvironmentVariablesOverride.$": "[
    {
        "name": "PATH",
        "type": "PLAINTEXT",
        "value": "$.Path"
    },
    {
        "name": "COMMAND",
        "type": "PLAINTEXT",
        "value": "plan"
    }
]"
InvalidDefinition: Invalid State Machine Definition: 'INVALID_JSON_DESCRIPTION: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value
"EnvironmentVariablesOverride.$": States.Format('[
    {
        "name": "PATH",
        "type": "PLAINTEXT",
        "value.$": {}
    },
    {
        "name": "COMMAND",
        "type": "PLAINTEXT",
        "value": "plan"
    }
]', "$.Path")
InvalidDefinition: Invalid State Machine Definition: 'INVALID_JSON_DESCRIPTION: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value
"EnvironmentVariablesOverride.$": [
    {
        "name": "PATH",
        "type": "PLAINTEXT",
        "value": "$.Path"
    },
    {
        "name": "COMMAND",
        "type": "PLAINTEXT",
        "value": "plan"
    }
]
InvalidDefinition: Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The value for the field 'EnvironmentVariablesOverride.$' must be a STRING that contains a JSONPath but was an ARRAY at /States/Parallelize Stack/Iterator/States/Deploy/Iterator/States/Plan/Parameters'
"EnvironmentVariablesOverride.$": "States.JsonToString([
    {
        "name": "PATH",
        "type": "PLAINTEXT",
        "value": "$.Path"
    },
    {
        "name": "COMMAND",
        "type": "PLAINTEXT",
        "value": "plan"
    }
])"
InvalidDefinition: Invalid State Machine Definition: 'INVALID_JSON_DESCRIPTION: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value
"EnvironmentVariablesOverride.$": [
    {
    "name": "PATH",
    "type": "PLAINTEXT",
    "value.$": "$.Path"
    },
    {
    "name": "COMMAND",
    "type": "PLAINTEXT",
    "value": "plan"
    }
]
InvalidDefinition: Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: The value for the field 'EnvironmentVariablesOverride.$' must be a STRING that contains a JSONPath but was an ARRAY at /States/Parallelize Stack/Iterator/States/Deploy/Iterator/States/Plan/Parameters'

【问题讨论】:

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


    【解决方案1】:

    如果您删除“.$”,您的第 5 次尝试应该可以工作,如下所示。

    "EnvironmentVariablesOverride": [
        {
        "name": "PATH",
        "type": "PLAINTEXT",
        "value.$": "$.Path"
        },
        {
        "name": "COMMAND",
        "type": "PLAINTEXT",
        "value": "plan"
        }
    ]
    

    我没有尝试为此使用 terraform(我使用 Cfn),但无论您使用哪种 IaC 工具,状态机定义都应该相同。下面是我的 Cfn 模板中的一个 sn-p(yaml,所以你必须知道转换为 json)。

      Build:
        Type: Task
        Resource: arn:aws:states:::codebuild:startBuild.sync
        Parameters:
          ProjectName: !Ref ProjectName
          EnvironmentVariablesOverride:
          - Name: stackName
            Type: PLAINTEXT
            Value.$: $.repository_name
          SourceLocationOverride.$: $.artifact_location
        TimeoutSeconds: 300
        ResultPath: null
        Catch:
        - ErrorEquals:
          - States.ALL
          ResultPath: $.error-info
          Next: SendAlert
        Next: SetAccountIdRBITSandpit
    

    EnvironmentVariablesOverride 需要一个列表。但是如果你添加“.$”,那么它会期望一个带有 JSONpath 的字符串值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2020-02-09
      • 1970-01-01
      相关资源
      最近更新 更多