如何禁用(或重定向)调用并行Lambda函数的AWS Step函数的日志记录



我正在运行一个带有并行执行分支的AWS步骤函数。

每个分支单独成功,但整体功能失败,并出现以下错误:

States.DataLimitExceeded-状态/任务返回的结果大小超过了服务限制的最大字符数

然后,我从AWS找到了一篇文章,描述了这个问题,并提出了一个解决方案:

https://docs.aws.amazon.com/step-functions/latest/dg/connect-lambda.html

那篇文章说:

默认情况下,Lambda调用API在响应中包含日志。工作流中的多次Lambda调用可能会触发States.DataLimitExceeded错误。为了避免这种情况,请在调用Lambda函数时将"LogType"="None"作为参数

我的问题是到底放在哪里?我试着把它放在状态机定义的不同位置,但我得到了以下错误:

步骤函数不支持字段"LogType">

这个错误似乎与支持文章相反,所以也许我做错了!

如有任何建议,我们将不胜感激,提前表示感谢!

干杯

更新1:需要明确的是,这是一个平行函数,有26个平行分支。每个分支都有一个小的输出,如下例所示。该数据中最大的项目是LogResult,它(当base64解码时)只是计费信息。我认为这个信息乘以26导致了错误,所以我只想关闭这个LogResult!!!

{
"ExecutedVersion": "$LATEST",
"LogResult": "U1RBUlQgUmVxdWVzdElkOiBlODJjZTRkOS0zMjk2LTRlNDctYjcyZC1iYmEwMzI1YmM3MGUgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiBlODJjZTRkOS0zMjk2LTRlNDctYjcyZC1iYmEwMzI1YmM3MGUKUkVQT1JUIFJlcXVlc3RJZDogZTgyY2U0ZDktMzI5Ni00ZTQ3LWI3MmQtYmJhMDMyNWJjNzBlCUR1cmF0aW9uOiA3NzI5Ljc2IG1zCUJpbGxlZCBEdXJhdGlvbjogNzgwMCBtcwlNZW1vcnkgU2l6ZTogMTAyNCBNQglNYXggTWVtb3J5IFVzZWQ6IDEwNCBNQglJbml0IER1cmF0aW9uOiAxMTY0Ljc3IG1zCQo=",
"Payload": {
"statusCode": 200,
"body": {
"signs": 63,
"nil": ""
}
},
"SdkHttpMetadata": {
"HttpHeaders": {
"Connection": "keep-alive",
"Content-Length": "53",
"Content-Type": "application/json",
"Date": "Thu, 21 Nov 2019 04:00:42 GMT",
"X-Amz-Executed-Version": "$LATEST",
"X-Amz-Log-Result": "U1RBUlQgUmVxdWVzdElkOiBlODJjZTRkOS0zMjk2LTRlNDctYjcyZC1iYmEwMzI1YmM3MGUgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiBlODJjZTRkOS0zMjk2LTRlNDctYjcyZC1iYmEwMzI1YmM3MGUKUkVQT1JUIFJlcXVlc3RJZDogZTgyY2U0ZDktMzI5Ni00ZTQ3LWI3MmQtYmJhMDMyNWJjNzBlCUR1cmF0aW9uOiA3NzI5Ljc2IG1zCUJpbGxlZCBEdXJhdGlvbjogNzgwMCBtcwlNZW1vcnkgU2l6ZTogMTAyNCBNQglNYXggTWVtb3J5IFVzZWQ6IDEwNCBNQglJbml0IER1cmF0aW9uOiAxMTY0Ljc3IG1zCQo=",
"x-amzn-Remapped-Content-Length": "0",
"x-amzn-RequestId": "e82ce4d9-3296-4e47-b72d-bba0325bc70e",
"X-Amzn-Trace-Id": "root=1-5dd60be1-47c4669ce54d5208b92b52a4;sampled=0"
},
"HttpStatusCode": 200
},
"SdkResponseMetadata": {
"RequestId": "e82ce4d9-3296-4e47-b72d-bba0325bc70e"
},
"StatusCode": 200
}

