首页 > 解决方案 > nodeJS的AWS S3 403访问被拒绝问题

问题描述

以下是我的存储桶策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddCannedAcl",
            "Effect": "Allow",
            "Principal": {
                "AWS": "==mydetails=="
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::etcetera-dev/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "public-read"
                }
            }
        }
    ]
}

这是我的 Iam 用户内联政策

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

现在我正在尝试使用 multer-s3 上传文件acl:'public-read',但我收到 403 访问被拒绝。如果我不在 multer 中使用 acl 属性,我可以毫无问题地上传。

标签: node.jsamazon-web-servicesamazon-s3multermulter-s3

解决方案


您现在可能已经解决了这个问题,但如果您还没有解决,还有许多不同的可能解决方法(请参阅:https ://aws.amazon.com/premiumsupport/knowledge-center/s3-troubleshoot-403/ )。

但是我遇到了同样的问题,为我解决的问题如下。s3.upload()我想您在尝试上传文件时正在打电话。我发现如果您的upload()选项中没有 Bucket 参数,您也会收到 403。

即确保您的upload()电话如下:

await s3.upload({
  Bucket: // some s3Config.Bucket
  Body: // Stream or File,               
  Key: // Filename,  
  ContentType: // Mimetype 
}).promise();      

Bucket: // some s3Config.Bucket- 我在函数调用中错过了这个参数,因为我认为它new AWS.S3(config)处理了存储桶。事实证明,您应该始终将存储桶添加到您的上传参数中。


推荐阅读