如何解决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
}
尝试:
- 使用上面指定的
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 举报,一经查实,本站将立刻删除。