每个主要的云服务提供商都提供免费套餐。AWS 免费套餐、Google Cloud 的永久免费套餐、Azure 的 12 个月信用额度、Vercel 的业余计划、Supabase 的入门套餐。它们对于原型设计和学习确实很有用。但它们也是精心设计的陷阱,会在你的项目获得关注的那一刻,通过锁定效应和成本爆炸来让你陷入困境。
我曾帮助三家初创公司完成从免费套餐架构到生产基础设施的过渡。每家公司都遇到了未曾预料到的成本,这并非因为定价被隐藏,而是因为在免费套餐阶段做出的架构决策创造了昂贵的依赖关系。这就是我学到的经验。
架构锁定问题
免费套餐不仅仅是给你计算和存储。它们给你一种特定的软件开发方式,这种方式与提供商的生态系统深度耦合。考虑 AWS 上的典型”免费套餐堆栈”:
- Lambda(每月 100 万次免费请求)
- DynamoDB(25GB 免费存储)
- API Gateway(12 个月内 100 万次 API 调用免费)
- S3(12 个月内 5GB 免费存储)
- CloudWatch(基础监控)
对于小型项目,这个堆栈确实是免费的。但每个组件都是 AWS 特有的服务。你的 Lambda 函数使用 AWS SDK 调用。你的数据模型是围绕 DynamoDB 的键值模式设计的。你的 API 路由在 API Gateway 配置中定义。当你需要扩展或迁移时,你不仅仅是移动”一个应用”——你是在重写整个 AWS 原生应用。
DynamoDB 示例
DynamoDB 的免费套餐很慷慨:25GB 存储空间和足够的读写容量,足以满足大多数原型需求。问题在于 DynamoDB 要求你根据访问模式而非关系来设计数据模型。在 DynamoDB 的单表设计中运行良好的模式看起来是这样的:
// SaaS 应用的 DynamoDB 单表设计
{
"PK": "ORG#org_123",
"SK": "USER#user_456",
"GSI1PK": "USER#user_456",
"GSI1SK": "ORG#org_123",
"email": "dev@example.com",
"role": "admin",
"entityType": "OrgMembership"
}
这是不可移植的。当你需要迁移到 PostgreSQL(因为你需要连接、事务或全文搜索)时,你不仅仅是迁移数据——你是在重新设计整个数据层。我曾合作的一家初创公司花了 6 周时间和 45,000 美元的工程时间从 DynamoDB 迁移到 PostgreSQL。免费套餐在原型设计期间为他们节省了大约 200 美元。
真实成本分解
当你超出免费套餐限制时,以下是基于三个真实项目(匿名处理)的实际成本构成:
项目 A:SaaS 仪表板(B2B)
| 阶段 | 月度成本 | 发生情况 |
|---|---|---|
| 免费层级(第1-6个月) | $0 | Lambda + DynamoDB + S3 |
| 首批付费客户(第7-9个月) | $47 | 略微超出免费层级限制 |
| 增长阶段(第10-14个月) | $380 | API Gateway成本激增 |
| 迁移月份 | $2,100 | 同时运行新旧基础设施 |
| 迁移后(VPS + 托管数据库) | $95 | Hetzner + Supabase Pro |
API Gateway的惊喜很常见。每百万次请求收费3.50美元,听起来很便宜。但是,一个拥有500活跃用户的仪表板,每个用户每会话进行50次API调用,每月20个会话,仅从正常使用就会产生每月50万次请求。如果再加上实时更新的WebSocket连接,成本会迅速累积。
项目B:内容平台(B2C)
这个项目从Vercel的免费层级开始,使用Next.js。免费层级包含慷慨的无服务器函数调用和带宽。当他们需要以下功能时,问题出现了:
- 图片优化:超出免费层级后,Vercel对每次图片转换收费。一个拥有用户上传图片的内容平台仅图片优化一项就达到每月180美元。
- 边缘函数:免费层级对执行时间的限制意味着需要升级到Pro版本(每团队成员每月20美元)。
- 分析:Vercel Analytics是付费服务。他们需要它来做业务决策,又增加了每月50-150美元。
对于一款服务12,000月活跃用户的应用,在发布后三个月内,月度总成本从0美元增加到420美元。
出口税
数据出口——将数据移出云提供商的成本——是最阴险的隐藏成本。AWS对向互联网传输数据的收费为每GB 0.09美元(超出每月前100GB后)。这看起来微不足道,直到你考虑:
- 一个2MB的API响应被调用10万次 = 200GB = 单个端点每月18美元
- 备份到外部服务:将500GB的数据库备份移出AWS成本为每月45美元
- 多云架构:在AWS和GCP之间移动的数据,两端都会收费
# 计算实际出口成本
# 此脚本根据您的CloudWatch指标估算月度出口
aws cloudwatch get-metric-statistics --namespace AWS/EC2 --metric-name NetworkOut --start-time $(date -u -d "30 days ago" +%Y-%m-%dT%H:%M:%S) --end-time $(date -u +%Y-%m-%dT%H:%M:%S) --period 2592000 --statistics Sum --output text | awk '{
bytes = $2;
gb = bytes / (1024^3);
cost = (gb > 100) ? (gb - 100) * 0.09 : 0;
printf "总出口量: %.2f GBn估算成本: $%.2f/月n", gb, cost
}'
Cloudflare 对 R2 存储实施的零出口策略正是针对这一问题的直接回应,这也是 R2 在 2025-2026 年间能够从 S3 手中夺取显著市场份额的原因之一。
监控与可观测性:隐形开销
免费套餐提供基础日志功能。生产级应用需要可观测性。以下是实际成本:
- Datadog: 基础设施部分 $15/主机/月,日志事件 $1.70/百万次。一个包含 3 台主机和合理日志记录的中等规模设置:$125/月。
- New Relic: 免费套餐相当慷慨(每月 100GB 数据摄入),但您实际需要的 APM 功能在超出后收费 $0.30/GB。
- CloudWatch: 自定义指标 $0.30/指标/月。跨服务使用 50 个自定义指标:仅指标部分就需 $15/月,外加日志存储费用。
替代方案——使用 Grafana、Prometheus 和 Loki 进行自托管可观测性——需要一台专用服务器($20-40/月)和维护时间。监控领域没有免费的午餐。
如何构建不受免费套餐限制的架构
目标不是避免使用免费套餐。它们对于原型开发非常出色。目标是要避免那些日后会导致昂贵迁移的架构决策。
1. 使用可移植的数据层
// 而不是特定于 DynamoDB 的代码:
const result = await dynamoDB.query({
TableName: "users",
KeyConditionExpression: "PK = :pk",
ExpressionAttributeValues: { ":pk": "USER#123" }
}).promise();
// 使用可移植的抽象层(Drizzle ORM 示例):
const users = await db
.select()
.from(usersTable)
.where(eq(usersTable.id, "123"));
// 这适用于 PostgreSQL、SQLite、MySQL
// 迁移成本:更改连接字符串
2. 从第一天开始容器化
即使您部署到无服务器平台,也要保留一个可用的 Dockerfile。这是您的逃生舱口。
# 适用于任何容器平台的 Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]
这个容器可以在 AWS ECS、Google Cloud Run、Fly.io、Railway、一台 $5 的 VPS 或您的本地机器上运行。零锁定。
3. 抽象提供商特定服务
// storage.ts - 与提供商无关的存储接口
interface StorageProvider {
upload(key: string, data: Buffer, contentType: string): Promise<string>;
download(key: string): Promise<Buffer>;
delete(key: string): Promise<void>;
getSignedUrl(key: string, expiresIn: number): Promise<string>;
}
// S3、R2、本地文件系统、MinIO 的实现
// 通过更改一个环境变量来切换提供商
class S3Storage implements StorageProvider { /* ... */ }
class R2Storage implements StorageProvider { /* ... */ }
class LocalStorage implements StorageProvider { /* ... */ }
4. 选择前计算10倍成本
在承诺使用一个平台之前,估算10倍当前使用量的成本。如果你的原型处理1,000个用户,那么为10,000个用户定价基础设施。大多数定价计算器使这个过程变得简单直接:
- AWS 定价计算器:
calculator.aws - Google Cloud 定价计算器:
cloud.google.com/products/calculator - Infracost(适用于 Terraform 用户):从你的 IaC 定义估算成本
做对的提供商
并非所有免费套餐都是陷阱。一些提供商的定价模式可以预测性地扩展:
- Hetzner:没有免费套餐,但他们的入门级专用服务器(每月4.50美元)性能优于许多价格高出10倍的云实例。定价透明,不会突然飙升。
- Cloudflare R2:零出口费用。你只需支付存储和操作费用,仅此而已。大规模使用时不会有意外。
- Fly.io:免费套餐虽小,但定价曲线平滑。从免费到每月5美元再到每月50美元是可预测的。
- Supabase:基于 PostgreSQL,因此你的数据层本质上具有可移植性。每月25美元的专业计划涵盖大多数小型 SaaS 应用程序。
底线
免费套餐是营销工具,而非架构建议。将它们用于其本意——一种无需财务风险进行实验的方式。但设计你的应用程序时要考虑到你可能需要迁移它,因为你很可能需要这样做。
最便宜的基础设施决策不是今天价格最低的那个。而是明天能给你选择权的那个。每月5美元运行 Docker 容器的 VPS,其总拥有成本通常比需要花费45,000美元才能迁移的”免费”无服务器架构更低。
构建可移植的。保持灵活性。先阅读定价页面,再阅读文档。
