当我使用下面的自定义策略时,使用 cyberduck 上传大文件(1G 及以上)时出现以下错误
文件访问被拒绝。请联系您的网站托管服务提供商寻求帮助
但是上传小文件(大约 200M)不是问题,而且我使用 cyberduck 和相同的登录凭据创建新文件夹和文件也没有问题。所以我肯定有读/写访问权限。
此外,如果我添加预定义策略 (AmazonS3FullAccess),那么大文件上传也可以正常工作。我有点困惑。我的策略如何限制大文件上传?我遗漏了什么?
我的政策
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::photoshoot2016"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::photoshoot2016/*"
}
]
}
AmazonS3FullAccess 策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
答案1
我继续研究,发现亚马逊建议对所有超过 100M 的文件使用分段上传(http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html),我猜这也是 cyberduck 所做的。
我最后要做的就是添加缺少的权限(ListMultipartUploadParts 和 ListBucketMultipartUploads)以启用分段上传。现在我的策略如下所示
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListMultipartUploadParts"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListMultipartUploadParts",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::photoshoot2016"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::photoshoot2016/*"
}
]
}
我通过启用 bucket 日志记录找到了主要线索,其中有大量 REST.GET.UPLOADS 的“AccessDenied 243”错误。Amazon 的 Policy Simulator 也非常有用,可以找出缺少的内容以及应该将其放在哪里。