如何使用aws:loop迭代AWS自动化文档前置步骤的StringList输出?
解决AWS Systems Manager中aws:loop迭代前置步骤输出的问题
1. 先改变量引用格式(核心错误)
你在aws:loop里写的{{ Name.Output }}是错的,正确的引用规则是{{ 前置步骤的名称.输出定义里的Name }}。
举个例子:如果你的AWS-RunPowerShellScript步骤name是GetFileList,那loop里的Iterators应该写成:
"Iterators": "{{ GetFileList.Name }}",
报错提示找不到Name.Output,就是因为你搞反了引用格式。
2. 调整PowerShell脚本输出格式
AWS的StringList类型要求输出是每行一个元素,不是逗号分隔的字符串。把你的脚本改成每行输出一个文件名:
# 直接每行输出一个文件 Write-Output "a.file" Write-Output "b.file" Write-Output "c.file" # 如果原来的输出是逗号分隔字符串,转成每行输出: # $fileStr = "a.file, b.file, c.file" # $fileStr -split ", " | ForEach-Object { Write-Output $_ }
3. 保持输出定义配置不变
你之前的输出定义是对的,不用改:
"outputs": [ { "Type": "StringList", "Name": "Name", "Selector": "$.Payload" } ]
4. 最终loop配置示例
假设前置步骤名称是GetFileList,调整后的完整loop配置:
"name": "Loop", "action": "aws:loop", "nextStep": "NextStep", "isEnd": false, "inputs": { "Iterators": "{{ GetFileList.Name }}", "IteratorDataType": "StringList", "Steps": [ // 循环内的步骤可以用{{ Iterator }}引用当前迭代的文件名 ] }
额外方案:用JSON数组输出
如果偏好输出JSON数组,脚本可以这么写:
@("a.file", "b.file", "c.file") | ConvertTo-Json
此时输出定义的Selector保持$.Payload即可,SSM会自动解析这个JSON数组为StringList。
内容的提问来源于stack exchange,提问作者frank.s
相关产品推荐
相关产品推荐

