如何在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" });
关键部分说明
ResultSelector过滤逻辑
$.Contents是S3 listObjectsV2返回的对象列表数组- JSONPath表达式
[?(@.Key =~ /.*\\.png$/i)]会筛选出Key字段以.png(不区分大小写,比如.PNG也会匹配)结尾的对象;如果只需要严格匹配小写.png,去掉正则末尾的i即可。 "pngObjects.$"定义了过滤后结果的键名,后续任务可以通过这个键访问列表。
ResultPath的作用
- 设置
resultPath: "$.filteredPngs"后,过滤后的pngObjects数组会被存入状态机输入数据的filteredPngs字段中,后续Lambda任务可以直接读取event.filteredPngs.pngObjects拿到目标列表。
- 设置
注意事项
- 如果桶内文件数量超过1000,listObjectsV2会返回分页标记
NextContinuationToken,此时需要在Step Functions中添加循环逻辑:通过Choice状态判断是否存在该标记,若存在则继续调用listObjectsV2并传递ContinuationToken参数,直到所有页数据都被获取后再合并过滤(可以在循环中逐步收集结果,最后统一过滤)。
内容的提问来源于stack exchange,提问作者spettekaka
相关产品推荐
相关产品推荐

