Amazon S3 - 无法加载资源:服务器响应状态为403(禁止)

时间:2016-10-07 16:41:16

标签: node.js reactjs amazon-s3

这是我第一次使用Amazon S3。我已经阅读了问题和答案。它们似乎都与这个问题相似,但没有一个答案为我解决了。

我可以成功上传图片,但我可以让它们显示它们(403禁止状态)。

这是一揽子政策:

{
"Version": "2012-10-17",
"Id": "Policy1475848347662",
"Statement": [
    {
        "Sid": "Stmt1475848335256",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::235314345576:user/userx"
        },
        "Action": [
            "s3:*"
        ],
        "Resource": "arn:aws:s3:::bucketdev/*"
    }
]}

这是CORS配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>

这是用户的政策:

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

使用此组件:https://www.npmjs.com/package/react-dropzone-s3-uploader

有人可以帮忙吗?

感谢。

2 个答案:

答案 0 :(得分:1)

有两点需要注意:

  • 在哪里分配权限以访问Amazon S3
  • 分配哪些权限

在何处分配访问Amazon S3的权限

Amazon S3中的对象默认为私有。有三种方法可以分配访问对象的权限:

  • 对象ACL (访问控制列表):这些是对象本身的权限
  • 存储桶策略:这是一组应用于存储桶的规则,但它也可以指定与存储桶子集相关的权限(例如存储桶中的特定路径)< / LI> 适用于IAM用户,组或角色的
  • IAM策略:这些权限专门适用于这些实体

如果您打算将S3存储桶的内容保密,但允许访问特定用户,则应该为 IAM用户分配权限(正如您所做的那样)。这也意味着您不需要Bucket政策,因为通过上述任何一种方法授予访问权限就足够了。

请参阅文档:Guidelines for Using the Available Access Policy Options

仅当从一个域提供的HTML页面引用来自另一个域的内容时,才需要 CORS策略。您很可能不需要CORS策略 - 进行一些测试以确认是否属于这种情况。

分配哪些权限

这总是令人困惑......某些权限与 Bucket 相关联,而某些权限则与Bucket的内容相关联。

您的政策中的以下权限应位于广告管道级别(arn:aws:s3:::MyBucket):

  • S3:CreateBucket
  • S3:DeleteBucket
  • S3:DeleteBucketPolicy
  • S3:GetBucketPolicy
  • S3:GetLifecycleConfiguration
  • S3:ListBucket
  • S3:ListBucketMultipartUploads
  • S3:PutBucketPolicy
  • S3:PutLifecycleConfiguration

其他API调用(例如GetObject)应该在对象级别(例如arn:aws:s3:::MyBucket/*)。

请参阅:Specifying Permissions in a Policy

因此,与您的IAM用户关联的策略应该更像这样:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::MY-BUCKET"
            ]
        },
        {
            "Sid": "Stmt2",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::MY-BUCKET/*"
            ]
        }
    ]
}

这将授予{<1}}对桶中对象的权限,而不是对存储桶本身。

答案 1 :(得分:0)

即使某些机构也会遇到相同的问题-请确保所有文件都已上传到存储桶,因为如果使用“添加文件”按钮,则不会上传嵌套文件夹。最好使用“拖放”。