"The connection with the server was terminated abnormally" 当上传到 EC2 实例上的 S3 TransferUtility.UploadAsync

"The connection with the server was terminated abnormally" when uploading to to S3 TransferUtility.UploadAsync on EC2 instance

我得到的错误是:

The thread 0xffc has exited with code 0 (0x0).
Exception thrown: 'System.IO.IOException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.IOException' in Anjuna1.dll
Exception thrown: 'System.IO.IOException' in System.Private.CoreLib.dll
Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware:Error: An unhandled exception has occurred: The write operation failed, see inner exception.

System.IO.IOException: The write operation failed, see inner exception. ---> 
System.Net.Http.WinHttpException: The connection with the server was 
terminated abnormally
   --- End of inner exception stack trace ---

此处完整堆栈跟踪:https://pastebin.com/BGny5ULG

代码(.net core 2)如下:

    private async Task S3UploadFileAsync(string fileName, Stream stream)
    {
        using (IAmazonS3 client = new AmazonS3Client(Amazon.RegionEndpoint.EUWest2))
        {
            var uploadRequest = new TransferUtilityUploadRequest
            {
                InputStream = stream,
                BucketName = "******-*****",
                CannedACL = S3CannedACL.AuthenticatedRead,
                Key = fileName
            };
            TransferUtility fileTransferUtility = new TransferUtility(client);
            try
            {

                await fileTransferUtility.UploadAsync(uploadRequest);
            }
            catch (System.Exception e)
            {
                throw e;
            }

        }
    }

当 运行 在我的本地计算机 (Windows 10) 上时,上面的代码工作正常,而不是在 EC2 实例 (Windows Server 2016) 上。

我已经尝试制作 S3 存储桶 public,认为这是一个权限问题(仍然无法正常工作)。

我认为这可能是 windows 防火墙或 EC" 实例安全组的问题,所以我安装了 AWS CLI 并可以毫无问题地使用它上传到 S3 实例。

不管我上传什么,我都试过大文件、小文件甚至空文件。

捕获到异常大约需要 30 秒,所以感觉好像超时了。将代码更改为不存在的 BucketName 会导致相同的症状,这让我认为这与存储桶配置无关(我已将名称加星号)。

任何关于尝试建议的帮助都将不胜感激 - 我整天都在做这件事,但我 运行 没有想法......谢谢!

更新:此处的类似错误表明它与权限相关:https://matt40k.uk/2017/09/s3-errors/

该问题似乎与 S3 存储桶的权限有关,如果我注释掉以下行,则上传有效:

CannedACL = S3CannedACL.AuthenticatedRead,

它仍然不完美,因为如果没有那一行,我的应用程序就无法下载刚刚上传的文件 - 但至少我现在知道我应该把精力集中在哪里!

最终这看起来像是 AWS .NET SDK 的一个问题,因为它没有提供更好的错误消息。我在这里打开了一个问题:https://github.com/aws/aws-sdk-net/issues/890

更新:底层权限问题最终通过将 AmazonS3FullAccess 策略添加到 aws-elasticbeanstalk-ec2-role 来解决,正如此处评论中所建议的:Grant S3 access to Elastic Beanstalk instances

我在使用 ASP.NET Core 2.0 应用程序将文件上传到 S3 时遇到了同样的问题,希望它可能对某人有所帮助。 在我的例子中,异常的原因是 AmazonS3Client 的构造函数中的区域参数不正确。

var amazonS3Client = new AmazonS3Client(awsCredentials, Amazon.RegionEndpoint.USEast1);

所以我同意问题作者的想法,即 AWS .NET SDK 没有提供格式正确的详细错误消息。

我在尝试上传图片时遇到了同样的问题,我注释掉了以下行并且上传成功了:

CannedACL = S3CannedACL.PublicRead

在我的例子中,问题是存储桶本身的访问权限,它不允许 public 个对象。我更新了它以允许 public 个对象并且它起作用了。希望对你有帮助。