AWS Step Function:将数组类型值传递给任务参数

如何解决AWS Step Function:将数组类型值传递给任务参数

背景:

我正在创建一个配置 AWS Step Function 机器的 terraform 模块。 Step Function 定义包含一个 Map 状态,该状态通过 CodeBuild Task 状态迭代动态数组输入。在 CodeBuild 任务的 EnvironmentvariablesOverride 参数中,我传递数组输入的相应 Map 迭代。

问题:

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

这是状态机定义:

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"
            },"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","value": "plan"
                      }
                    ]"
                  },"Next": "Approval"
                },"Approval": {
                  "Type": "Task","Resource": "${aws_sfn_activity.manual_approval.id}","End": true
                }
              }
            }
          }
        }
      }
    }
  }
}
  EOF
}

尝试:

  1. 使用上面指定的 EnvironmentvariablesOverride 值:
"EnvironmentvariablesOverride.$": "[
    {
        "name": "PATH","value": "$.Path"
    },{
        "name": "COMMAND","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","value.$": {}
    },"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","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","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","value.$": "$.Path"
    },{
    "name": "COMMAND","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'

解决方法

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

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

我还没有尝试为此使用 terraform(我使用了 Cfn),但是无论您使用哪种 IaC 工具,状态机定义都应该相同。下面是我的 Cfn 模板的一个片段(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 的 String 值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?