You need to enable JavaScript to run this app. CDK Pass步骤如何在输入JSON根节点新增属性并传递合并数据
优惠活动
大模型
产品
解决方案
定价
更多

CDK Pass步骤如何在输入JSON根节点新增属性并传递合并数据

Step Functions Pass 步骤根节点新增属性的CDK实现方案

常见配置误区说明

你之前尝试多种参数组合未达预期,本质来自Step Functions Pass状态的原生数据流规则限制:

  • 不配置resultPath时,步骤输出会被result值完全覆盖,丢失全部原有输入内容
  • resultPath仅支持指定单一路径写入,无法一次将多个独立静态值写入输入的不同根节点位置
  • 当resultPath指向具体子路径时,所有result的内容都会被嵌套写入该路径下,不会自动平铺到根节点

最优实现(单Pass步骤完成,适配新版ASL语法)

核心配置逻辑

依托Step Functions新版Payload模板支持的对象平铺展开能力,单步骤即可实现全字段保留 + 多属性新增:

  • 设置inputPath为$,读取完整原输入对象
  • 在result配置中,通过展开语法将原输入的所有顶层字段平铺到结果对象根级,再追加需要新增的自定义属性
  • 设置resultPath为$,因为result已经包含了全部需要的输出内容(原输入字段 + 新增属性),直接替换步骤输出即可
  • 保持outputPath为默认值$,输出完整合并后的对象

CDK实现代码(TypeScript示例)

import * as sfn from 'aws-cdk-lib/aws-stepfunctions';

const addRootPropertiesPass = new sfn.Pass(this, 'AddRootProperties', {
  comment: '保留原输入全部字段,在根节点新增自定义属性',
  inputPath: '$',
  result: sfn.Result.fromObject({
    // 平铺原输入的所有顶层字段,无需手动枚举
    '$[`...`]': '$',
    // 新增简单类型属性
    out1: 'simple',
    // 新增复杂对象类型属性
    out2complex: {
      f1A: 111,
      f2A: 'f22'
    }
  }),
  resultPath: '$',
  outputPath: '$'
});

效果验证:当输入为你给出的初始JSON结构时,该步骤的输出会完全匹配期望的合并结构,原输入的f1、cx、cx2字段全部保留,根节点新增out1和out2complex属性。

老版本ASL环境兼容实现

如果所在环境暂不支持对象展开的新语法,可以使用双Pass步骤串联完成合并,完全兼容老版ASL规范:

配置逻辑

  1. 第一个Pass步骤:将需要新增的属性集合作为result,通过resultPath挂载到一个临时根字段下,完全保留原输入所有字段
  2. 第二个Pass步骤:通过JsonPath引用原输入字段和临时字段的新增属性,组合成完整的合并结果,通过resultPath设置为$完成输出替换

兼容版本CDK代码

// 步骤1:将新增属性挂载到临时字段
const mountTempAdditions = new sfn.Pass(this, 'MountTempAdditions', {
  inputPath: '$',
  result: sfn.Result.fromObject({
    out1: 'simple',
    out2complex: {
      f1A: 111,
      f2A: 'f22'
    }
  }),
  resultPath: '$.__temp' // 新增属性存入临时字段,不影响原输入内容
});

// 步骤2:合并所有字段到根节点
const mergeToRoot = new sfn.Pass(this, 'MergeToRoot', {
  inputPath: '$',
  result: sfn.Result.fromObject({
    // 引用原输入的顶层字段
    f1: '$.f1',
    cx: '$.cx',
    cx2: '$.cx2',
    // 从临时字段取出新增属性,平铺到根节点
    out1: '$.__temp.out1',
    out2complex: '$.__temp.out2complex'
  }),
  resultPath: '$',
  outputPath: '$'
});

// 串联状态链
const stateChain = mountTempAdditions.next(mergeToRoot);

避坑提示

  • 不要在未做原输入展开的情况下直接将resultPath设为$搭配自定义result,这种配置会完全丢失原有输入,也就是你之前遇到的输入覆盖问题
  • 不要尝试让单个resultPath同时指向多个不同的根节点路径,ASL规范仅支持单路径写入,这类配置不符合语法要求
  • 使用对象展开语法时,无需手动维护原输入的字段映射,后续原输入新增其他根字段时,步骤会自动保留这些字段到输出中,无需修改状态机定义

内容的提问来源于stack exchange,提问作者zdenko.s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 23:54:04