You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 12:12:44