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

时间:2019-07-09 00:32:06

标签: swift xcode amazon-web-services amazon-s3 aws-sdk

我尝试使用AWSS3transferutility从aws s3存储桶下载照片,并将它们显示在ios应用程序的imageView中,但是,这给了我拒绝访问错误。我确信该存储桶是向公众开放的,并且我设置了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": "*"
        }
    ]
}

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

  

“错误域= com.amazonaws.AWSS3TransferUtilityErrorDomain代码= 2   “(null)” UserInfo = {服务器= AmazonS3,错误= {       代码= AccessDenied;       HostId =“ GHIlY6U4nxxqKQ / Bn8lf3FWjFZZmVhxn3DDjc8YUZY2gkguT6qdqhS54PL85AL7KaSU0Q9gSckw =”;       消息=“访问被拒绝”;       RequestId = EA34AC42C00AE399;“

2 个答案:

答案 0 :(得分:1)

某些操作在 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/*"
]

这将允许访问对象。

答案 1 :(得分:0)

好吧,我也遇到了同样的错误,并一直在思考为什么我应该公开该存储桶以解决该错误。然后我意识到自己犯了一种愚蠢的错误。当我通过Amplify CLI($ amplify add storage)添加此存储时,有一个选项要求“ Auth users”或“ Auth&Guest”。之后,有一些选择,例如

  1. 创建/更新
  2. 阅读
  3. 删除

我只选择了选项1,创建/更新,假设所有可以创建的用户仍然可以看到。那就是错误。我需要同时选择选项1和2。哪种类型才有意义。

我必须删除我的存储并添加回去调试它。然后它也开始工作以进行下载和上传。请记住,受保护的公用文件夹也很重要。

希望这可以帮助遇到相同问题的人。