Amazon web services AWS S3策略通配符(“*”)有效,但;s3:GetObject"&引用;s3:PutObject“的;,etc没有
通过以下示例,我可以将文件从浏览器上传到S3存储桶。但是,当我试图通过添加以下语句来修改策略以使其更具体时,我会得到一个拒绝访问错误:Amazon web services AWS S3策略通配符(“*”)有效,但;s3:GetObject"&引用;s3:PutObject“的;,etc没有,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,通过以下示例,我可以将文件从浏览器上传到S3存储桶。但是,当我试图通过添加以下语句来修改策略以使其更具体时,我会得到一个拒绝访问错误: { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "
{
"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}*"
]
}
但是,以下语句允许我上传到bucket:
{
"Effect": "Allow",
"Action": [
"*"
],
"Resource": [
"arn:aws:s3::[MY_BUCKET]/${cognito-identity.amazonaws.com:sub}",
"arn:aws:s3:::[MY_BUCKET]/${cognito-identity.amazonaws.com:sub}*"
]
}
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});
}
});
});
我使用联邦登录登录我的用户,并将其放入AWS标识池。包含上述代码的策略由我的标识池的已验证角色承担。我已确认此标识存在于我的标识池中。我所有的研究都告诉我,我应该能够更具体地对待我的行为,所以我不知道这里出了什么问题
编辑:
我意识到,首先了解文件是如何进入存储桶的可能会很有用。我正在使用npm的aws sdk和以下代码将图像文件上载到bucket:
{
"Effect": "Allow",
"Action": [
"*"
],
"Resource": [
"arn:aws:s3::[MY_BUCKET]/${cognito-identity.amazonaws.com:sub}",
"arn:aws:s3:::[MY_BUCKET]/${cognito-identity.amazonaws.com:sub}*"
]
}
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});
}
});
});
请在上载代码中注意:
ACL: 'public-read'
文档在这一点上并不明确,但包括这一点需要s3:PutObjectAcl
权限
添加“s3:PutObjectAcl”就成功了。非常感谢。我从Amazon的AWS示例中选择了“公共阅读”。不幸的是,我仍然没有找到关于它的含义的好文档,特别是当它与“authenticated read”选项相关时。公共阅读有什么问题吗?我使用“authenticated read'rs”上传的任何内容都会导致访问被拒绝。
public read
意味着任何知道URL的人都可以下载该对象——该对象是公共的,无需验证即可下载。如果您希望任何人都可以下载对象,这就是您想要的选项。如果我只希望与我的Cognito标识池关联的登录名能够查看和下载bucket中的文件,那么这也是我应该拥有的权限吗?看起来不应该是这样。不,这使得任何人都可以下载该对象。