当前,我正在尝试创建一系列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
负载被传递给它;但是,如果可能的话,我试图将所有内容都放在一个有效载荷内,而不进行嵌套。
答案 0 :(得分:0)
我可以看到您正在尝试实现良好的设计。尽管没有开箱即用的解决方案可以满足您的需求,但是我有一个不同的建议,您可能需要考虑。
GetDailyEmailsResults
,而不是在您提供的输入中。这是我要提出的状态机(语法上可能并不完全正确,但是您会有所想法的。)
{
"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
}
}
}
我希望这会有所帮助。
干杯:)