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

时间:2019-07-12 14:05:21

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

当前,我正在尝试创建一系列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。我想让lambda完全不知道是从测试有效负载还是从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负载被传递给它;但是,如果可能的话,我试图将所有内容都放在一个有效载荷内,而不进行嵌套。

1 个答案:

答案 0 :(得分:0)

我可以看到您正在尝试实现良好的设计。尽管没有开箱即用的解决方案可以满足您的需求,但是我有一个不同的建议,您可能需要考虑。

  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
    }
  }
}

我希望这会有所帮助。

干杯:)