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

Hid*_*eya 5 amazon-s3 node.js reactjs

这是我第一次使用 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/*"
    }
]}
Run Code Online (Sandbox Code Playgroud)

这是 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>
Run Code Online (Sandbox Code Playgroud)

这是用户的政策:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:ListAllMyBuckets",
            "s3:ListBucket",
            "s3:ListBucketVersions",
            "s3:GetObject",
            "s3:ListBucketMultipartUploads"
        ],
        "Resource": [
            "arn:aws:s3:::*"
        ]
    }
]}
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?

谢谢。

Joh*_*ein 3

有两点需要注意:

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

在哪里分配访问 Amazon S3 的权限

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

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

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

请参阅文档:使用可用访问策略选项的指南

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

分配哪些权限

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

您的策略中的以下权限应位于存储桶级别 ( arn:aws:s3:::MyBucket):

  • s3:创建桶
  • s3:删除桶
  • s3:删除桶策略
  • s3:获取桶策略
  • s3:获取生命周期配置
  • s3:列表桶
  • s3:ListBucketMultipartUploads
  • s3:PutBucketPolicy
  • s3:PutLifecycleConfiguration

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

请参阅:在策略中指定权限

因此,与您的 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/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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