CloudFront + S3网站:应显示隐式索引文档时"指定的密钥不存在"

rde*_*ges 39 amazon-s3 amazon-web-services amazon-cloudfront

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

如果单击任何文章链接,您会注意到以下错误:

S3错误

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

但是,如果您直接从S3访问相同的URL,例如:http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/2015/building-a-heroku-addon-planning/页面加载就好了.

看来这里有些东西在翻译中迷失了.

有人建议我可以做些什么来修复我的设置?

Mic*_*bot 88

我会走出一条路,并说指定的密钥在技术上并不存在,因此错误信息在技术上是准确的,但并不能说明整个故事.这应该是一个简单的解决方案.

S3存储桶有两个端点,"REST"和"网站".它们有两个不同的功能集.网站端点提供了索引文档的神奇解决方案(例如index.html,它似乎是在您提供的示例中实际应该返回到浏览器的内容),而REST端点则没有.

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

重要

请勿从列表中选择存储桶的名称,例如example.com.s3.amazonaws.com.

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

自从这个问题最初得到回答后,文档被重构了,所以上面显示的消息现在出现在一页之后,并且已经重新编写,但要点是相同的."桶的名称"似乎是指下拉列表中显示的选项,这不是您想要的.

注意

请务必指定静态网站托管端点,而不是桶的名称.

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

您正在使用存储桶的REST端点的提示是因为如果您使用网站端点,则错误消息将不是XML格式.

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

也可以看看:

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


¹两个端点.从技术上讲,有两个以上,因为所有存储桶至少有两个REST端点主机名...但有两种类型的端点.存储桶还具有传输加速端点,该端点使用AWS边缘网络进行更快/更优化的传输,尤其是距离配置存储区域较远的地理位置.这看起来https://example-bucket.s3-accelerate.amazonaws.com如果你激活它,并且因为你使用更多的AWS网络而不是公共互联网而需要额外的使用费...但是,这是端点部署的差异,而不是端点的行为端点.传输加速端点仍然是REST端点,因此就像其他REST端点一样,它没有网站托管功能.您不希望将CloudFront配置为使用加速端点,因为这不会提供任何改进(CloudFront已经使用边缘网络),但您仍需要支付额外的加速费用.

  • 是啊!非常感谢.超级有帮助.我希望那个犯这个愚蠢错误的人能找到你的答案也有用=) (5认同)
  • 谢谢!这正是我的问题所在.这很有趣,因为我以前用这种方式部署了很多网站,这从来都不是问题 - 我想这一切都是相对好运的,因为我的网站主要是单页.嘿. (2认同)
  • @rdegges 愚蠢的错误制造者签入。每次 CloudFront 调整需要 45 分钟,这夺走了我生命中的一天。谈论微妙... (2认同)
  • @markdsievers你会发现CloudFront调整通常会在几分钟内开始工作.如果对变更是否按预期工作有疑问,您只需要等待分配转换回"已部署".如果你知道你弄错了,你可以推动其他更改而不会产生不良影响.它还有助于加快故障排除,如果您遇到错误,[将错误缓存最小TTL清零](/sf/answers/2487906781/) - 使用不同的计时器缓存错误响应. (2认同)

Mig*_*ota 25

遇到同样的问题以及我如何解决它是在CloudFront Origin Settings中将Origin Domain Name 设置<website bucket>.s3-website-us-west-2.amazonaws.com

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

在S3中,请确保使用此存储桶来托管选定的网站并将其设置index.html索引文档.

  • 你我的男人,是一个传奇,你不知道我找了这个答案多久了!我使用了类似的设置来托管图片并通过lambda和API Gateway运行图片大小调整脚本。 (3认同)

sid*_*x64 17

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

注意:我将我的 S3 存储桶关闭,禁止公共访问,并且我不想将其公开。另外,虽然我面临的问题与上面提出的问题相同,但我的案例的解决方案是不同的。

如果您像我一样不想公开您的 S3 端点,并且在 React Router 中面临这个问题,其中带有路由的直接 URL 在 CloudFront 上返回 403 Forbidden,请继续阅读:

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

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

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


小智 9

访问 Cloudfront -> 您的发行版

转到错误页面并单击添加错误页面。输入如下详细信息 在此输入图像描述