利用 Amazon CloudFront 功能来优化您的 亚马逊云科技 架构的成本

Amazon CloudFront 是一个全球内容分发网络 (CDN),可以轻松地安全、高速地和低延迟地交付网站、视频、应用程序和 API。您可以使用 CloudFront 通过全球分散的 400 多个接入点 (PoP) 传输数据来减少延迟,并通过流量加密、访问控制和抵御 DDoS 攻击的弹性来提高安全性。除了性能和安全性外,CloudFront 还可用于以各种方式对您的 亚马逊云科技 基础设施进行成本优化。在这篇文章中,我们将介绍许多 CloudFront 功能和最佳实践,这些功能和最佳实践可以帮助优化一些常用架构的成本。

使用 CloudFront 处理所有内容,包括动态内容

假设您通过直接从 弹性负载均衡器 (ELB)、亚马逊弹性计算云 (Amazon EC2) 实例或 亚马逊弹性容器服务 (Amazon ECS) / 亚马逊弹性 Kubernetes 服务 (Amazon EKS) 容 器集群托管的 Web 应用程序或 API 向互联网上的 最终用户提供动态内容。您可以通过 CloudFront 路由这些流量,而不是直接从这些资源提供请求的内容,CloudFront 配置为无需在边缘站点缓存内容即可传递内容。这种方法使您可以利用 CloudFront 的免费套餐,该套餐提供 1 TB 的数据传输到互联网,每月免费提供 1000 万个 HTTP 或 HTTPS 请求,从而降低您的数据传出 (DTO) 成本。

如果您在 亚马逊云科技 上托管应用程序时使用第三方 CDN,则应注意,从数据传输的成本角度来看,这可能是一种反模式。让我们了解一下原因——假设您在 亚马逊云科技 上的应用程序 负载均衡器 (ALB) 后面运行一个常见部署的 Web 应用程序 ,并使用不同的 CDN 而不是 CloudFront。现在假设您的应用程序每月向用户提供 10 TB 的数据。如果您使用 CloudFront 作为 CDN,则您只需支付 9 TB 的数据传输费用,因为 CloudFront 免费套餐将涵盖每月前 1 TB。此外,在您在 亚马逊云科技 上的源服务器(例如 ALB、亚马逊云科技 E lastic Beanstalk 、Amazon Simple Storage Service ( A mazon S3))之间向边缘站点传输数据不会产生任何数据传输费用。 但是,如果您使用不同的 CDN,则将按照他们的定价计划向他们支付 10 TB 的数据传输费用,并因从 亚马逊云科技 上的源服务器传输到另一个 CDN 的边缘站点的数据而向 亚马逊云科技 支付额外的数据传输费用。

Architecture showing data transfer with and without Cloudfront

图 1:内容分发网络的数据流架构

使用 CloudFront 地理限制限制向不需要的区域提供内容

有害和恶意流量可能导致您的资源负载增加,消耗带宽,并增加您的 亚马逊云科技 成本。在不必要的流量到达您的其他资源之前将其限制在边缘可以帮助您节省成本。例如,假设你不希望来自特定国家的流量进入你的应用程序。在这种情况下,您可以使用 CloudFront 地理限制 功能在国家层面 限制对与 CloudFront 分配相关的所有文件的访问权限。这可以减少您的源服务器必须处理的流量。因此,您可以适当缩小原始资源规模,从而节省成本。

使用 CloudFront 价格类别作为边缘定位策略的指标

CloudFront 在世界各地 都有 边缘站点。 每个边缘站点的成本各不相同,因此价格因哪个边缘站点服务请求而异。 价格等级 允许您将 CloudFront 更昂贵的边缘站点排除在 CloudFront 分配范围之外,从而降低交付价格。因此,配置应用程序用户地理位置的价格等级基础有助于降低成本,而不会造成任何明显的延迟影响。

Screenshot of AWS console showing settings to select all edge locations

图 2:CloudFront 价格等级选项

实施控制措施以降低 CloudFront 日志记录的成本

您可能需要监控您的内容分发指标,您可以使用 CloudFront 日志来获得这些指标。但是,请注意,实时日志是根据生成的日志行数收取费用的,而生成的日志行数又取决于您的 CloudFront 分配服务的 HTTP 请求数。因此,作为最佳实践,我们建议采取一些预防性控制措施,以限制您的 CloudFront 分配使用 亚马逊云科技 Web 应用程序防火墙 (亚马逊云科技 WA F) 等安全服务提供的流量。 您还可以通过三种方式限制生成的日志数量:

  1. 指定要记录的请求百分比
  2. 选择仅记录特定的日志字段
  3. 仅为特定 CloudFront 缓存行为启用实时日志

您可以在 CloudFront 日志设置上配置所有这些内容,如下图所示。

Screenshot of AWS console showing Cloudfront logs settings

图 3:CloudFront 日志

优化非 亚马逊云科技 源的缓存命中率

