我正在尝试建立一个接收文件(图像,视频)并将其上传到我的s3存储桶的服务。我们希望从公共存储桶转移到只能由特定用户访问的存储桶,我的帐户理论上具有以下功能:
我已更新代码以使用新的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;
}
}
}
答案 0 :(得分:0)
您能为我尝试一些东西,看看是否可行?
完全从存储桶中删除存储桶策略,转到IAM,找到您的用户/组/角色,并针对您的用户附加一个策略,以授予您对S3的访问权限。对于测试,应该有一个名为S3FullAccess
的托管策略,将其附加并进行测试。要找出您需要附加该用户/组/角色的角色,请在本地cli中运行aws sts get-caller-identity
,它会告诉您。
注意:如果可行,并且您计划在ec2实例上运行此代码,则需要将这些权限分配给ec2实例角色。
现在,如果可行,请删除完全访问策略,创建作用域缩小的策略,然后附加该策略。最好使用最小特权原则,但是我认为为了简单起见,让它起作用,在我们测试它时可以授予完全访问权限。
我通常使用的经验法则是,如果存储桶需要跨帐户访问,请使用存储桶策略;如果存储桶位于同一帐户中,请使用IAM权限来管理访问。这将使一切管理变得一致且容易进行。
答案 1 :(得分:0)
我知道了!原来是我上传的“ CannedACL = S3CannedACL.PublicRead”行。存储桶已正确配置为拒绝任何公共访问,但是此行希望使上传的文件可公开访问。
现在该行是
CannedACL = S3CannedACL.BucketOwnerFullControl,
因为这是存储桶的访问设置。我希望该错误更为具体,但这就是我们得到的。希望这对其他人有帮助!