<!-- AI_TASK_START: AI标题翻译 -->
[解决方案] 实现多租户 CloudFront 分布的粒度化成本分析
<!-- AI_TASK_END: AI标题翻译 -->
<!-- AI_TASK_START: AI竞争分析 -->
# 解决方案分析
## 解决方案概述
本文档描述了针对多租户CloudFront分布的粒度成本分析解决方案,核心内容是通过**CloudFront**标准访问日志来识别和分配CDN成本,实现按请求级别的支出跟踪和“chargeback”(内部收费)。该方案解决的问题包括传统AWS成本分析工具(如**AWS Budgets**和**AWS Cost Explorer**)无法提供的高粒度成本透明度,适用于多租户环境中的内容交付网络(CDN)。背景是AWS的全球边缘解决方案需求日益增长,尤其在SaaS业务中,需要提升成本分配的准确性和效率。目标用户群包括使用**CloudFront**的开发者和运营团队,适用于高流量网站、动态内容服务和边缘计算场景。
## 实施步骤
1. **准备环境**
确保具备AWS账户和相关服务访问权限,包括**QuickSight**订阅、**Amazon Athena**和**AWS Glue**。使用**AWS CDK**部署解决方案,自动化配置资源,如S3存储桶和CloudFront分布。
2. **部署架构**
设置**CloudFront**分布以处理请求,并启用标准访问日志存储到**Amazon S3**桶中。同时,配置**AWS Glue**数据目录来结构化日志数据,为后续查询做准备。
3. **生成和收集日志数据**
通过访问CloudFront域名或模拟流量(如curl命令)生成日志。日志会自动存储在S3桶中,使用**AWS Glue**创建元数据表。
4. **执行Athena查询**
使用**Amazon Athena**运行SQL查询,根据请求特征(如URI、路径或主机)分组日志数据,并结合区域信息计算成本。示例包括提取区域代码并应用定价率计算数据传输成本。
5. **创建数据可视化**
在**Amazon QuickSight**中添加数据集,使用自定义SQL查询构建仪表板,展示按租户划分的成本指标,如数据传输总量和请求成本。
## 方案客户价值
- **提升成本透明度**:通过按请求级别的成本分配,帮助组织实现精确的内部收费机制,提高资源利用效率,尤其在多租户环境中。
- **优化业务决策**:为SaaS业务提供边际服务总成本洞察,支持根据流量和区域差异调整策略,避免不必要的支出。
- **与传统方案的差异**:相比传统IaaS成本工具,本方案利用**CloudFront**日志减少ETL复杂性,简化分析过程,但可能需要额外服务订阅(如QuickSight)。
## 涉及的相关产品
- **Amazon CloudFront**:作为CDN核心,提供内容交付和日志生成,支持多租户请求路由。
- **Amazon S3**:存储CloudFront标准访问日志,作为数据源供后续查询使用。
- **Amazon Athena**:用于SQL查询日志数据,实现成本分组和计算。
- **AWS Glue**:结构化日志数据,提供元数据表以支持Athena查询。
- **Amazon QuickSight**:创建可视化仪表板,展示成本指标,帮助团队快速分析趋势。
- **其他辅助产品**:如**AWS WAF**用于安全防护,**API Gateway**和**Lambda@Edge**支持动态内容和边缘计算,但未在核心成本分析中直接集成。
## 技术评估
该解决方案在技术先进性上表现出色,利用**CloudFront**标准日志和Athena的服务器less查询能力,实现高效的成本分析,符合**AWS Well-Architected Framework**的成本优化原则。可行性高,通过**CDK**自动化部署,适用于大多数AWS环境,但需依赖用户对SQL和日志处理的熟悉度。优势包括高粒度成本分配和实时洞察,但局限性在于日志交付基于“best-effort”机制,可能导致数据不完整;在高并发场景下,查询性能依赖于数据规模,可能增加延迟。整体而言,该方案在多租户CDN成本管理中具有显著优势,但需考虑日志完整性和查询优化以提升适用范围。
## 其他信息
解决方案考虑事项包括:日志可能延迟或缺失,建议结合采样分析;未包含**Lambda@Edge**的完整成本计算,需要额外日志聚合;适用于初级环境测试和调整,以适应特定工作负载需求。
<!-- AI_TASK_END: AI竞争分析 -->
<!-- AI_TASK_START: AI全文翻译 -->
# 为多租户 CloudFront 分布实现粒度化成本分析
**原始链接:** [https://aws.amazon.com/blogs/networking-and-content-delivery/implementing-granular-cost-analysis-for-multi-tenant-cloudfront-distributions/](https://aws.amazon.com/blogs/networking-and-content-delivery/implementing-granular-cost-analysis-for-multi-tenant-cloudfront-distributions/)
**发布时间:** 2025-05-14
**厂商:** AWS
**类型:** BLOG
---
*注意: 本文引用了多租户或共享分布的使用,该功能最近通过 CloudFront 的 SaaS Manager 获得了更正式的支持。请查看[最新博客](https://aws.amazon.com/blogs/aws/reduce-your-operational-overhead-today-with-amazon-cloudfront-saas-manager/),了解多个域交付如何利用 SaaS Manager。*
[Amazon CloudFront (CloudFront)](https://aws.amazon.com/cloudfront/) 是 AWS 原生的内容分发网络 (CDN),它通过将流量从区域 AWS 基础设施卸载到全球边缘解决方案,从而降低延迟、提高可用性并保护 Web 应用。本文重点介绍一种解决方案,用于提供 CDN 的高粒度成本透明度,该功能在使用传统 AWS 成本分析工具(如 [AWS Budgets (AWS Budgets)](https://aws.amazon.com/aws-cost-management/aws-budgets/) 或 [AWS Cost Explorer (AWS Cost Explorer)](https://aws.amazon.com/aws-cost-management/aws-cost-explorer/))时不可用。该解决方案使用 CloudFront 标准访问日志来识别和分配每个请求级别的 CDN 成本,从而跟踪支出并“冲销”给相关团队或部门。
## 先决条件
此解决方案使用 [AWS Cloud Development Kit (CDK) (AWS CDK)](https://aws.amazon.com/cdk/) 来帮助自动化部署和配置建议的解决方案。您需要一个 AWS 账户来部署参考解决方案,并熟悉 CloudFront 内容分发的基本概念,如数据传输出 (data transfer out)、代理数据、源、边缘计算等。
除了 CDN 资源外,您还需要访问以下 AWS 服务:
- **QuickSight (QuickSight) 带有活跃订阅** – 用于创建分析和仪表板。此外,您需要在部署解决方案的 AWS 区域中注册并激活一个 QuickSight 用户。
- **Amazon Athena (Athena)** – 用于查询 CloudFront 标准访问日志。如果是首次使用 Athena,您需要为[查询结果](https://docs.aws.amazon.com/athena/latest/ug/creating-databases-prerequisites.html) 设置一个目标存储桶。
- **AWS Glue (AWS Glue)** – 用于结构化 CloudFront 标准访问日志并为 Athena 查询提供目标表。
## 架构概述
一个简化的参考架构示例,用于冲销分析,使用 [Amazon S3 (S3)](https://aws.amazon.com/s3/) 作为静态网站源、[Amazon API Gateway (API Gateway)](https://aws.amazon.com/api-gateway/) 来服务 REST API 的动态内容,并利用边缘计算功能,如 [CloudFront Functions (CloudFront Functions)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-functions.html) 和 [Lambda@Edge (Lambda@Edge)](https://aws.amazon.com/lambda/edge/),如 图 1 所示。

图 1. 用于标准内容分发工作流的解决方案架构图
除了用于服务内容的基线架构外,为支持粒度化成本分析并与 [AWS Well-Architected Framework (AWS Well-Architected Framework)](https://aws.amazon.com/architecture/well-architected/) 保持一致,我们添加了一些服务来提升安全、标准化日志聚合、查询和基本仪表板。我们使用 [AWS WAF (AWS WAF)](https://aws.amazon.com/waf/) 来帮助保护部署的边界。当 CloudFront 日志存储在 S3 中时,我们可以使用 AWS Glue,特别是 [AWS Glue Data Catalog (AWS Glue Data Catalog)](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html),来组织和结构化这些数据。此中心化的元数据存储库允许使用 SQL 通过 Athena 查询数据。Athena 使用户能够使用标准 SQL 查询原地分析数据,从而消除复杂的提取、转换和加载 (ETL) 过程。[Amazon QuickSight (QuickSight)](https://aws.amazon.com/quicksight/) 用作数据可视化和仪表板服务。图 2 显示了此架构的新视图,其中包括用于支持冲销分析的工作负载部分(在虚线内)。
 提供的任何特征与不同团队/租户相关联。在以下示例实现中,租户/团队标识符位于请求 URI 中:“cloudfrontExample.com/tenant1” 和 “cloudfrontExample.com/tenant {+N…}” 被同一个分布接收。](https://d2908q01vomqb2.cloudfront.net/5b384ce32d8cdef02bc3a139d4cac0a22bb029e8/2025/05/07/cloudfront-chargeback-logging-architecture-diagram.png)
图 2. 带有用于冲销分析的附加服务的内容分发
1. CloudFront 分布接收请求,这些请求可以通过每个请求的路径、查询、主机或通过[标准日志行](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/standard-logs-reference.html#BasicDistributionFileFormat) 提供的任何特征与不同团队/租户相关联。在以下示例实现中,租户/团队标识符位于请求 URI 中:“cloudfrontExample.com/tenant1” 和 “cloudfrontExample.com/tenant {+N…}” 被同一个分布接收。
2. CloudFront 标准日志(针对分布上的所有租户)存储在一个公共 S3 存储桶中。
3. Athena 用于查询 CloudFront 标准日志,使用 SQL 根据租户区分请求并用定价信息丰富请求数据。
1. AWS Glue Data Catalog 用于提供结构并存储 CloudFront 日志数据集的元数据表。
4. QuickSight 可视化和仪表板从 Athena 表中提取数据,根据不同的 CloudFront 租户特征(如路径、查询、主机)聚合成本指标。
5. 架构中的中间列用于收集 AWS WAF 日志,但未包含在提供的解决方案/代码中。可以使用类似[如何使用 Amazon Athena 查询分析 AWS WAF 日志并提供所需的威胁检测可见性](https://aws.amazon.com/blogs/networking-and-content-delivery/how-to-use-amazon-athena-queries-to-analyze-aws-waf-logs-and-provide-the-visibility-needed-for-threat-detection/)的文章,作为在共享 AWS 服务上收集和冲销活动的基础。
6. 最后一列未包含在提供的解决方案中,但它显示了聚合跨区域 [Lambda@Edge (Lambda@Edge)](https://aws.amazon.com/blogs/networking-and-content-delivery/aggregating-lambdaedge-logs/) 应用日志所需的服務,以获得更精确的 GB/秒估算。
## 冲销解决方案成本输入
进一步冲销日志和分析服务的成本取决于您的工作负载流量。以每月 3000 万请求为例(平均每个请求生成 2 kb 标准日志条目),根据发布时的[公共定价](https://calculator.aws/),[AWS Pricing Calculator (AWS Pricing Calculator)](https://calculator.aws/) 估算如下:
- **Amazon S3 (S3)**: ~$1.50 用于存储 60 GB 数据和对象请求(2 kb x 30,000,000),由 CloudFront 和 Athena 产生。60 GB 每个月累积,如果数据不再使用或仅需偶尔分析,建议设置数据归档策略。
- **Amazon Athena (Athena)**: ~$6 用于 20 个查询,每个查询扫描 60 GB 数据。总扫描数据每个月累积,根据分析频率和范围(日期范围),查询数量和大小可能会有所不同。
- **Amazon QuickSight (QuickSight)**: $24/用户/月(作者,年度承诺为 $18) 和 $3/用户/月(读者)。QuickSight 定价针对创建仪表板的作者用户基于用户数量固定,而读者基于消费仪表板的受众规模。
### CloudFront 单位成本细分
从 [CloudFront Pricing (CloudFront Pricing)](https://aws.amazon.com/cloudfront/pricing/?nc=sn&loc=3) 页面细分 CDN 成本时,最常见的两个输入是数据传输出 (DTO) 到互联网,以及 HTTP 请求数量。这两个维度根据内容服务的 [AWS Region (AWS Region)](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/) 进行定价。例如,截至 2025 年 3 月,不包括免费层,从美国传输的前 10 TB 定价为每 GB $0.085,而从印度传输为每 GB $0.109。另一个 DTO 维度是“到源的数据传输出 (DTOO,又称代理流量)”,其中数据/请求从边缘位置流向您的源,包括 POST 请求、PUT 请求或 WebSocket 流量。
某些用户工作负载需要更低的延迟计算过程,例如按需图像调整大小或轻量 URL 重定向/重写。这些类型的边缘计算工作流会有更多成本,这些成本也可以按租户/团队聚合。CloudFront Functions 更轻量,设计用于请求或响应的转换,如添加标头,而 Lambda@Edge 可以执行更复杂的内容个性化、处理或与其他 AWS/第三方服务的集成。CloudFront Functions 定价基于请求/响应数量(调用),并包含在此解决方案架构中,因为它在边缘工作负载中很常见。
Lambda@Edge 成本基于总请求数量和计算持续时间(以 GB-秒计算,即 AWS Lambda 计算时间和内存的乘积)。GB/秒请求持续时间未包含在此解决方案中,因为需要进一步配置来跨不同 [AWS Regions (AWS Regions)](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/) 集中这些日志(在“解决方案注意事项”部分中进一步解释)。未集成到此解决方案中的其他维度包括:CloudFront [KeyValueStore (KeyValueStore)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/kvs-with-functions.html)、[Origin Shield (Origin Shield)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/origin-shield.html)、无效化以及[实时日志 (real-time logging)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/real-time-logs.html)。
## 演练
请参考 [GitHub 仓库](https://github.com/aws-samples/cloudfront-chargeback-logging) 中的项目,获取使用 AWS CDK 部署解决方案的说明。此参考解决方案部署以下资源:S3 存储桶、API Gateway 端点、Lambda 函数、CloudFront 分布、AWS WAF Web 访问控制列表 (Web ACLs) 以及 Glue 表。部署后,为完全使用此解决方案示例,您需要在控制台登录、运行提供的示例 Athena 查询,并打开 QuickSight 来完成可视化配置。
### 生成日志数据
使用 AWS CDK 部署解决方案后,要开始收集日志数据,您可以通过直接访问 CloudFront 域 URL(AWS CDK 部署的输出)或控制台创建流量到您的各种页面和源。或者,您可以使用本地 curl 命令或在命令行中使用 Amazon Q Developer 和 Q 聊天来辅助生成一些日志数据。
随着标准日志从请求中收集并存储在 S3 存储桶中,AWS Glue Data Catalog 表提供了一个中心化的元数据存储库,允许通过 SQL 使用 Athena 查询数据。Athena 文档提供了[DDL 语句](https://docs.aws.amazon.com/athena/latest/ug/cloudfront-logs.html),用于为 CloudFront 标准日志创建结构化表。您应该看到 CloudFront 标准日志填充您的 S3 存储桶,如 图 3 所示。

图 3. CloudFront 标准访问日志请求
### Athena 查询生成
要在 Athena 中格式化摘要,需要按租户/团队 URI 对请求进行分组。如 CloudFront 单位成本细分部分所述,区域对于多个成本维度是必需的。从标准日志字段 `x_edge_location` 中提取区域代码,使用子字符串案例函数提取字段的第一部分并关联到正确的地理位置和成本费率。
CASE SUBSTRING(x_edge_location, 1, 3)
WHEN ‘IAD’ THEN ‘United States’
WHEN ‘MEX’ THEN ‘Mexico’
WHEN ‘YUL’ THEN ‘Canada’
以下代码使用上面提取的区域子字符串,并在我们的示例中,对从美国、墨西哥和加拿大的数据传输成本应用 $0.085/GB 的定价费率。此逻辑为全球各区域的 AWS Region 代码复制。CloudFront 流量测量单位为千兆字节或 10^2 字节。
CASE
WHEN region IN (‘United States’, ‘Mexico’, ‘Canada’)
THEN cast(sum(bytes) / power(2, 30) * 0.085 as decimal(10,8))
仓库中 chargeback-athena-sql.sql 文件中的 SQL 使用了公共定价的第一层定价。该 SQL 未考虑成本减少折扣或层级,更复杂的成本估算可以通过使用定价事实表添加到此解决方案,其中包含层级或私有定价。
多个每个请求成本语句被连接在一起,为不同租户的各种成本维度(DTO、请求等)创建一个单一视图,如 图 4 所示。这包括以下成本维度切片及其总计,按标准日志行特征(URI)历史聚合:
- 总数据传输出 (DTO) 到互联网(单位为 GB)
- 按服务 AWS Region 聚合的数据传输出 (DTO) 到互联网的成本
- 按服务 AWS Region 聚合的总请求成本
- 代理请求 (DTOO)、代理请求字节以及基于非-GET 请求的成本
- CloudFront Functions 请求和成本,即请求(调用)的平面乘积

图 4. Athena 成本冲销查询输出,按租户 URI 每天细分成本
除了构建用于分析成本冲销的查询外,我们还包含了几个其他查询,用于每个租户的分析,例如缓存命中率和状态码错误计数/率,如 图 5 所示。成本分析只是将租户数据放在 Athena 表中的众多好处之一。日志解析的其他优势包括增强调试性、用户行为分析以及边缘架构的常规使用探索。

图 5. 按租户 URI 的响应状态,包括计数和总请求百分比。
### 使用 QuickSight 进行数据可视化
Athena 是一个强大的基于 SQL 的探索性分析工具,可为创建数据可视化提供基础,从而更快、更有效地显示趋势和模式。上一节构建的查询可以在 QuickSight 中重用,以创建这些可视化的视图。
1. 在控制台中转到 QuickSight,并选择屏幕左侧的 **添加新数据集**。
2. 选择 **Athena** 作为数据源,并为数据集提供一个名称。
3. 在选择表时,选择 **使用自定义 SQL**,并复制并粘贴 GitHub 仓库中 chargeback-athena-sql.sql 文件中的 SQL。
4. 测试 SQL 时,如果出现权限问题,请确保在管理控制台中为存储桶添加了 QuickSight 用户的读取权限。
5. 示例可视化显示了按路径(或标准行特征)分隔的总 DTO、边缘计算使用和总请求指标,该特征用于将冲销成本关联到给定租户/团队。

图 6. 示例 QuickSight 冲销可视化
## 解决方案注意事项
构建此类解决方案时,需要考虑一些事项。
### 标准日志以尽力而为的方式交付
CloudFront 以尽力而为的方式交付访问日志。标准访问日志通常不用于作为每个 CloudFront 请求的精确或完整会计。在某些情况下,特定请求的日志条目可能在处理请求后很长时间才交付,并且在极少数情况下,日志条目可能未交付。数据分析中的常见做法是使用数据样本而不是完整集。您应确认您的用例符合此常见做法,并且不完整的數據集不会影响您的分析。
### Lambda@Edge、无效化、Origin Shield 和其他注意事项
Lambda@Edge 的 GB/秒成本可以从 CloudWatch Lambda@Edge 日志中提取,不像请求(调用)那样,可以从标准日志中推导出来。但是,由于 [CloudFront Regional Edge Caches (CloudFront Regional Edge Caches)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/HowCloudFrontWorks.html) 的分布式性质(Lambda@Edge 在其中运行),包含计费指标 GB-秒的应用日志是区域性的。Lambda@Edge 日志需要集中化和解析,以获取 Lambda@Edge 成本的完整图景。我们之前介绍了[聚合 Lambda@Edge 日志](https://aws.amazon.com/blogs/networking-and-content-delivery/aggregating-lambdaedge-logs/),其中回顾了集中 Lambda@Edge 日志的示例,您可以在其中找到如何引入所有 Lambda@Edge 日志进行更深入分析的示例。根据您的流程和成本冲销精度,可能足够对 GB/秒成本进行基线和外推。无效化也未包含在此解决方案中,但它可能是您的总成本计算的一部分。无效化在[收费](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PayingForInvalidation.html)后使用前 1,000 个无效化路径,并在使用后收费,无论无效化的文件数量如何。对于 Origin Shield 冲销,使用标准访问日志的 `OriginShieldHit` 值作为其 `x-edge-detailed-result-type`。
## 结论
本文演示了如何使用 Amazon CloudFront 标准访问日志实现一个简单的成本冲销解决方案。标准访问日志存储在 S3 中,并使用 AWS 分析服务 AWS Glue Data Catalog、Amazon Athena 和 Amazon QuickSight,通过按 CloudFront 租户/团队级别分组每个请求成本来启用粒度化成本洞察。此解决方案旨在提高多租户 CloudFront 分布的成本透明度,并帮助为软件即服务 (SaaS) 业务或组织推导边缘服务的总成本。要将此冲销解决方案应用到您现有的工作负载,我们建议在低级别环境中部署此参考实现,并调整它以适应您的冲销需求。有关 Amazon CloudFront 的更多信息,请参考我们的[开发者指南](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) 和之前的[内容和博客](https://aws.amazon.com/blogs/networking-and-content-delivery/)。
## 作者介绍

### Nick McCord
Nick 是 AWS 的解决方案架构师,主要专注于 PE 和 VC 资助的初创企业。他经常与创始人及高管作为值得信赖的技术顾问,针对复杂问题的最佳实践提供建议,以推动高效的长期增长。在加入 AWS 之前,他曾在软件开发、站点可靠性、DevOps 和数据工程角色工作。他居住在弗吉尼亚州,与他的三条狗一起,并热衷于早期职业发展和专业指导。

### Alex Moening
Alex 是 AWS 的高级边缘解决方案架构师,他为云技术带来创新思维和深厚的解决问题的专业知识。他专注于内容分发网络,并在为客户构建的众多高规模应用中工作,包括交付生态系统中一些最大的名称。Alex 积极参与行业研究,包括年度 Web Almanac,并通过互动会议和行业活动(如 AWS re:Invent)的演讲分享他的专业知识。
<!-- AI_TASK_END: AI全文翻译 -->