Language:Chinese VersionEnglish Version

每个主要的云服务提供商都提供免费套餐。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美元才能迁移的”免费”无服务器架构更低。

构建可移植的。保持灵活性。先阅读定价页面,再阅读文档。

By

Leave a Reply

Your email address will not be published. Required fields are marked *

You missed