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

如何在CDK StepFunction中列出S3桶对象并按后缀过滤后传递给Lambda?

在Step Functions中过滤S3的.png文件并传递给后续任务

你完全可以通过ResultSelector结合JSONPath表达式,直接在ListObjects任务中过滤出.png文件,不需要在后续Lambda中处理冗余数据,具体实现如下:

修改后的CallAwsService任务代码

new tasks.CallAwsService(this, 'ListObjects', {
  service: 's3',
  action: 'listObjectsV2',
  parameters: {
    Bucket: mybucket.bucketName,
  },
  iamResources: [mybucket.bucketArn],
  iamAction: 's3:ListBucket',
  // 用ResultSelector过滤出Key以.png结尾的对象
  resultSelector: {
    "pngObjects.$": "$.Contents[?(@.Key =~ /.*\\.png$/i)]"
  },
  // 指定过滤结果在状态机数据中的存储位置
  resultPath: "$.filteredPngs"
});

关键部分说明

  1. ResultSelector过滤逻辑

    • $.Contents是S3 listObjectsV2返回的对象列表数组
    • JSONPath表达式[?(@.Key =~ /.*\\.png$/i)]会筛选出Key字段以.png(不区分大小写,比如.PNG也会匹配)结尾的对象;如果只需要严格匹配小写.png,去掉正则末尾的i即可。
    • "pngObjects.$"定义了过滤后结果的键名,后续任务可以通过这个键访问列表。
  2. ResultPath的作用

    • 设置resultPath: "$.filteredPngs"后,过滤后的pngObjects数组会被存入状态机输入数据的filteredPngs字段中,后续Lambda任务可以直接读取event.filteredPngs.pngObjects拿到目标列表。

注意事项

  • 如果桶内文件数量超过1000,listObjectsV2会返回分页标记NextContinuationToken,此时需要在Step Functions中添加循环逻辑:通过Choice状态判断是否存在该标记,若存在则继续调用listObjectsV2并传递ContinuationToken参数,直到所有页数据都被获取后再合并过滤(可以在循环中逐步收集结果,最后统一过滤)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:32:15