【发布时间】:2020-10-23 23:54:25
【问题描述】:
我正在遍历所有对象的 s3 存储桶。我需要处理前缀中任何位置具有 .json 扩展名的所有文件。例如;
- /x/
- /x/1.json
- /x/2.json
- /x/y/
- /x/y/1.json
- /x/y/2.json
- /x/y/z/
我试图在我的状态机选择中使用通配符来仅转到下一个任务进行处理,前提是它是一个 json 文件。如果没有,我想进入下一个迭代,直到我得到一个 json 文件。下面是我在状态机中的“选择”。当 step 函数运行时,它在 TraversalChoice 上变灰,所以我只能想象我在定义通配符时做错了什么。如果有人能指出我正确的方向,我将不胜感激。谢谢!
"Traversal": {
"Type": "Task",
"Resource": "arn for lambda that get objects",
"Parameters": {
"NextContinuationToken.$": "$.traversal.NextContinuationToken"
},
"ResultPath": "$.traversal",
"Next": "TraversalChoice"
},
"TraversalChoice": {
"Type": "Choice",
"Choices": [{
"Not": {
"Variable": "$.traversal.Files.Key",
"StringMatches": "x/*.json"
},
"Next": "Traversal"
}],
"Default": "lambdaToProcess"
},
这里的上下文是检索所有对象的代码。
let params = {
Bucket: bucket,
MaxKeys: 1,
ContinuationToken: event.NextContinuationToken || null
};
if (prefix) params.Prefix = prefix;
try {
let response = await s3.listObjectsV2(params).promise();
return {
Files: response.Contents,
NextContinuationToken: response.NextContinuationToken || ""
}
【问题讨论】:
-
我看到的一个问题是您的 lambda 将响应放在
Files中,但这将是{"Contents":[]}形式的对象,因此它将包含大量文件的列表。 .. 您将需要引用"Variable": "$.traversal.Files.Contents[0].Key" and you would need to add some sort ofMap` 或迭代器状态之类的内容来遍历$.traversal.Files.Contents中的所有项目 -
我愿意。我想我应该包括那部分。迭代器按预期工作。我只需要捕获(或跳过)没有 .json 扩展名的对象,这样其他任务就不会尝试处理它。我按照这个例子。 rubenjgarcia.es/step-function-to-iterate-s3.
标签: node.js amazon-web-services aws-step-functions