亚马逊 CloudFront 延迟

Amazon CloudFront Latency

我正在为我正在开发的 Web 应用程序试验 AWS S3 和 CloudFront。

在应用程序中,我让用户将文件上传到 S3 存储桶(使用 AWS SDK)并通过 CloudFront CDN 使其可用,但问题是即使文件已上传并在 S3 存储桶中准备就绪在 CloudFront CDN url 中可用大约需要一两分钟,这正常吗?

这些新文件是第一次写入 S3,还是对现有文件的更新? S3 为新对象提供先写后读的一致性,并且考虑到 CloudFront 的拉取模型,您应该不会在写入 S3 的新文件时遇到此问题。如果您是,那么我会向 AWS 开票。

如果这些是对现有文件的更新,那么您需要处理 S3 最终一致性和 CloudFront 缓存过期。这两者都可能导致这种行为。

CloudFront 尝试从源服务器实时获取未缓存的内容。没有 "replication delay" 或类似问题,因为 CloudFront 是拉通 CDN。每个 CloudFront 边缘站点只知道您站点的存在和配置;在收到请求之前,它不知道您的内容。发生这种情况时,CloudFront 边缘从源服务器获取请求的内容,并在适当的时候缓存它,以便为后续请求提供服务。

此处出现的问题与有时称为 "negative caching" 的概念有关——缓存请求 不会 工作的事实——这通常是完成的以避免用无论如何都可能失败的请求来打击正在缓存的任何内容的来源。

By default, when your origin returns an HTTP 4xx or 5xx status code, CloudFront caches these error responses for five minutes and then submits the next request for the object to your origin to see whether the problem that caused the error has been resolved and the requested object is now available.

— http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html

如果浏览器或其他任何东西在上传到 S3 完成之前尝试从该特定 CloudFront 边缘下载文件,S3 将 return 出错,并且 CloudFront - 在该边缘位置 - - 将缓存该错误并记住,在接下来的 5 分钟内,不要费心再次尝试。

不过不用担心 -- 这个计时器是可配置的,所以如果浏览器在后台执行此操作并且不受您的控制,您应该仍然能够修复它。

You can specify the error-caching duration—the Error Caching Minimum TTL—for each 4xx and 5xx status code that CloudFront caches. For a procedure, see Configuring Error Response Behavior.

— http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html


要在控制台中进行配置

  • 查看分发配置时,单击 Error Pages 选项卡。

  • 对于每个要自定义计时的错误,请先单击 Create Custom Error Response

  • 从下拉列表中选择您要修改的错误代码,例如403(禁止)或404(未找到)——您的存储桶配置确定丢失对象的代码 S3 returns,因此如果您不确定,请更改 403,然后重复该过程并更改 404。

  • Error Caching Minimum TTL (seconds)设置为0

  • Customize Error Response 设置为 No(如果设置为 Yes,此选项启用自定义错误响应内容,这不是您想要的。激活这个选项超出了这个问题的范围。)

  • 单击 Create。这会将您带回到之前的视图,您将在其中看到您刚刚定义的代码的 Error Caching Minimum TTL

对每个要更改默认行为(即上面讨论的 300 秒保持时间)的 HTTP 响应代码重复这些步骤。

完成所需的所有更改后,return 到列出了分发的 CloudFront 主控制台屏幕。等待分发状态从 In Progress 更改为 Deployed(以前,这需要相当长的时间,但现在通常需要大约 5 分钟才能将更改推送到所有边缘)并进行测试。

正如您在评论中所观察到的,google chrome 似乎搞乱了您的 upload/preview 策略:

  1. Chrome 正在请求 URL 当前没有 内容。
  2. 请求被云端缓存,响应无效
  3. 您将文件上传到 S3
  4. 当预览上传的文件时,云端使用缓存的响应进行响应(第 2 步)。
  5. cloudfront缓存过期后,cloudfront命中origin,问题无法再重现。