【问题标题】:AWS State Machine Choice WildcardsAWS 状态机选择通配符
【发布时间】:2020-10-23 23:54:25
【问题描述】:

我正在遍历所有对象的 s3 存储桶。我需要处理前缀中任何位置具有 .json 扩展名的所有文件。例如;

  1. /x/
  2. /x/1.json
  3. /x/2.json
  4. /x/y/
  5. /x/y/1.json
  6. /x/y/2.json
  7. /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 of Map` 或迭代器状态之类的内容来遍历 $.traversal.Files.Contents 中的所有项目
  • 我愿意。我想我应该包括那部分。迭代器按预期工作。我只需要捕获(或跳过)没有 .json 扩展名的对象,这样其他任务就不会尝试处理它。我按照这个例子。 rubenjgarcia.es/step-function-to-iterate-s3.

标签: node.js amazon-web-services aws-step-functions


【解决方案1】:

您能否提供有关执行历史的更多信息?在执行历史记录中,您能否提供选择状态的输入?可能存储在那里的值与预期的形式不完全匹配。

【讨论】:

    【解决方案2】:

    我想通了。对我来说这是一个愚蠢的错误。问题是 Files 会根据您将 MaxKeys 设置为的数字返回一个数组。

    "Variable": "$.traversal.Files.Key"
    

    应该是……

    "Variable": "$.traversal.Files[0].Key"
    

    最后,因为我只打算一次处理一个文件,所以我更改了代码以返回密钥 traversal.File。

     "TraversalChoice": {
                  "Type": "Choice",
                  "Choices": [{
                    "Not": {
                      "Variable": "$.traversal.File",
                      "StringMatches": "*.json"
                    },
                    "Next": "Traversal"
                  }],
                  "Default": "lambdaToProcess"
                },
    

    【讨论】:

      猜你喜欢
      • 2021-03-24
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2015-09-02
      • 2015-06-15
      • 1970-01-01
      • 2020-03-02
      • 2019-01-02
      相关资源
      最近更新 更多