AWS S3 Policy通配符(“*”)有效,但“s3:GetObject”,“s3:PutObject”等不会

时间:2016-11-12 23:19:43

标签: amazon-web-services amazon-s3

按照此处的示例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});
            }

        });
    });

1 个答案:

答案 0 :(得分:0)

请注意上传代码:

ACL: 'public-read'

文档在这一点上并不明确,但包含此内容需要s3:PutObjectAcl权限。

http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html#using-with-s3-actions-related-to-objects