CloudFront + S3 网站:"The specified key does not exist" 何时应显示隐式索引文档

CloudFront + S3 Website: "The specified key does not exist" when an implicit index document should be displayed

我刚刚将一个静态网站部署到 Amazon S3,目前可以在这里查看:http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/

如果您单击任何一篇文章 link,您会注意到以下错误:

S3 抱怨文件不存在。现在,这就是奇怪的地方——我在我的域上使用 CloudFront。因此,当您单击该文章 link 时,它会将请求发送到 CloudFront,然后 CloudFront 会尝试从 S3 存储桶中取回文件。

但是,如果您直接从 S3 访问同一个 URL,例如:http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/2015/building-a-heroku-addon-planning/ 页面将正常加载。

这里似乎在翻译中丢失了一些东西。

有人对我如何修复设置提出建议吗?

我敢说指定的键技术上不存在,所以错误消息在技术上是准确的,但并不能说明全部情况.这应该很容易修复。

S3 存储桶有两个¹ 端点,“REST”和“网站”。他们有两个不同的功能集。网站端点提供了索引文档的神奇分辨率(例如 index.html,在您提供的示例中,这似乎是实际应该 returned 到浏览器的内容),而 REST 端点则没有.

当您在用于网站托管的存储桶前面配置 CloudFront 时,您通常不想通过从下拉列表中选择存储桶名称来将源配置为“S3”源;相反,您希望将其配置为“自定义”来源,并使用 S3 控制台中提供的网站端点主机名(例如 example-bucket.s3-website-us-east-1...),否则,CloudFront 假定您希望它使用 REST 端点存储桶(允许身份验证和私有内容,而网站端点不允许)。

Important

Do not select the name of your bucket from the list, for example, example.com.s3.amazonaws.com.

http://docs.aws.amazon.com/gettingstarted/latest/swh/getting-started-create-cfdist.html

由于最初回答了这个问题,所以对文档进行了重构,所以上面显示的消息现在出现在一页之后,并且已经重新措辞,但要点是一样的。 “桶的名称”似乎是指下拉列表中显示的选项,这不是您想要的。

Note

Be sure to specify the static website hosting endpoint, not the name of the bucket.

http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-cloudfront-walkthrough.html

您正在为存储桶使用 REST 端点的提示是错误消息 return 编辑在 XML 中。如果您使用的是网站端点,则网站端点会在 HTML.

中显示 return 错误消息

