amazon-web-services - 将对象上传到 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;
}
}
}
解决方案
我想到了!原来它是我上传的“CannedACL = S3CannedACL.PublicRead”行。存储桶已正确配置为拒绝任何公共访问,但此行希望使上传的文件可公开访问。
该行现在是:
CannedACL = S3CannedACL.BucketOwnerFullControl,
因为这是我们对存储桶的访问设置。我希望错误更具体一点,但这就是我们得到的。我希望这可以帮助其他人解决这个问题!
推荐阅读
- rasa-nlu - Rasa 调度器提醒如何将消息返回给客户端,例如应用程序
- python - Django 和子进程:开发服务器在 signal.SIGTERM 上终止
- azure - 通过 Azure SQL 连接 Kentico
- python - DataFrame直方图分组并在同一图中
- python - 函数参数中的 Python 类型注释
- c++ - 如何使用索引命名变量以存储输入 mxArray?
- image-processing - 在此示例中,相关性如何对偶数大小的过滤器起作用?
- java - 模式匹配器返回意外值
- excel - VBA如何动态生成选项按钮的名称?
- css - 你如何使文本输入边框重叠?