当源为S3存储桶时,AWS CloudFront返回http 307

Kiv*_*van 22 amazon-s3 amazon-web-services amazon-cloudfront

我用一些文件创建了s3存储桶.我使用该S3存储桶创建了CloudFront分配,并将状态更改为已部署.

当我为任何文件卷曲CloudFront时,我得到:

<Error><Code>TemporaryRedirect</Code><Message>Please re-send this request to the specified temporary endpoint. Continue to use the original request endpoint for future requests.</Message><Bucket>MY-BUCKET</Bucket><Endpoint>MY-BUCKET.s3-eu-west-1.amazonaws.com</Endpoint><RequestId>...</RequestId><HostId>...</HostId></Error>
Run Code Online (Sandbox Code Playgroud)

当我为任何文件卷曲我的S3存储桶时,我得到了该文件内容.

我究竟做错了什么?如何强制cloudfront缓存文件,以便客户端不需要直接从S3获取数据?

Kiv*_*van 38

Thx Matt Houser评论到我的第一篇文章!

当分发尚未完全准备好时,CloudFront似乎缓存了我对文件的第一个请求(但当时它处于已部署状态,所以要小心!).我请求对缓存中的所有文件进行无效,花了几分钟,但在失效后,所有文件都使用CloudFront网址使用http 200卷曲.

Michael-sqlbot发表评论后问题变得清晰了:

所有存储桶至少有两个REST端点主机名.在eu-west-1中,他们是example-bucket.s3-eu-west-1.amazonaws.com和example-bucket.s3.amazonaws.com.创建存储桶时,第一个将立即生效.第二个 - 有时也称为"全局端点" - 这是CloudFront使用的 - 不会,除非存储桶位于us-east-1中.在几秒到几分钟的时间内,根据位置和其他因素变化,它也可以在全球范围内访问.在此之前,返回307重定向.因此,水桶没有准备好.

  • 其实,这是不是**分布,这是尚未做好充分准备.如果不是已经准备好了,就不会一直在努力.[这是*桶*尚未准备好](http://docs.aws.amazon.com/AmazonS3/latest/dev/Redirects.html).由于全局端点DNS的工作方式,当存储桶不在us-east-1区域时,临时重定向在新存储桶的生命周期的前几分钟是正常的,有时会更长一些.通过CloudFront的从缓存中提供的响应也有一个`年龄:`头,这将表明,是你所看到的是缓存. (7认同)
  • 所有存储桶至少有两个REST端点主机名.在eu-west-1中,他们是example-bucket.s3-eu-west-1.amazonaws.com和example-bucket.s3.amazonaws.com.创建存储桶时,第一个将立即生效.第二个 - 有时也称为"全局端点" - 这是CloudFront使用的 - 不会,除非存储桶位于us-east-1中.在几秒到几分钟的时间内,根据位置和其他因素变化,它也变得全球可访问.在此之前,返回307重定向.因此,水桶没有准备好. (7认同)
  • 另一条信息,我的s3存储桶在俄亥俄州,大约需要45分钟才能传播DNS,而不是从云端获取307. (3认同)

Bal*_*zar 14

如果它发生在你身上,为了澄清一点,有几个选择:

  • 最多等待24 小时,让更改完全传播。

  • 将您的存储桶位置更改为us-east-1区域。

  • 但最简单的方法可能是将您的 CloudFront 源域名从 切换<bucket>.s3.amazonaws.com<bucket>.s3-<region>.amazonaws.com

转到您的分发设置 -> 来源和来源组并编辑当前来源

例如,区域中有一个名为 stackoverflow 的桶us-west-2,它会变成

stackoverflow.s3-us-west-2.amazonaws.com
Run Code Online (Sandbox Code Playgroud)