首先,讲个故事,只要你使用云服务,就可能会遇到这种情况,希望它能成为一个前车之鉴。
其次,研究了一下AWS S3 云服务的计费规则还有哪些值得注意的“坑”。
最后,会给出一些建议,帮助大家避免这些问题
讲个价值 30000 块的故事
这是个真实案例,开发者的名字,我们就不透露了,我们暂时叫他“小帅”。
一天,小帅正在办公桌前摸鱼,结果一条消息把一天的好心情都毁了。
消息显示:在过去的 2 天时间里,小帅的 AWS 账单就增加了 4500 美元。
粗略算下来,下个月的账单费用会高达 63000 美元!
为了找出巨额账单的原因,小帅登录了 AWS 账户,分析了一下账单。他发现,他的 AWS S3 和 Lambda 产生了大量的成本。于是通过查看写入 S3 的 Lambda 列表,他找到了大额账单的源头:在过去的 36 小时里,持续运行了 1000 个并发实例的 Lambda。
那么罪魁祸首是“谁”?
问题出在,一个用于生成不同产品缩略图的 Lambda 函数上。每次他们将图片上传到 S3 中的某个文件夹时,Lambda 都会被触发。然后,它会重新生成一个较小的缩略图,并将其重新上传到 S3。为了防止这个 Lambda 被其自己的缩略图触发,他们在 S3 触发器中添加了一些额外的规则,使其只在图片名带有特定后缀时才被触发。不幸的是,他们的 Lambda 配置中存在一个小错误,没有应用这个规则。这意味着每次 Lambda 创建缩略图并将其写入 S3 时,该 S3 图像都会再次触发 Lambda,导致 Lambda 不断地对同一个缩略图进行再次缩略,就这么进入了一个调用循环。
不幸的是,尽管小帅看到了那条消息,并在 36 小时后就发现了这个问题。但是此时已经产生了 4500 美元的 AWS 账单。
幸运的是,这个故事并不是发生在我们身上,而是一位开发者在网上发出来的。
那么,他们是如何解决这个问题的呢?
他们的前端团队在访问 API 时,Lambda 每次都会改变缩略图,所以对于同一个请求总是收到不同的响应。在经过调查之后,他们在 Lambda 代码中添加了一个规则:如果发现这是缩略图,则不进行处理。Lambda 的递归调用就此停止,也给 AWS 费用的暴增按下了暂停键。
其实这样的案例,屡见不鲜,我记得之前在论坛上还看到过两个。
例如有一位老哥就在 Reddit 上发了自己在 AWS 花 14000 美元“买”的教训。他在 AWS 上开发一个基于事件的应用程序。在调试过程中,系统中存在一个错误。这个错误导致应用程序中出现循环,因此其中一个组件触发了另一个组件,而该组件触发了第一个组件。几天后,账单总计达到 14,000 美元。
是不是很眼熟?又是一个“调用”产生的悲剧。同样的案例还有不少,也是发生在 S3 上。
你以为 Lambda 是 S3 唯一的“坑”?
恐怕不是。
AWS 的账单,或者说各家云服务的计费规则就像一个复杂的游戏规则。既然游戏策划们制定了规则,那我们这些用户也只好去理解规则,好避开那些“坑”。
我们先来看看 AWS S3 计费账单中可能还有哪些“坑”。
首先,从官网信息来看,AWS S3 的计费包括:存储和请求、数据传输、安全和访问控制、管理与见解、复制、转换和查询,6 个部分。
一、存储的增加
首先要注意的是,存储数据的增加。根据AWS S3的标准存储服务的定价,目前每月存储费用为0.023美元/GB。
假设我是用 AWS S3的 standard存储服务。如果我们存储的数据是 50GB,但是新产生了 1MB 的数据。那么根据AWS的计费方式,首先50GB是一个标准的计量单位,而1MB会被向上取整为1GB计算。所以总共存储的数据量为51GB。存储51GB数据的费用为51GB * 0.023美元/GB = 1.173美元。所以存储50GB+1MB的数据需要支付1.173美元。
二、存储类型切换以及文件大小限制
1、S3 提供多种存储类别(如 Standard、Standard-IA、One Zone-IA、Reduced Redundancy、Glacier 等),每种类别的价格不同。但是大多数人不知道,如果你从一种存储类别切换到另一种存储类别需要花钱。对于从标准存储类到不频繁访问类的每 1000 个请求,AWS 收取 0.01 美元的费用。所以当你的业务需求发生变化了,要换一个存储类型的时候,最好提前计算好会花多少钱,以及是否值得这么做。
2、在某些 S3 存储类别中,存在最小文件大小的阈值规定。对于不频繁访问存储类别,最小文件大小为 128Kb。你可以存储更小的对象,就像开篇那个故事中的略缩图,可能也只有几十 Kb。但是,一旦存储更小的文件,AWS 将根据相应存储类费率按 128KB 存储空间计费。
这两个规则,可能会导致一个问题:如果你在 S3 中存有上千万个小文件,随着文件量的增加,你除了要为增加存储支付费用,还必须支付高额的一次性转换费用(因为每个文件的最小费用大小为128KB)。
另一方面,除了存储和数据传输,S3 还会对每个 GET、PUT、LIST 等请求收费。对于大量小文件或频繁访问的场景,可能会产生较高的费用。
三、数据检索
AWS S3 在数据访问频率上也有差别。如果你是长期保存数据,每年只会访问一两次的话,官方建议使用Glacier Deep Archive;如果是长期保存但不经常访问,可以使用S3 Standard Infrequent Access;如果是长期保存并且每季度需要访问一次,那么S3 Glacier Instant Retrieval。
对于 Glacier 和 Deep Archive 等存储类别,如果超出了每季度、每年一次的检索次数,那么还需要额外的费用。
另外,AWS 的流量是会产生费用的,如果你有业务会产生大量流量,那么你最好提前估好预算。
以上是我能看到的 AWS S3 计费账单里的“坑”。如果你还遇到过其他的,欢迎留个言。
四、有一种情况会让你支付巨额迁移费用
适合使用 Deep Archive 业务类型有很多,例如做审计的、合规的,或者是存储一些科研数据,一般来讲这些业务场景都是属于长期存储归档,并且很少访问,也不会取回全部数据,只会在特殊情况下取回一部分。
但是,如果由于一些不可抗力的因素,比如公司数据安全考虑,或者是成本考虑等,你想要迁移其他云服务的时候,就会需要全部取回这些数据,那就会面临巨额的账单。从另一种角度看,Deep Archive 的存储方式等于将这样的客户绑在了自己的平台上,想要离开就要交一笔巨额“过路费”。
当然,也有一些可以建议是可以帮我们避免以上这些计费的“坑”,例如:
-
设置账单警报 CloudWatch
-
每天访问 Cost Explorer(参见计费仪表板)
-
在账单仪表板中,设置预算:当超过预算(例如预算的 80%)时,你会收到通知。它不会阻止你使用 AWS,但会在你超出预算时通知您。
-
如果你是在觉得这些计费规则麻烦,而且自己只是中小型企业,那么干脆更换更简单的云服务。例如:
-
Google Cloud Storage:Google Cloud提供的存储服务在计费上采用与AWS S3类似的方式,但它也提供了一些额外的功能和选项,可能使得计费更为灵活。例如,Google Cloud Storage提供了多种存储类别,允许用户根据数据的访问频率和重要性来选择最适合的存储类型,从而优化成本。
-
Microsoft Azure Blob Storage:Azure Blob Storage是微软提供的云存储服务,其计费模式也相对直观。Azure提供了详细的定价计算器,帮助用户预测和规划存储成本。此外,Azure还提供了多种优惠和折扣选项,可能使得整体成本更为可控。
-
DigitalOcean Space:Space 是 DigitalOcean 的存储服务,每个 bucket 每个月 5 美元,提供 250GiB 存储,1 TiB 出站传输额度,超出的部分另外计费(超额存储0.02美元/GiB,超额出站流量费0.01美元/GiB)。就这么两个计费项,这计费模式应该是这几家里最简单透明的。另外 DigitalOcean Function(相当于 AWS Lambda)每月有90000GiB秒免费,超出的话按照0.0000185美元/GiB秒。每次函数调用的最小运行时间是100毫秒。计费项只有这些。
不过说到底,寻找计费模式相对简单的海外云服务存储,实际上是一个比较主观的问题,因为“简单”这个概念可能因人而异,它最终取决于你的具体业务需求、使用习惯以及对云服务的熟悉程度。