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传递给它的有效负载;但是,如果可能的话,我试图将所有内容都包含在一个有效负载中,而不进行嵌套。
我可以看出你正在努力实现一个好的设计。尽管没有现成的解决方案可以满足您的需求,但我有一个您可能需要考虑的不同建议。
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。
干杯:)
| 归档时间: |
|
| 查看次数: |
5125 次 |
| 最近记录: |