首页 > 解决方案 > 为什么我修改后的存储桶策略不允许我的应用程序查看 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"
            },

任何建议或其他方法将不胜感激!

标签: amazon-web-servicesamazon-s3

解决方案


您似乎希望允许特定 IAM 用户访问存储桶。

如果是这样,那么您应该直接将该策略应用于 IAM 用户 ,而不使用存储桶策略。这将与您显示的策略相同,但Principal不是必需的,因为该策略直接应用于 IAM 用户。

如果该 IAM 用户是您需要检索对象的唯一方式,那么您可以:

  • 删除存储桶策略
  • 激活S3 阻止公共访问

推荐阅读