CloudFront 通常用作 亚马逊云科技 外部托管的应用程序的内容分发层。在这些情况下,优化缓存命中率可以帮助节省原始请求提交成本。缓存命中率是边缘站点缓存的内容所提供的请求总数的百分比。利用 CloudFront 的可自定义缓存策略,通过控制缓存密钥来提高缓存命中率。缓存密钥是缓存中每个对象的唯一标识符,它决定查看者请求是否导致缓存命中。当查看者请求生成与先前请求相同的缓存密钥,并且该缓存密钥的对象位于节点的缓存中并且有效时,就会发生缓存命中。提高缓存命中率的一种方法是在缓存密钥中仅包含必要的最低值。通过 了解缓存密钥来优化缓存命中 率 。此外,CloudFront 为常见用例提供一些预定义的 缓存策略 (称为托管策略),或支持创建特定于应用程序要求的自定义缓存策略。

Screenshot of AWS console showing cache key settings

图 4:CloudFront 缓存密钥设置

有效利用 CloudFront 压缩数据缓存功能

CloudFront 本身支持请求和缓存以 GZIP 或 Brotli 压缩格式压缩的对象。当查看者的 Web 浏览器或其他客户端支持压缩对象时,CloudFront 会提供压缩对象,并使用 Accept-Encoding HTTP 标头表示他们对压缩对象的支持。对象压缩有助于降低成本,因为您将较少的数据从源服务器传输到互联网。如果 CloudFront 本身不 支持 压缩某些文件类型,则可以在原始位置压缩这些文件并将它们作为压缩对象返回到 CloudFront。CloudFront 会根据内容编码标头的存在检测到该对象已被压缩,并且不会再次压缩该对象。

Screenshot of AWS console showing default cache behavior compression settings

图 5:CloudFront 压缩数据缓存

优化 CloudFront 缓存策略以减少缓存失效情况

如果您必须在文件过期之前将其从 CloudFront 边缘缓存中删除,则可以使该文件在边缘缓存中失效。对于每月请求失效的前 1,000 条路径以外的失效请求,您需要支付费用。因此,重要的是要了解一些一般的最佳实践,以节省失效成本。

我们建议您 使用源服务器发送的 Cache-Con trol HTTP 标头控制 ,您可以通过设置生存 时间 (TTL) 来 定义对象的缓存时长。 CloudFront 尊重缓存控制标头。这意味着,如果某个对象在响应中包含缓存控制标头,则 CloudFront 会在 Cache-Control max-age 指令中指定的时间内在边缘位置缓存该对象。如果没有 Cache-Control 标头,则 CloudFront 会在适用的缓存行为中指定的默认 TTL 的持续时间内缓存对象。此外,您可以使用缓存行为的 “最小 TTL” 和 “最大 TTL” 字段来定义 CloudFront 缓存任何对象的最短和最长时间的边界,以防意中设置过短或过长的 TTL。

Screenshot of AWS console showing Cloudfront TTL settings

图 6:CloudFront TTL 选项

如果您必须在文件过期之前将其从 CloudFront 边缘缓存中删除,则可以考虑使用文件版本控制来提供具有不同名称的不同版本的文件。版本控制使您能够控制请求返回哪个文件,即使用户在本地或公司缓存代理后面缓存了版本。如果您使文件无效,则用户可能会继续看到旧版本,直到它从这些缓存中过期。版本控制更便宜。对于非 亚马逊云科技 来源,您仍然需要为 CloudFront 付费才能将文件的新版本传输到边缘站点,但您不必为文件失效付费。有关更多信息,请参阅 使用版本控制文件名 更新现有文件

考虑使用通配符 (*) 路径失效而不是单个文件失效。您需要为每个失效路径付费,但是失效路径可以是单个文件,例如 (/images/logo.jpg) 或多个文件(例如 /images/ *)。包含* 通配符的路径算作一条路径,即使它会导致 CloudFront 使成千上万个文件失效。

通过调整 亚马逊云科技 Lambda 运行时大小来优化 Lambda @Edge 的执行成本

为您的工作负载运行 Lambda @Edge 的成本由三个因素决定:执行次数、 亚马逊云科技 Lam bda 函数的执行时长和内存使用量(合计为 Gb/s)。您选择 Lambda 运行时会直接影响成本。通常,编译后的语言比解释型语言运行代码的速度更快,但初始化可能需要更长的时间。对于功能简单的小函数,解释性语言通常更适合实现最快的总执行时间,因此成本最低。在计算复杂度较高的工作负载中或使用预配置并发的情况下,使用编译语言的函数通常速度更快,因此初始化开销发生在调用之前。

结论

这篇文章解释了一些最佳实践,这些实践可以帮助您利用 A mazon CloudFront 来优化在 亚马逊云科技 上部署的某些常用架构的成本。将这些功能与其他功能结合使用,这些功能可以帮助您 提高 使用 CloudFront 的 Web 应用程序的性能

Abhishek Sarolia

Abhishek 是 亚马逊云科技 的解决方案架构师。他与 亚马逊云科技 客户合作,利用最新的云技术设计安全、高性能和可扩展的解决方案,以应对他们的业务挑战。他对技术充满热情,喜欢构建和试验 AI/ML 和 IoT。工作之余,他喜欢旅行、阅读非虚构类书籍以及与家人共度时光。

Karan Desai Headshot

Karan Desai

Karan 是印度 亚马逊云科技 的解决方案架构师。他拥有超过11年的云行业经验,专注于边缘技术和网络。他目前与处于云采用早期阶段的公司合作,设计具有成本效益的可扩展解决方案,使他们能够使用 亚马逊云科技 实现现代化和发展。工作之余,可以发现他去另类的地方尝试不寻常的食物。