如何在AWS Step Functions中转换ListObjectsV2结果为指定Key结构数组?
问题
我有AWS Step Functions中ListObjectsV2任务的输出结果:
{ "Contents": [ { "ETag": "\"86c12c034bc6c30cb89b500b954c188f\"", "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_1.csv", "LastModified": "2023-02-09T13:46:20Z", "Size": 796014, "StorageClass": "STANDARD" }, { "ETag": "\"58e4a770e0f66073b00d185df500f07f\"", "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_2.csv", "LastModified": "2023-02-09T13:47:20Z", "Size": 934038, "StorageClass": "STANDARD" }, { "ETag": "\"460abd0de64d5cb67e8f0d46878cb1ef\"", "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_3.csv", "LastModified": "2023-02-09T13:46:57Z", "Size": 794264, "StorageClass": "STANDARD" }, { "ETag": "\"1bfedc3dc92e4ba8d04e24b9b5a0ed58\"", "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_4.csv", "LastModified": "2023-02-09T13:46:24Z", "Size": 788756, "StorageClass": "STANDARD" }, { "ETag": "\"9d6c434ce5ebdf203a790fbcf19338dc\"", "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_5.csv", "LastModified": "2023-02-09T13:47:07Z", "Size": 831156, "StorageClass": "STANDARD" } ], "IsTruncated": false, "KeyCount": 5, "MaxKeys": 1000, "Name": "vita-internal-text-classification-dev-183576513728", "Prefix": "55271f52fffe4461a2ee3228ebb97157" }
我需要把处理后的结果传递到下一个状态,要求格式为每个元素包含Key字段的数组:
[ { "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_1.csv" }, { "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_2.csv" }, { "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_3.csv" }, { "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_4.csv" }, { "Key": "55271f52fffe4461a2ee3228ebb97157/input/batch_5.csv" } ]
之前尝试用ResultPath设置为$.Contents[*].Key或$.Contents[*].['Key'],得到的结果是字符串数组,不符合需求:
[ "55271f52fffe4461a2ee3228ebb97157/input/batch_1.csv", "55271f52fffe4461a2ee3228ebb97157/input/batch_2.csv", "55271f52fffe4461a2ee3228ebb97157/input/batch_3.csv", "55271f52fffe4461a2ee3228ebb97157/input/batch_4.csv", "55271f52fffe4461a2ee3228ebb97157/input/batch_5.csv" ]
解决方案
可以用AWS Step Functions的内置JSONPath转换语法来实现需求,两种方法任选:
方法1:用Pass状态构造目标格式
在ListObjectsV2任务后面添加一个Pass状态,通过Parameters字段遍历原数组,生成每个带Key字段的对象:
{ "Type": "Pass", "Parameters": { "Keys.$": "$.Contents[*].{Key: Key}" }, "ResultPath": "$.ProcessedKeys", "Next": "YourNextState" }
这里的$.Contents[*].{Key: Key}是Step Functions支持的转换写法,会自动遍历Contents数组,为每个元素生成只包含Key字段的对象,最终得到你需要的数组格式。
方法2:用Map状态(适合后续批量处理场景)
要是之后还要批量处理每个Key对象,直接用Map状态更方便。指定ItemsPath为$.Contents,然后在迭代器里只传递Key字段:
{ "Type": "Map", "ItemsPath": "$.Contents", "Parameters": { "Key.$": "$$.Map.Item.Value.Key" }, "Iterator": { "StartAt": "YourBatchTask", "States": { "YourBatchTask": { "Type": "Task", "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:YourFunction", "End": true } } }, "Next": "AfterMapState" }
这样每个迭代任务收到的参数就是{Key: "..."}的格式,无需额外处理。
结果验证
用方法1的话,$.ProcessedKeys字段里就是你需要的目标数组,直接传给下一个状态即可。
内容的提问来源于stack exchange,提问作者Or Shemtov
相关产品推荐
相关产品推荐

