访问被拒绝错误将对象上传到s3存储桶

时间:2019-03-27 21:36:22

标签: amazon-web-services amazon-s3

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

Bucket Access Control List

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

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

{
    "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;
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

您能为我尝试一些东西,看看是否可行?
完全从存储桶中删除存储桶策略,转到IAM,找到您的用户/组/角色,并针对您的用户附加一个策略,以授予您对S3的访问权限。对于测试,应该有一个名为S3FullAccess的托管策略,将其附加并进行测试。要找出您需要附加该用户/组/角色的角色,请在本地cli中运行aws sts get-caller-identity,它会告诉您。 注意:如果可行,并且您计划在ec2实例上运行此代码,则需要将这些权限分配给ec2实例角色。

现在,如果可行,请删除完全访问策略,创建作用域缩小的策略,然后附加该策略。最好使用最小特权原则,但是我认为为了简单起见,让它起作用,在我们测试它时可以授予完全访问权限。

我通常使用的经验法则是,如果存储桶需要跨帐户访问,请使用存储桶策略;如果存储桶位于同一帐户中,请使用IAM权限来管理访问。这将使一切管理变得一致且容易进行。

答案 1 :(得分:0)

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

现在该行是

CannedACL = S3CannedACL.BucketOwnerFullControl,

因为这是存储桶的访问设置。我希望该错误更为具体,但这就是我们得到的。希望这对其他人有帮助!