AWS Step Functions中JSON映射引用报错:为何单个映射失效?
问题
在AWS Step Functions中使用非标量变量时遇到JSONata引用问题。原状态机通过逐个引用$my_tags中的键值对构建Tags数组,尝试简化操作时出现错误:
原状态机关键代码
"CreateSnapshot": { "Type": "Task", "Arguments": { "VolumeId": "vol-01234567890abcdef", "TagSpecifications": [ { "ResourceType": "snapshot", "Tags": [ { "Key": "{% $my_tags[0].Key %}", "Value": "{% $my_tags[0].Value %}" }, { "Key": "{% $my_tags[1].Key %}", "Value": "{% $my_tags[1].Value %}" } ] } ] }, "Resource": "arn:aws:states:::aws-sdk:ec2:createSnapshot", "End": true }
尝试简化的错误写法
"TagSpecifications": [ { "ResourceType": "snapshot", "Tags": [ "{% $my_tags[0] %}", "{% $my_tags[1] %}" ] } ]
报错信息
/States/CreateSnapshot/Arguments: Cannot construct instance of
software.amazon.awssdk.services.ec2.model.Tag$BuilderImpl(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{% $my_tags[0] %}')
可正常运行的写法
"TagSpecifications": [ { "ResourceType": "snapshot", "Tags": "{% $my_tags %}" } ]
疑问:为何{% %}语法可正常处理列表,却无法处理单个映射?是否存在操作错误?或者有相关文档说明该行为?
解答
这是Step Functions的JSONata插值语法特性导致的:
- 替换整个数组/对象时:插值结果会以原始JSON结构注入参数,保留对象/数组类型,EC2 API能正确解析为
Tag对象列表。 - 作为数组元素插值时:Step Functions会把插值结果序列化为字符串,而EC2 API期望
Tags数组的每个元素是Tag类型对象,而非字符串,因此触发反序列化错误。
正确简化方案
直接将整个$my_tags数组赋值给Tags即可,也就是你最后成功的写法。如果需要对标签数组做过滤、转换,可直接在JSONata表达式中处理整个数组,示例:
"Tags": "{% $my_tags[$$.Key != 'foo'] %}"
这种写法会返回处理后的对象数组,保持正确结构,无需逐个元素引用。
内容的提问来源于stack exchange,提问作者Eric Stdlib
相关产品推荐
相关产品推荐

