amazon-web-services - 为什么我修改后的存储桶策略不允许我的应用程序查看 AWS 对象的 URL?
问题描述
问题
我们有一个由具有管理员角色的 IAM 用户创建的 AWS S3 存储桶。
图像存储在此存储桶中,我必须检索这些图像的 URL,以便用户可以在应用程序中查看它们。目前,我们能够存储这些图像并在我们的应用程序中查看它们,但是查看存储桶中对象的权限已关闭“阻止公共访问”,并且还有一个所有主体都可以查看对象的存储桶策略。这在下面进一步显示。URL 由我的存储桶的基地址构成,并附加了密钥信息。
我试图引入一个新的不太宽松的存储桶策略,如下所示。但是使用此策略,我的应用程序将不会显示图像。在这两种情况下,也可以使用 AWS CLI GetObject 检索图像。
描述
该应用程序使用适用于 C# 的 AWS 开发工具包。IAM 账户的凭证已使用 AWS 资源管理器进行存储。
访问密钥和秘密访问密钥由 AWS Explorer 存储在凭证文件中并由代码使用。
用于在存储桶中插入图像的代码示例:
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
{
BucketName = bucketName,
Key = subdirectoryPath + "/" + fileName,
Verb = HttpVerb.PUT,
Expires = DateTime.Now.AddDays(2)
};
string path = client.GetPreSignedURL(request);
HttpWebRequest httpRequest = WebRequest.Create(path) as HttpWebRequest;
httpRequest.Method = "PUT";
httpRequest.Contentength = fileData.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(fileData, 0, fileData.Length);
requestStream.Close();
HttpWebResponse response = httpRequest.GetResponse() as HttpWebResponse;
配置设置:
此存储桶已关闭权限中的“阻止所有公共访问”。(今后需要加强这一点)
我目前将对象所有权作为存储桶所有者的首选。但也试图将其关闭。
使用下面的策略,所有图像都会显示在我的应用程序中。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mybucket/*"
...
当我如下修改 Principal 时,我在应用程序中看不到图像:
"Principal": {
"AWS": "arn:aws:iam::accountnumber:user/myuser"
},
任何建议或其他方法将不胜感激!
解决方案
您似乎希望仅允许特定 IAM 用户访问存储桶。
如果是这样,那么您应该直接将该策略应用于 IAM 用户 ,而不使用存储桶策略。这将与您显示的策略相同,但Principal
不是必需的,因为该策略直接应用于 IAM 用户。
如果该 IAM 用户是您需要检索对象的唯一方式,那么您可以:
- 删除存储桶策略
- 激活S3 阻止公共访问
推荐阅读
- r - 如何更改特定行和列中的 NA 值?
- javascript - 返回一个 Promise 对象响应
- odoo - 如何更改 Odoo 服务器版本?
- flutter - 如何使此代码自动从 Firebase 获取数据(无需按下浮动操作按钮)?我是 Flutter 的新手
- java - 参数化测试在并行执行中不起作用
- laravel - Laravel 护照没有正确加载私钥
- c - 知道什么程序触发了 Windows 中的其他程序
- ios - 如何在 SwiftUI 中获取 TabView 偏移量
- javascript - 在按钮使用 Ajax 更改状态时将“更改...”添加到按钮
- javascript - 选择 span 元素时,Javascript 选择 API :: containsNode() 不返回 true