尝试从 aws s3 存储桶下载图片时访问被拒绝

Access Denied when trying to download a picture from the aws s3 bucket

我尝试使用 AWSS3transferutility 从 aws s3 存储桶下载照片并将它们显示在 ios 应用程序的 imageView 上,但是,当它给我一个访问被拒绝的错误时。我确定存储桶对 public 是开放的,并且我设置了 cognito,所以我不知道为什么会发生这种情况,有人知道吗?

func getPicture() {
        let tranferUtility = AWSS3TransferUtility.default()
        let expression = AWSS3TransferUtilityDownloadExpression()

        tranferUtility.downloadData(fromBucket: bucket, key: self.currentQuestionData!._userId!, expression: expression){ (task, url, data, error) in
            if error != nil{
                print(error!)
            }
            DispatchQueue.main.async(execute: {
                self.imageView.image = UIImage(data: data!)
            })

        }
    }


//bucket policy
{
    "Id": "Policy1562706569188",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1562706565258",
            "Action": "s3:*",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::schooled-deployments-mobilehub-969166170",
            "Principal": "*"
        }
    ]
}

控制台中显示的错误信息是

"Error Domain=com.amazonaws.AWSS3TransferUtilityErrorDomain Code=2 "(null)" UserInfo={Server=AmazonS3, Error={ Code = AccessDenied; HostId = "GHIlY6U4nxxqKQ/Bn8lf3FWjFZZmVhxn3DDjc8YUZY2gkguT6qdqhS54PL85AL7KaSU0Q9gSckw="; Message = "Access Denied"; RequestId = EA34AC42C00AE399;"

一些操作是在bucket上执行的,而其他操作是在object级别上执行的。

替换此行:

"Resource": "arn:aws:s3:::schooled-deployments-mobilehub-969166170",

有了这个:

"Resource": [
    "arn:aws:s3:::schooled-deployments-mobilehub-969166170",
    "arn:aws:s3:::schooled-deployments-mobilehub-969166170/*"
]

这将允许访问对象。

好吧,我遇到了同样的错误并且一直在想为什么我应该制作桶 public 来摆脱这个错误。然后我意识到我犯了一个愚蠢的错误。当我通过 Amplify CLI ($amplify add storage) 添加此存储时,有一个选项要求 "Auth users" 或 "Auth & Guest"。之后有一些选择,例如

  1. Create/Update
  2. 阅读
  3. 删除

我只选择了选项 1,create/update 假设所有可以创建的用户仍然可以看到。那是错误的。我需要 select 选项 1 和 2。哪种现在有意义。

我不得不删除我的存储并重新添加以进行调试。然后它也开始用于下载和上传。请记住 public,受保护的文件夹也很重要。

希望这对遇到同样问题的人有所帮助。