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

如何在AWS CDK Step Functions的Lambda迭代示例中访问数组指定索引元素

如何在Step Functions的Lambda任务中通过迭代器索引访问数组元素

使用场景

AWS官方的《Iterating a Loop Using Lambda》示例提供了一种通过Choice状态遍历数组的方案,我希望利用迭代器的索引来访问数组中的特定元素。

Iterating a Loop Using Lambda

AWS CDK代码

this.iterator = new LambdaInvoke(this, "iterator", {
  lambdaFunction: stepFunctionTasksLambdaStack.iterator,
  payloadResponseOnly: true,
  comment: "Manage iterating over the array of configurable product skus",
  retryOnServiceExceptions: true,
  timeout: Duration.minutes(3),
});

this.countReached = new Choice(this, "Count Reached?");

this.encodeSku = new LambdaInvoke(this, "Encode Simple Product SKU", {
  lambdaFunction: stepFunctionTasksLambdaStack.encodeURIComponent,
  payloadResponseOnly: true,
  comment: "Encode the SKU to make it suitable for querying the Magento API with",
  retryOnServiceExceptions: true,
  timeout: Duration.minutes(3),
});

问题

我应该如何在this.encodeSku中拼接迭代器当前的索引值与SKU数组?理想的写法类似input: "$.arrayOfSkus"["$.iterator.index"]。


解决方法

方法一:修改迭代器Lambda直接返回当前SKU

Step Functions的Path语法不支持直接嵌套引用数组索引,最简单的方式是在迭代器Lambda里直接计算并返回当前索引对应的SKU:

  1. 更新迭代器Lambda的代码:
exports.handler = async (event) => {
  const currentIndex = event.iterator?.index || 0;
  const arrayOfSkus = event.arrayOfSkus;
  
  const isDone = currentIndex >= arrayOfSkus.length;
  const currentSku = isDone ? null : arrayOfSkus[currentIndex];

  return {
    index: currentIndex + 1, // 准备下一次迭代的索引
    isDone: isDone,
    currentSku: currentSku,
    arrayOfSkus: arrayOfSkus // 保留原数组供后续流程使用
  };
};
  1. 在CDK的encodeSku配置中直接引用返回的currentSku:
this.encodeSku = new LambdaInvoke(this, "Encode Simple Product SKU", {
  lambdaFunction: stepFunctionTasksLambdaStack.encodeURIComponent,
  payloadResponseOnly: true,
  comment: "Encode the SKU to make it suitable for querying the Magento API with",
  retryOnServiceExceptions: true,
  timeout: Duration.minutes(3),
  inputPath: "$.currentSku" // 直接传递当前SKU给编码Lambda
});

方法二:用Step Functions内置函数提取(无需修改Lambda)

如果不想改动迭代器Lambda,可以通过Pass状态结合States.ArrayGetItem内置函数来提取指定索引的SKU:

  1. 添加一个Pass状态来处理数组索引提取:
const getCurrentSku = new Pass(this, "Get Current SKU", {
  // 使用ArrayGetItem函数,参数为数组路径和索引路径
  result: Result.fromString(JsonPath.arrayGetItem('$.arrayOfSkus', '$.iterator.index')),
  resultPath: '$.currentSku' // 将提取结果存入currentSku字段
});
  1. 调整状态链的顺序:
    将iterator的下一个状态设置为getCurrentSku,再将getCurrentSku的下一个状态设置为encodeSku,同时保持encodeSku的inputPath为"$.currentSku"即可。

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:25:54