Amazon web services AWS S3策略通配符(“*”)有效,但;s3:GetObject"&引用;s3:PutObject“的;,etc没有

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": [ "

通过以下示例,我可以将文件从浏览器上传到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}*"
        ]
    }
但是,以下语句允许我上传到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中的文件,那么这也是我应该拥有的权限吗?看起来不应该是这样。不,这使得任何人都可以下载该对象。