AWS Stepfunctions 结果路径 - 附加到 JSON 而不是嵌套

Tho*_*lor 5 amazon-web-services aws-lambda aws-step-functions

目前,我正在尝试创建一系列 Lambda,这些 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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我提供的输入:

{
    "GetDailyEmailsInputs": {
        "secret_name": "email_password",
        "subject_contains": "stuff",
        "json_output_file_name": "test_emails",
        "bucket_name": "emails"
    },
    "TransformEmailsToCSVInputs": {
        "csv_output_file_name": "email_errors"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我收到的输出:

{
  "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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

这是我试图接收的输出:

{
  "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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Dha*_*val 3

我可以看出你正在努力实现一个好的设计。尽管没有现成的解决方案可以满足您的需求,但我有一个您可能需要考虑的不同建议。

  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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。

干杯:)