如上所述为 CloudFront 分配创建一个新源,然后更改行为以将请求发送到新源,然后发送 /* 的 CloudFront 缓存失效请求,您应该设置。

另请参阅:

http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff


¹ 两个端点。从技术上讲,有两个以上,因为所有存储桶至少有两个可能的 REST 端点主机名...但是有两个 types 端点。存储桶还有一个可选的传输加速端点,它使用 AWS 边缘网络(支持 CloudFront 的同一基础设施)进行 faster/optimized 传输,特别是从离存储桶配置区域更远的地理位置,但不使用 CloudFront缓存。这个端点看起来像 https://example-bucket.s3-accelerate.amazonaws.com 如果你激活它,并且对大多数请求收取额外的使用费用,因为你使用更多的 AWS 网络而不是 public 互联网......但是,这是一个端点的幕后部署差异,而不是端点的行为。传输加速端点仍然是一个 REST 端点,因此就像其他 REST 端点一样,它没有网站托管功能。 CloudFront 不允许您对原始域名使用加速端点,因为这没有意义——如果允许这样的配置,请求和响应将在 AWS 边缘网络中循环两次并增加延迟和成本,而不会提供任何好处。

当我试图在我的 route53 重定向中为客户包含存储桶名称时遇到了这个问题,以使其更容易,例如:

https://0832234.signin.aws.amazon.com/console/s3/?bucket=clientbucket.com

单击 "All buckets" 并返回到客户端存储桶/或从 url 中删除存储桶成功了,我现在可以下载并打开文件了。

在 CloudFront Origin Settings set Origin Domain Name to <website bucket>.s3-website-us-west-2.amazonaws.com[ 中遇到了同样的问题,我是如何解决的=13=]

在 CloudFront 生成设置 中确保将 index.html 作为 默认根对象

在 S3 中确保选择使用此存储桶托管网站并将index.html设置为索引文档

请参阅 AWS 文档了解如何 use CloudFront to serve a static website hosted on S3 over https

为方便起见(或以防 link 出现问题)转录以下内容。


  1. 使用桶上的Amazon S3 console to create a bucket and to enable static website hosting

  2. 静态网站托管对话框中,复制存储桶的端点,不带前导http://。格式类似于bucketname.s3-website-region.amazonaws.com。后续步骤需要此格式的端点。

  3. Add a bucket policy that allows public read access 到您创建的存储桶。

  4. 创建一个CloudFront web distribution。请务必配置以下内容:

    • 对于源域名,输入您在第 2 步中复制的端点。
    • 对于允许的 HTTP 方法、select GET、HEAD、OPTIONS
    • 对于备用域名 (CNAME),输入您要用于网站的 CNAME。
  5. 如果您不想为您的网站使用 SSL (HTTPS),请继续执行下一步。如果您想为您的网站使用 SSL,您可以选择 Request or Import a Certificate with ACM 来申请证书。有关详细信息,请参阅 Using Alternate Domain Names and HTTPS

  6. 选择创建分发

  7. 更新您域的 DNS 记录,将您网站的 CNAME 指向您的 CloudFront 分配的域名。您可以在 CloudFront console 中找到您的发行版域名,其格式类似于 d1234abcd.cloudfront.net.

  8. 等待您的 DNS 更改传播并等待之前的 DNS 条目过期。

我也遇到了类似的问题 我已经按照这些步骤解决了这个问题

步骤:

->go to CloudFront Distributions 
->click the ID
->after Clicking Id you will find different categories like General, Origins and Origin Groups .
->Click the Origins and Origin Groups
->Click the checkbox  of your s3 bucket and click edit
->under grand read Permissions on Bucket click "Yes, Update bucket policy"

这一步解决了我的问题。

我遇到了同样的问题,我是如何解决的,步骤如下

  • 转到Amazon S3然后转到你的存储桶目录

  • 启用 S3 静态网站托管

  • 转到权限选项卡 -> 阻止所有 public 访问 -> 取消选中阻止所有 public 访问并保存

  • 转到权限选项卡 -> 存储桶策略 -> 编辑并保存

    {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Sid": "PublicRead",
              "Effect": "Allow",
              "Principal": "*",
              "Action": [
                  "s3:GetObject",
                  "s3:GetObjectVersion"
              ],
              "Resource": "arn:aws:s3:::your-bucket-name/*"
          }
      ]
    }
    

注意:更改此行"Resource": "arn:aws:s3:::your-bucket-name/*"

例如:"Resource": "arn:aws:s3:::ng-ci-cd-aws-demo/*"

参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html

要让 s3 网站与 Cloudfront 一起工作,有一些要求:

    存储桶中的
  • Objects 必须 public 可以访问。
  • 存储桶中的
  • Objects 无法通过 AWS Key Management Service (AWS KMS) 加密。
  • 存储桶策略必须允许访问 s3:GetObject。
  • 如果存储桶策略授予 public 读取访问权限,则拥有该存储桶的 AWS 账户还必须拥有 object.
  • 请求的 objects 必须存在于存储桶中。
  • Amazon S3 块Public 必须禁用对存储桶的访问。
  • 如果启用请求者付款,则请求必须包含 request-payer 参数。
  • 如果您使用 Referer header 来限制从 CloudFront 访问您的 S3 来源,请查看自定义 header。

https://aws.amazon.com/premiumsupport/knowledge-center/s3-website-cloudfront-error-403/

我遇到的主要问题是,有两种类型的 s3 存储桶 urls:

REST 端点格式:https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro

https://bucket-name.s3.Region.amazonaws.com

网站端点格式:https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html

http://bucket-name.s3-website-Region.amazonaws.com
http://bucket-name.s3-website.Region.amazonaws.com

在我的例子中,我需要使用 网站 url 而不是 REST url:

使用网站 url 将允许您使用 S3 的网站托管功能,例如 index/error 文档和重定向规则!

您应该按照以下步骤操作。

要使用 CloudFront 控制台更新您的存储桶策略,请执行以下步骤:

 1. Open the CloudFront console and choose your distribution.
 2. Choose the Origins and Origin Groups tab.
 3. Select the S3 origin and choose Edit.
 4. For Restrict Bucket Access, choose Yes.
 5. For Origin Access Identity, choose the existing identity or create a new one.
 6. For Grant Read Permissions on Bucket, choose Yes, Update Bucket Policy.
 7. Choose Yes, Edit.

如果您配置了 OAI,则 OAI 必须包含在 S3 存储桶策略中 如果您将 OAI 添加到 CloudFront 分配,则还必须在 S3 存储桶策略中包含 OAI 的允许语句。

要验证您的存储桶策略是否允许 OAI,请在 Amazon S3 控制台中打开您的 S3 存储桶。然后,选择权限选项卡并查看存储桶策略。以下是 OAI 的允许语句示例:

{
  "Sid": "1",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"
  },
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}

参考: https://aws.amazon.com/tr/premiumsupport/knowledge-center/s3-rest-api-cloudfront-error-403/

您是否在 S3 上托管 React 站点?可能与 React Router 一起使用?

注意: 我关闭了我的 S3 存储桶 public 访问权限,我不想让它成为 public.此外,虽然我遇到的问题与上述问题相同,但我的解决方案却不同。

如果您像我一样不想创建您的 S3 端点public,并且在直接 [=38= 的 React Router 中面临这个问题]s with routes returning a 403 Forbidden on CloudFront, 继续阅读:

发生这种情况是因为 CloudFront 期望 S3 存储桶具有您的 URL 应该指向的文件。

例如,如果您有一个静态站点“example.com”和一个路由“/stack”,CloudFront 将尝试在您的 S3 存储桶中查找 'stack' 文件。这显然不存在,CloudFront 将 return 报错。

解决此问题的最佳方法是在 CloudFront 中为 HTTP 错误代码 403 设置自定义错误。自定义错误响应可以指向状态为“200 OK”的“index.html”页面。这将解决错误,将用户指向正确的文件,同时保留原始 URL(示例。com/stack),然后由 React Router 拾取。

访问 Cloudfront -> 您的分配

转到错误页面并单击添加错误页面。输入如下详细信息