C# 从Lambda调用时S3 GetObjectAsync上的间歇性挂起

C# 从Lambda调用时S3 GetObjectAsync上的间歇性挂起,c#,.net,amazon-s3,aws-lambda,C#,.net,Amazon S3,Aws Lambda,我有一个AWS Lambda,它是由S3存储桶上的ObjectCreated事件触发的。这个过程是这样的:一个新文件被放入bucket中,触发Lambda函数启动。Lambda从S3读取该文件并对其进行一些处理。我使用的是一个公共的AmazonS3Client,当Lambda启动时,它会旋转起来,以便在执行过程中共享客户端 我遇到一个问题,用于检索S3对象的GetObjectAsync调用似乎间歇性挂起。基本上,我的lambda函数在允许的最大持续时间内超时。我把时间从30秒增加到60秒,现在增

我有一个AWS Lambda,它是由S3存储桶上的
ObjectCreated
事件触发的。这个过程是这样的:一个新文件被放入bucket中,触发Lambda函数启动。Lambda从S3读取该文件并对其进行一些处理。我使用的是一个公共的
AmazonS3Client
,当Lambda启动时,它会旋转起来,以便在执行过程中共享客户端

我遇到一个问题,用于检索S3对象的
GetObjectAsync
调用似乎间歇性挂起。基本上,我的lambda函数在允许的最大持续时间内超时。我把时间从30秒增加到60秒,现在增加到300秒,仍然看到间歇性功能超时。我添加了一些调试日志,并将其缩小为:

LogMessage($"[GetS3File:GetObjectAsync]: {s3Bucket} | {remoteFileName}");

var re = await _s3Client.GetObjectAsync(s3Bucket, remoteFileName);

LogMessage($"[GetS3File:GetObjectAsync]: {s3Bucket} | {remoteFileName} | Finished");
当lambda函数超时时,我的日志显示第一条LogMessage语句,但不显示第二条,这意味着它正在进行
GetObjectAsync
调用,但从未从中出来。我尝试过摆弄超时设置:

// Adjust timeout settings based on https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-retry-timeout-sdk/
            var s3Config = new AmazonS3Config() { 
                RegionEndpoint = _region,
                MaxErrorRetry = 3, // number of retries
                Timeout = TimeSpan.FromSeconds(10) // new connection timeout
            };
但这似乎没有帮助-事实上,我似乎没有看到S3客户端报告任何类型的客户端重试或连接超时,或者至少没有记录。这让我怀疑这是否根本不是连接超时

这一过程的总体效果似乎与预期的一样——绝大多数函数调用都是成功的。但我已经看得够多了,我想追问为什么以及如何修复它。我曾多次提到VPC配置会影响Lambda-S3的连接性,但这里的情况似乎并非如此。我的Lambda没有VPC配置,几乎在所有情况下都能正常与S3 bucket交互

对于这里发生的事情,我是否应该考虑其他原因,或者是否可以添加其他调试或错误捕获,以便更好地了解
GetObjectAsync
调用的情况


编辑:所以在进一步分析之后,看起来我正在经历的是一个文件被上传到S3,我的lambda被触发并成功地处理了该文件。然而,几分钟后,我似乎再次看到lambda函数触发,试图处理同一个文件。第二次调用与第一次调用不同,但我确实多次看到第二次调用的RequestID,我假设是因为Lambda在超时后重试了。我仍然没有弄清楚1)为什么它会再次触发,通常是在文件处理后几分钟,2)即使假设它是因为额外的事件触发而触发的,如果文件可能不在那里,为什么它会挂起
GetObjectAsync
,vs返回为null,因为对象不再存在。

我猜您正在使用.net framework,并且需要
。在
GetObjectAsync
上配置等待(false)
。是的……是的,我使用的是.net核心和C。谢谢你的建议,我会试着加上!是否有文档解释了为什么需要这样做?接下来……我昨晚添加了
.ConfigureAwait(false)
,一夜之间它的性能似乎更好,但我将在白天观看它。但是,即使添加了
.ConfigureAwait(false)
,我也记录了同样的问题发生过一次。那么也许一夜之间的行为只是巧合?lambda调用的数量会影响对其他AWS服务的调用吗?ConfigureWait不是.net core的问题(它实际上只是一个框架问题)。但听起来还是像是僵局。啊!你的死锁注释让我检查了一些东西…所以我看到了对同一个S3对象的多个
GetObjectAsync
调用…是的,看起来当一个文件被删除时,它会触发lambda,它会开始处理该文件…但是另一个调用会尝试处理同一个文件吗?进程结束时会将其删除,因此我打赌在第二次调用尝试获取该文件期间或之前,该文件已丢失。现在来看看为什么ObjectCreated会触发多个调用。。。