尝试从 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"。之后有一些选择,例如
- Create/Update
- 阅读
- 删除
我只选择了选项 1,create/update 假设所有可以创建的用户仍然可以看到。那是错误的。我需要 select 选项 1 和 2。哪种现在有意义。
我不得不删除我的存储并重新添加以进行调试。然后它也开始用于下载和上传。请记住 public,受保护的文件夹也很重要。
希望这对遇到同样问题的人有所帮助。
我尝试使用 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"。之后有一些选择,例如
- Create/Update
- 阅读
- 删除
我只选择了选项 1,create/update 假设所有可以创建的用户仍然可以看到。那是错误的。我需要 select 选项 1 和 2。哪种现在有意义。
我不得不删除我的存储并重新添加以进行调试。然后它也开始用于下载和上传。请记住 public,受保护的文件夹也很重要。
希望这对遇到同样问题的人有所帮助。