公司新闻
首页 > 公司新闻 > 通过使用 Amazon Athena 对请求进行分类,了解 Amazon S3 数据传输成本 存储博

通过使用 Amazon Athena 对请求进行分类,了解 Amazon S3 数据传输成本 存储博

2026 .01 .27

深入理解亚马逊 S3 数据传输费用及请求分类

关键要点

本文将指导您如何利用亚马逊 Athena 分析 Amazon S3 的数据传输成本,通过区分不同类型的请求来帮助您更好地理解费用构成。您将学习如何启用 S3 服务器访问日志,配置 Athena,执行查询并分析结果,以优化成本及提升数据效率。

成本管理对许多企业来说至关重要。当了解数据传输费用的各个组成部分后,企业可以做出更明智的决策。数据传输费用通常可以分为两类:常见但低成本的请求和不太频繁但成本较高的请求。对这两类数据的分析有助于识别改进的机会。

亚马逊简单存储服务Amazon S3以其按需计费的特性而受到青睐,其中一部分便是数据传输。许多类型的数据传输是不收费的,往往这些请求在您的 S3 使用中占据大部分。为了识别产生费用的数据传输来源,过滤那些不产生费用的请求是非常有用的,这样您就可以专注于那些产生成本的请求。

在本文中,我们将逐步展示如何创建一个仅包含导致费用的 Amazon S3 请求的数据集。首先,我们将介绍如何启用 Amazon S3 服务器访问日志并配置 Amazon Athena。接下来,我们将展示如何创建仅返回相关请求的 Athena 查询。最后,我们将讨论如何分析这些剩余记录,以发掘可以进行成本优化的见解。

解决方案概述

Amazon S3 定价页面提供了不收费的数据传输类别细节。为了帮助您分析特定产生数据传输出成本的请求,我们首先将以下几类请求进行过滤:

不产生费用的请求类别描述从互联网传入的数据数据从外部网络传输到 S3在同一 AWS 区域内的 S3 桶之间传输的数据数据在同一区域的不同 S3 桶间传输从 S3 桶到同一区域内的任何 AWS 服务的数据数据从 S3 桶传输到同一区域内的其他 AWS 服务传输到 Amazon CloudFront 的数据为 CloudFront 传输数据

这些类别虽然不产生费用,却在典型用户的总体请求中占据很大百分比。

您可以在 AWS 使用报告中找到每种类型的数据传输的使用量和成本,或者通过 AWS 成本管理工具 AWS Cost Explorer 查询。Amazon S3 的使用类型中,名称包含 InBytes 或 OutBytes 的项大致总结了这些使用情况。有关 Amazon S3 的所有使用类型的完整列表,请参见关于理解您 AWS 账单和使用报告的文档。

AWS 使用报告在桶级别和小时级别总结了 Amazon S3 数据传输使用类型。由于这是一个汇总,使用报告无法直接提供关于导致数据传输的请求、时间及所请求对象的信息。因此,它们不能直接提供关于驱动成本的属性的深入洞见。

Amazon S3 服务器访问日志为发送到 S3 桶的每个请求提供了详细记录。每条记录包括请求的对象键、请求的时间、请求者的远程 IP 以及发送的数据量。这些详细信息可以帮助确定数据传输成本的来源。然而,依据使用模式,每月可能会产生数百万或数十亿条记录,因此您必须过滤掉不产生费用的请求。

以下过滤条件将日志简化为区分收费请求和不收费请求所需的数据:

首要字段我们使用远程 IP 字段:过滤 AWS 服务的内部访问,通常显示为 的远程 IP。这个字段应被过滤掉,因为它属于“同一 AWS 区域内 S3 桶之间传输的数据”。过滤来自您的 VPC 通过 Amazon S3 VPC 端点的访问。这种流量使用私有地址空间中的 IP,如 10000/8,1721600/12 或 19216800/16。我们过滤这个因为它属于“从 S3 桶到同一区域内的任何 AWS 服务的数据传输”。过滤来自 Amazon Elastic Compute Cloud (Amazon EC2) 或同一区域内的任何其他 AWS 服务访问 Amazon S3 公共端点。该流量使用来自同一 AWS 区域的 AWS 公共 IP。过滤访问 CloudFront 服务器的请求。此信息也可从 iprangesjson 文件中查找,我们将其过滤掉,因为它属于“传输到 Amazon CloudFront 的数据”。

