【问题标题】:Amazon S3 - Failed to load resource: the server responded with a status of 403 (Forbidden)Amazon S3 - 加载资源失败:服务器响应状态为 403(禁止)
【发布时间】:2016-10-07 16:41:15
【问题描述】:

这是我第一次使用 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

谁能帮忙?

谢谢。

【问题讨论】:

    标签: node.js reactjs amazon-s3


    【解决方案1】:

    有两点需要注意:

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

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

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

    • 对象 ACL(访问控制列表):这些是对象本身的权限
    • Bucket Policies:这是应用于整个bucket的一组规则,但它也可以指定与bucket子集相关的权限(例如bucket中的特定路径)
    • 应用于 IAM 用户、组或角色的 IAM 政策:这些权限专门适用于这些实体

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

    查看文档:Guidelines for Using the Available Access Policy Options

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

    分配哪些权限

    这总是令人困惑...有些权限与Bucket相关联,而有些权限则与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/*"
                ]
            }
        ]
    }
    

    这会将GetObject 权限授予桶的对象,而不是桶本身。

    【讨论】:

    • 首先感谢您的回答。我遵循了您的所有指示,但仍然收到 403 禁止错误。
    • @Hideya,您如何从 Amazon S3 访问对象?您是通过控制台、浏览器还是 CLI 执行此操作?您是包含访问凭据还是只是进行匿名调用(例如,没有用户标识符的 URL)?
    • 你是对的。该配置解决了问题。我刚刚意识到错误来自组件。非常感谢您的回答。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多