按照此处的示例Uploading Photos to Amazon S3 from a Browser,我可以将文件从浏览器上传到我的S3存储桶。但是,当我尝试通过添加以下语句来修改策略时,我会收到拒绝访问错误:
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::[MY_BUCKET]/${cognito-identity.amazonaws.com:sub}",
"arn:aws:s3:::[MY_BUCKET]/${cognito-identity.amazonaws.com:sub}*"
]
}
但是,以下语句允许我上传到存储桶:
{
"Effect": "Allow",
"Action": [
"*"
],
"Resource": [
"arn:aws:s3::[MY_BUCKET]/${cognito-identity.amazonaws.com:sub}",
"arn:aws:s3:::[MY_BUCKET]/${cognito-identity.amazonaws.com:sub}*"
]
}
我使用联合登录登录我的用户并将其放入AWS身份池。包含上述代码的策略由我的标识池的Authenticated角色承担。我已确认此身份标识存在于我的标识池中。我的所有研究都告诉我,我应该能够对自己的行为更加具体,所以我不知道这里出了什么问题。
修改
我意识到,首先要知道文件是如何进入存储桶的。我正在使用来自npm的aws-sdk和以下代码将图像文件上传到存储桶:
return new Promise(function (resolve, reject) {
const fileName = userId + '/' + utilities.getGUID();
s3.upload({
Key: fileName,
Body: file,
ACL: 'public-read'
}, function (err, data) {
if (err) {
dropzoneUtilities.setDropzoneFileCanceled(file);
console.log(err);
reject(err);
}
else {
dropzoneUtilities.setDropzoneFileComplete(file);
dropzoneUtilities.removeFile(file);
resolve({ data, name: file.name});
}
});
});
答案 0 :(得分:0)
请注意上传代码:
ACL: 'public-read'
文档在这一点上并不明确,但包含此内容需要s3:PutObjectAcl
权限。