我们还使用 Operation 字段来专注于仅检索请求,因为上传请求计算为数据传入,不会产生费用。我们过滤掉除了 RESTGETOBJECT 以外的其他操作请求,因为其他请求可能很小或被分类为数据传入。

在这个解决方案中,我们使用 Amazon Athena 查询 S3 服务器访问日志。虽然您在其他工具中也可以使用类似的技术,但可能需要重写查询语句以正确匹配 CIDR 范围。

前提条件

启用 S3 服务器访问日志以供分析的 S3 桶。本文中使用 AWS 管理控制台中的 Athena SQL。要设置 Athena 与 S3 服务器访问日志的兼容性,请 按照此步骤 创建数据库和表结构以进行查询。为了创建查询,需要运行一个 Python 脚本。了解更多关于 设置 Python 信息。

解决方案步骤

接下来,我们将通过以下步骤进行操作:

生成 Amazon Athena 查询启用 Amazon Athena 版本 3执行 Amazon Athena 查询进行进一步分析

步骤 1 生成 Amazon Athena 查询

在第一步中,我们使用 Python 脚本生成一个 SQL 查询,以便在 Athena 中查找感兴趣的请求,并过滤掉不产生数据传输费用的请求。

通过使用 Amazon Athena 对请求进行分类,了解 Amazon S3 数据传输成本 存储博创建一个文件 generateathenaquerypy,并复制以下代码并保存:

pythonimport sysimport jsonfrom urllibrequest import urlopen

def regiontester(region) def isinregion(prefix) return prefix[service] == AMAZON and prefix[region] == region return isinregion

def iscloudfrontoriginfacing(prefix) return prefix[service] == CLOUDFRONTORIGINFACING

def chunks(lst n) Yield successive nsized chunks from lst for i in range(0 len(lst) n) yield lst[ii n]

if len(sysargv) lt 1 sysexit(No region specified)region = sysargv[1]

