【问题标题】:AWS Stepfunctions Result Path - Append to JSON instead of nestingAWS Stepfunctions 结果路径 - 附加到 JSON 而不是嵌套
【发布时间】:2019-07-12 14:05:21
【问题描述】:

目前,我正在尝试创建一系列 Lambda,它们将从 StepFunctions 输入中执行给定的特定负载。我一切正常;但是,这不是我想要的。

我终于掌握了 InputPath、ResultPath 和 OutputPath 之间的区别。我现在唯一的问题是允许 ResultPath “附加”返回的 JSON,而不是将其嵌套在有效负载中。

这是状态机:

{
  "StartAt": "GetDailyEmails",
  "States": {
    "GetDailyEmails": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:region:account:function:DailyEmailExtractor",
      "InputPath": "$.GetDailyEmailsInputs",
      "ResultPath": "$.TransformEmailsToCSVInputs.GetDailyEmailsResults",
      "Next": "TransformEmailsToCSV"
    },
    "TransformEmailsToCSV": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:region:account:function:EmailTransform",
      "InputPath": "$.TransformEmailsToCSVInputs",
      "End": true
    }
  }
}

这是我提供的输入:

{
    "GetDailyEmailsInputs": {
        "secret_name": "email_password",
        "subject_contains": "stuff",
        "json_output_file_name": "test_emails",
        "bucket_name": "emails"
    },
    "TransformEmailsToCSVInputs": {
        "csv_output_file_name": "email_errors"
    }
}

这是我收到的输出:

{
  "GetDailyEmailsInputs": {
    "secret_name": "email_password",
    "subject_contains": "stuff",
    "json_output_file_name": "test_emails",
    "bucket_name": "emails"
  },
  "TransformEmailsToCSVInputs": {
    "csv_output_file_name": "apex_errors",
    "GetDailyEmailsResults": {
      "object_key": "raw_emails/test_emails.json",
      "bucket_name": "emails"
    }
  }
}

虽然这确实有效,但我必须手动提取 TransformEmailsToCSV lambda 中的 GetDailyEmailsResults。我想让 lambdas 完全不知道它们是从测试有效负载还是从 stepfunctions 执行的。

这是我想要接收的输出:

{
  "GetDailyEmailsInputs": {
    "secret_name": "email_password",
    "subject_contains": "stuff",
    "json_output_file_name": "test_emails",
    "bucket_name": "emails"
  },
  "TransformEmailsToCSVInputs": {
    "csv_output_file_name": "apex_errors",
    "object_key": "raw_emails/test_emails.json",
    "bucket_name": "emails"
  }
}

这样,我就不需要考虑到 GetDailyEmailsResults 嵌套字典。

我可以用一种通用的方式来写这个,它只是一个 data 有效载荷被传递给它;但是,如果可能的话,我试图将所有内容都包含在单个有效负载中而不进行嵌套。

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-step-functions


    【解决方案1】:

    我可以看到您正在努力实现一个好的设计。虽然没有开箱即用的解决方案来满足您的需求,但我有一个不同的建议您可能需要考虑。

    1. 以不同的方式输入GetDailyEmailsResults,而不是在您提供的输入中。
    2. 根据需要从 JSON 中挑选,从阶跃函数数据中为 lambda 创建输入。

    这是我提出的状态机(在语法上可能不完全正确,但你会明白的)。

    {
      "StartAt": "GetDailyEmails",
      "States": {
        "GetDailyEmails": {
          "Type": "Task",
          "Resource": "arn:aws:lambda:region:account:function:DailyEmailExtractor",
          "InputPath": "$.GetDailyEmailsInputs",
          "ResultPath": "$.GetDailyEmailsResults",
          "Next": "TransformEmailsToCSV"
        },
        "TransformEmailsToCSV": {
          "Type": "Task",
          "Resource": "arn:aws:states:::lambda:invoke",
          "Parameters":{  
                "FunctionName":"EmailTransform",
                "Payload":{  
                   "csv_output_file_name": "apex_errors",
                   "object_key.$": "$.GetDailyEmailsResults.object_key",
                   "bucket_name.$": "$.GetDailyEmailsResults.bucket_name"
                }
             },
          "End": true
        }
      }
    }
    

    我希望这会有所帮助。

    干杯:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2020-08-05
      • 2022-10-19
      相关资源
      最近更新 更多