【问题标题】:AWS S3 Bucket CORS configuration: policy block despite all accessAWS S3 存储桶 CORS 配置:尽管有所有访问权限,仍会阻止策略
【发布时间】:2022-01-20 13:04:08
【问题描述】:

我正在尝试弄清楚如何配置 AWS S3 存储桶以便我可以上传到它。我按照this tutorial 中的说明进行操作,但仍然收到一条错误消息:

访问“https://s3.ap-southeast-2.amazonaws.com/”从 来源 'http://localhost:3000' 已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。如果不透明的响应满足您的需求,请设置请求的 模式为“no-cors”以获取禁用 CORS 的资源。

我有一个带有以下 CORS 政策的存储桶(在开发中):

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

我的存储桶策略如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:List*",
                "s3:Get*"
            ],

// 注意:我也尝试使用通配符 '*' 来允许所有 操作,但我收到与上图相同的错误消息

        "Resource": [
            "arn:aws:s3:::[MY_BUCKET_NAME]",
            "arn:aws:s3:::[MY_BUCKET_NAME]/*"
        ]
    }
]

}

我可以看到 AWS 策略有一个额外的 ACL 部分,其中包含勾选列表和读取选项,但是写入按钮显示为灰色,并带有警告不要使用它以允许所有人写入。我勾选了它们以允许所有人公开访问以列出和阅读(我不知道如何编辑灰色的写入选项)。我处于开发模式,想找到一种方法来测试连接是否可以正常工作,所以想写。即使我尝试这样做,我也会收到与上面发布的相同的错误。

我正在寻找有关如何连接到 AWS S3 存储桶的最新说明。似乎配置要求的变化比创建博客教程的速度更快。许多关于 SO 的答案不再映射到 AWS S3 配置文件中的配置设置。

【问题讨论】:

  • 您是否要允许公开上传您的存储桶(任何人都可以在没有身份验证的情况下上传)?这是一个安全风险,因为如果有人知道您的存储桶名称(这并不难),他们可以上传自己的任何对象
  • 目前,我只是在开发中,并试图看看它是如何工作的。我将接受任何安全风险以了解如何配置 AWS 端。一旦我能看到它是如何工作的,我会重新添加策略约束。目前,我还停留在第一步。

标签: amazon-web-services amazon-s3 cors


【解决方案1】:

您得到的 CORS 错误应该只与 CORS 配置有关,与存储桶策略无关。

我注意到您引用的错误消息不包含存储桶名称。通常对于 CORS 错误,它应该如下所示:

'https://<bucket>.s3.eu-west-2.amazonaws.com/' from origin 'https://localhost:3001' has been blocked by CORS policy

建议您仔细检查代码中的 BUCKET_NAME。

另外我不知道你用什么方法调用API,但为了完整起见,你也可以包含HEAD方法。

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "POST",
            "GET",
            "PUT",
            "DELETE",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

对我来说,这适用于从客户端上传。

【讨论】:

  • 嗨 - 包含 HEAD 方法是什么意思?我应该在我的 AWS 政策中添加一些额外的东西来解决这个问题吗?
  • S3 支持 HEAD 方法,类似于 GET,但只返回没有正文的标头。这通常用于简单检查对象是否存在。如果您使用的是 HEAD,则需要在 AllowedMethods 列表中包含 HEAD(请参阅我的 CORS 配置)。但在此之前,您是否设法验证存储桶名称是否正确?您引用的错误消息看起来很可疑,因为错误消息中缺少存储桶名称。有关典型的 S3 CORS 错误消息,请参阅我的帖子。它包括前面的存储桶名称,例如&lt;bucket&gt;.s3.&lt;region&gt;.amazonaws.com
  • 这绝对是我正确的存储桶名称。我在读取到上传方法的环境变量中使用它。谢谢楼主的建议。回到办公桌后我会试试的。
  • 好的,我的意思是确保变量不为空/未定义。祝你好运!
  • 您好,我在@RegisterSole,我认为您的变量为空,请尝试使用 cli 使用此命令 aws s3api get-bucket-cors --bucket bucket-name 检查存储桶 cors。并且可能不在 AWS 端,而是在您的代码调用中,您必须检查所有参数/配置是否良好。因为在您的网址中缺少存储桶名称
猜你喜欢
  • 2017-02-10
  • 2019-01-23
  • 2018-08-09
  • 2017-12-20
  • 2017-09-21
  • 2017-01-30
  • 1970-01-01
  • 2021-03-31
  • 2017-09-14
相关资源
最近更新 更多