with urlopen(https//iprangesamazonawscom/iprangesjson) as url ipranges = jsonload(url)

allprefixes = ipranges[prefixes]internalprefixes = [10000/8 1721600/12 19216800/16]

regionprefixes = [ prefix[ipprefix] for prefix in filter(regiontester(region) allprefixes)]

cloudfrontprefixes = [ prefix[ipprefix] for prefix in filter(iscloudfrontoriginfacing allprefixes)]

allcidr = internalprefixes regionprefixes cloudfrontprefixesquotedcidrs = [f{cidr} for cidr in allcidr]

queries = [nonematch(ARRAY[ (n )join(chunk) ]nx gt contains(x CAST(remoteip as IPADDRESS))) for chunk in chunks(quotedcidrs 100)]

query = SELECT FROM s3accesslogsdbmybucketlog nWHERE operation = RESTGETOBJECT nAND remoteip != nAND (nAND )join(queries)

鲤鱼加速器官方版

print(query)

执行 Python 脚本,并指定您的 AWS 区域:

bashpython generateathenaquerypy useast1

注意 如果您在 Mac 上通过 Home Brew 安装了 Python,可能会在 HTTP 请求下载 JSON 文件时遇到问题。建议您从 Pythonorg 安装 Python。

步骤 2 启用 Amazon Athena 版本 3

Python 脚本生成的 SQL 查询包含 Athena 引擎版本 3 支持的 Trino 函数。如果您尚未启用 Athena 版本 3,请按照以下步骤进行操作。

登录 AWS 管理控制台,选择 Athena。在左侧导航面板中,选择 工作组。

查看与您尝试运行查询的工作组相关的 分析引擎 列。如果显示为 Athena 版本 2,请选择工作组名称。

选择 编辑。

在 升级查询引擎 下选择 手动,然后选择 Athena 引擎版本 3。选择 保存更改。

步骤 3 执行 Amazon Athena 查询

在这一步,我们将执行刚才生成的 Amazon Athena 查询。

访问 Amazon Athena,在左侧导航面板中选择 查询编辑器。将 Python 脚本输出的查询粘贴到查询编辑器中并选择 运行。根据日志数量和请求数量,这可能会花费一些时间。考虑在查询中添加限制以获得更小的数据样本。如果遇到 SQL 语法错误,请仔细检查 步骤 2:启用 Athena 引擎版本 3。您可以通过 下载结果 按钮下载结果并离线分析,或者使用步骤 4 中的指导来自定义查询并进行进一步分析。

步骤 4 进行进一步分析

通过过滤请求,仅保留那些产生数据传输费用的请求,您将更容易识别数据中的模式。以下是对剩余记录进行深入挖掘的一些常见方法。

要找出最常见的剩余 IP,您可以尝试以下查询:

sqlSELECT Count() as Requests remoteip GROUP BY remoteip ORDER BY count() desc WHERE {add where clause here}

还可以尝试按 /24 IP 桶进行分组,因为这些通常是连续的流量源。如果这没有揭示模式,则尝试扩大或缩小块大小以寻找难以通过单个 IP 识别的模式。

查找常见的 IP 以找到其所有者。通常会发现常见源,例如 CDN 服务。请记住,对来自 CloudFront 的 S3 对象的请求不会产生数据传输费用,但其他 CDN 提供商则可能。

或者,查找常用前缀,例如日期或特定命名约定,比如用户名称或桶名称。

如果流量并不匿名,则查找一个常见的 requester,通过以下查询开始:

sqlSELECT Count() as Requests requester GROUP BY requester ORDER BY count() desc WHERE {add where clause here}

常见请求者有助于识别使用特定角色、特定用户或您已分配角色或授权跨账户访问的外部合作伙伴的工作负载。

清理工作

要禁用服务器访问日志,请访问 AWS 管理控制台中的 Amazon S3 页面,选择您启用访问的桶。选择 属性 选项卡,向下滚动到 服务器访问日志,点击 编辑,选择 禁用,然后点击 保存更改。请注意,Athena 只能在查询时收取费用,您不需要手动关闭。

结论

本文介绍了如何通过使用 Amazon S3 服务器访问日志和 Amazon Athena 来分析既不产生数据传输费用的请求和产生费用的请求。我们使用一个简单的 Python 脚本来构建查询,以过滤表示内部、同一区域和 Amazon CloudFront 流量的 CIDR 块,仅留下互联网和跨区域请求。

该解决方案使您能够识别进一步分析的费用来源。您可以利用获得的信息来优化这些来源的成本,或对它们进行合适的归属。您可以选择使用 Amazon CloudFront 等 CDN 来降低直接费用,或与用户合作优化请求模式。

有关更多信息,请参阅博客“Amazon S3 Amazon CloudFront 在云中完美结合”和“通过利用 Amazon CloudFront 的功能优化您的 AWS 架构成本”。

标签 Amazon Athena、Amazon S3 服务器访问日志、亚马逊简单存储服务 (Amazon S3)、AWS 云存储

Ryan Baker

Ryan Baker 是 AWS 的首席技术客户经理,致力于提升企业的韧性、存储及运营最佳实践,此外,他还在安全和网络领域积累了丰富经验。

Jack Marchetti

Jack Marchetti 是 AWS 的高级解决方案架构师,专注于帮助客户现代化并实现无服务器、事件驱动的架构。他目前在芝加哥与妻子 Erin 和猫 Minou 共同生活,同时也是一名编剧,专注于创作圣诞电影和恐怖片。

微软打击下,黑客组织涉嫌利用 Azure OpenAI 媒体

联系我们
留言

Copyright © 欢迎来到鲤鱼加速器官網|鲤鱼加速器 版权所有 网站地图

WeChat
WeChat

留言框-

欢迎来到鲤鱼加速器官網|鲤鱼加速器

13594780386