我最近遇到了和您完全相同的问题。你还没有说你的Lambda在做什么或返回什么,但我发现AWS指的是任务在执行中的限制https://docs.aws.amazon.com/step-functions/latest/dg/limits.html#service-限制任务执行。

我发现我的lambda有一个非常长的响应,有成千上万个字符。对其进行修改,使lambda的响应更加合理,从而克服了阶跃函数中的错误。

我一周前遇到了这个问题。我解决的方法如下:

您可以定义将结果的哪一部分传输到下一步。

为此,您必须使用

"OutputPath":"$.part2",

在json输入中,您有

"第1部分":{"第1部分":{"procedure":"Delete_X">
},"第2部分":{"过程":"Load_X"}},

"第2部分":{"第1部分":{"procedure":"Delete_Y">
},"第2部分":{"过程":"Load_Y"}}

处理完第1部分后,请确保输出和与之相关的结果路径中没有发送第1部分。下面的步骤只需要发送第2部分。有了这个:"OutputPath":"$.part2",

让我知道这是否有助于

我陷入了同样的问题。Step函数对可以在两个状态之间传递的数据施加了32768个字符的限制。

https://docs.aws.amazon.com/step-functions/latest/dg/limits.html

也许你需要用不同的方式思考和分解你的问题?我就是这么做的。因为删除日志响应会给你一些弹性,但你的解决方案在一定限度后不会扩展。

我在步骤函数中处理大数据,方法是将结果存储在S3存储桶中,然后让状态机返回结果文件的路径(以及数据的简要摘要或PASS/FAIL等状态)。

如果DB更舒适的话,也可以使用它来完成同样的操作。

这种方式不必修改结果的当前格式,您只需传递引用,而不是大量数据,并且只要您愿意,它们就会被持久化。

Lambdas的开头看起来像这样,以确定输入是来自文件还是纯数据:

bucket_name = util.env('BUCKET_NAME')
if 'result_path' in input_data.keys():
# Results are in a file that is referenced.
try: 
result_path = input_data['result_path']
result_data = util.get_file_content(result_path, bucket_name)
except Exception as e:
report.append(f'Failed to parse JSON from {result_path}: {e}')
else:
# Results are just raw data, not a reference.
result_data = input_data

然后在Lambda结束时,他们将上传结果并返回该文件的方向:

import boto3
def upload_results_to_s3(bucket_name, filename, result_data_to_upload):
try:
s3 = boto3.resource('s3')
results_prefix = 'Path/In/S3/'
results_suffix = '_Results.json'
result_file_path = '' + results_prefix + filename + results_suffix
s3.Object(bucket_name, result_file_path).put(
Body=(bytes(json.dumps(result_data_to_upload, indent=2).encode('UTF-8')))
)
return result_file_path

result_path = upload_results_to_s3(bucket_name, filename, result_data_to_upload)
result_obj = {
"result_path": result_path,
"bucket_name": bucket_name
}
return result_obj

然后,下一个Lambda将包含第一个代码片段,以便从文件中获取输入。

步骤函数节点如下所示,其中Result将是上面python代码中的Result_obj:

"YOUR STATE": 
{ 
"Comment": "Call Lambda that puts results in file", 
"Type": "Task", 
"Resource": "arn:aws:lambda:YOUR LAMBDA ARN", 
"InputPath": "$.next_function_input", 
"ResultPath": "$.next_function_input", 
"Next": "YOUR-NEXT-STATE" 
}

您可以做的事情是,将"emptyOutputPath":"添加到您的json,中

"emptyOutputPath": "",
"part1": { "portion1": { "procedure": "Delete_X"
}, "portion2":{ "procedure": "Load_X" } },
"part2": { "portion1": { "procedure": "Delete_Y"
}, "portion2":{ "procedure": "Load_Y" } }

这将允许您执行"输出路径":"$.emptyOutputPath",它是空的,并将清除ResultPath。

希望能帮助

只是跟进这个问题以结束循环。

我基本上放弃了使用并行Lambda,转而使用AQS消息队列而不是

最新更新