首页 > 解决方案 > 将对象上传到 s3 存储桶时访问被拒绝错误

问题描述

我正在尝试设置一个接收文件(图像、视频)并将其上传到我的 s3 存储桶的服务。我们想从一个公共存储桶转移到一个只能由特定用户访问的存储桶,我的帐户理论上有:

桶访问控制列表

我更新了我的代码以使用我的新 s3 凭据和存储桶(我已使用此代码上传到其他基于 s3 的存储桶系统)。但是现在我指向了这个新存储桶,我得到的只是“拒绝访问”响应。在我点击 null 之前,内部异常也是“拒绝访问”。

到目前为止,我已经尝试了很多方法,包括将此策略添加到存储桶中:

{
    "Id": "Policy1553720963443",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1553720961364",
            "Action": "s3:*",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<BUCKETNAME>/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<iamid>:user/<me>@<company>"
                ]
            }
        }
    ]
}

这个 CORS 配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
    <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

甚至将自己添加到具有此策略的组中:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": "*"
    },
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::<BUCKETNAME>/*",
            "arn:aws:s3:::<BUCKETNAME>"
        ]
    }
]

}

它们都没有对“拒绝访问错误”产生任何影响

有谁可以帮我离开这里吗?有什么方法可以获取有关拒绝访问错误的更多信息?我尝试使用 fiddler 从 aws 获取详细的响应,但使用 fiddler 似乎会导致网关超时错误,所以这无济于事。

任何建议将不胜感激。谢谢!

〜乔希

编辑,这是我要上传的代码:

        private static readonly string serviceURL = ConfigurationManager.AppSettings["ServiceURL"];
    private static readonly string BucketName = ConfigurationManager.AppSettings["BucketName"];
    private static readonly long UploadPartSize = Convert.ToInt64(ConfigurationManager.AppSettings["UploadPartSize"]);

    private static AmazonS3Config config = new AmazonS3Config { ServiceURL = serviceURL, ForcePathStyle = true, RegionEndpoint = RegionEndpoint.USWest2 };
    private readonly AmazonS3Client _s3Client = new AmazonS3Client(config);

private async Task<string> UploadFileAsync(string contentType, Stream stream, long length, UploadVideoParams @params, CancellationToken token)
    {
        using (var fileTransferUtility = new TransferUtility(_s3Client))
        {
            var now = DateTime.UtcNow;
            var key = MakeS3Key(@params);

            try
            {
                await fileTransferUtility.UploadAsync(new TransferUtilityUploadRequest
                {
                    BucketName = BucketName,
                    AutoCloseStream = true,
                    AutoResetStreamPosition = false,
                    InputStream = new WrapperStream(stream, length),
                    PartSize = UploadPartSize,
                    StorageClass = S3StorageClass.Standard,
                    Key = key,
                    CannedACL = S3CannedACL.PublicRead,
                    ContentType = contentType
                }, token).ConfigureAwait(false);

                LogInfo(@params.TransactionId, "Made Upload Async call. Key: " + key);
                return key;
            }
            catch (Exception e)
            {
                await fileTransferUtility.AbortMultipartUploadsAsync(BucketName, now, token).ConfigureAwait(false);
                HandleError(@params.TransactionId, e);
                throw e;
            }
        }
    }

标签: amazon-web-servicesamazon-s3

解决方案


我想到了!原来它是我上传的“CannedACL = S3CannedACL.PublicRead”行。存储桶已正确配置为拒绝任何公共访问,但此行希望使上传的文件可公开访问。

该行现在是:

CannedACL = S3CannedACL.BucketOwnerFullControl,

因为这是我们对存储桶的访问设置。我希望错误更具体一点,但这就是我们得到的。我希望这可以帮助其他人解决这个问题!


推荐阅读