Aws S3 AccessDenied:上传对象时

中交所

我有一个名为 .s3 的存储桶MyBucket

权限如下: 在此处输入图片说明

桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::MyBucket/files/*"
            ]
        }
    ]
}

在存储桶内,我有一个名为files. 在里面files,对象可以被公众看到

对于 IAM 用户,我在下面附加了内联策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::MyBucket/files/*"
        }
    ]
}

当我使用 nodejs 将对象上传到存储桶时:

s3.upload({
            ACL: 'public-read',
            Bucket: this.app.settings.aws.s3.bucket,
            Body: bufferFromFile,
            Key: `files/${result.id}/${data.fileName}`,
        }, {}).promise();

我有AccessDenied: Access Denied错误。

如何解决?

更新 1:

我尝试添加s3:PutObject评论建议的存储桶策略,但错误仍然相同。
我正在使用 EC2 来托管 nodejs 代码

更新 2
我尝试使用下面的 CLI 将一个对象上传到存储桶并且它可以工作。

aws s3 cp s3Test.html s3://MyBucket/files/

更新 3

aws s3api put-object --bucket MyBucket --key files/s3Test.html --body s3Test.html --acl public-read

An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

更新 4

只是意识到在同一个 IAM 用户中有另一个可能相关的托管策略。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetAccessPoint",
                "s3:PutAccountPublicAccessBlock",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAllMyBuckets",
                "s3:ListAccessPoints",
                "s3:ListJobs",
                "s3:CreateJob",
                "s3:HeadBucket"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::MyBucket",
                "arn:aws:s3:*:*:accesspoint/*",
                "arn:aws:s3:::*/*",
                "arn:aws:s3:*:*:job/*"
            ]
        }
    ]
}

不确定此政策是否会影响该问题。

中交所

ACL: 'public-read'从代码中删除后它可以工作

@Marcin 和 @John Rotenstein 提供了很好的洞察力和方向,可以在评论中找到原因。真的很感激!

s3.upload({
            ACL: 'public-read', //remove this line
            Bucket: this.app.settings.aws.s3.bucket,
            Body: bufferFromFile,
            Key: `files/${result.id}/${data.fileName}`,
        }, {}).promise();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章