一年前,我在寻找一个低成本的方式来托管我的个人博客。当时,我的需求很简单:
- 尽量降低成本——毕竟只是一个个人博客,没有盈利,也不想每个月为服务器付费。
- 尽可能少的运维——不想每天盯着服务器是否宕机,能无忧无虑地运行就好。
- 快速响应——不希望读者打开网页时,等上好几秒。
就在这个时候,我无意间发现了 AWS Lambda 的 每月免费额度。AWS 为 Lambda 提供 每月 100 万次请求 和 40 万 GB-秒的计算时间,而对于我的博客而言,每天的访问量并不高,完全可以落在这个免费额度之内。
选择 Go 作为 Lambda 运行时
在研究 Lambda 运行时的时候,我发现 Go 语言是一个非常不错的选择。因为 Go 编译后的二进制文件小,启动速度快,而且内存占用低。正好,我一直用 Go 开发后端项目,这次就顺理成章地选择了 Go。
为了验证 Go 的 Lambda 是否真的快,我做了一些测试。结果让我很惊喜:
从 Lambda 冷启动到博客首页渲染完成,只要几十毫秒!
这让我坚定了使用 Go 的决心。
设计博客架构
Lambda 只是函数执行环境,并不能直接存储静态文件。因此,我将博客的模板和内容存储在 S3,每次有请求时,Lambda 从 S3 读取内容并动态渲染,返回给用户。
整个架构如下:
- S3 存储博客模板、文章内容(Markdown 格式)。
- Lambda(Go 语言) 处理请求,从 S3 读取数据并渲染成 HTML。
- API Gateway 作为入口,将 HTTP 请求转发给 Lambda。
- CloudFront(可选) 作为 CDN,加快访问速度。
这样一来,每次访问博客时,Lambda 只在需要的时候运行,完全不占用服务器资源,而静态文件由 S3 提供,响应速度极快。
运行了一年,费用几乎为零
当我部署完成后,我每天都会关注 AWS 账单,看看我的架构是否真的能保持低成本。
- Lambda:每天的请求次数在几百到几千之间,远低于 100 万次的免费额度。
- S3:存储费用微乎其微,每月大约 几美分。
- API Gateway:请求量较少,基本没产生费用。
最终,我的博客运行了一年,AWS 账单基本上是 $0.00!
遇到的困难:爬虫导致费用激增
不过,这一路并非一帆风顺。有一次,我突然发现 AWS 账单开始上涨,从原本的零成本变成了 几十美元。起初,我还以为是博客访问量增加了,但仔细检查日志后,发现是 爬虫在不断抓取我的博客页面,导致 Lambda 的请求次数暴增。
为了解决这个问题,我修改了博客的 robots.txt 文件,禁止恶意爬虫抓取内容。同时,我还在 API Gateway 端加上了一些 访问频率限制,防止过度请求。
修改之后,我观察了一段时间,发现 Lambda 的调用次数恢复正常,AWS 账单也回到了 $0.00。
总结
如果你也想搭建一个个人博客,又不想花钱,我强烈推荐 AWS Lambda + S3 这种方案。只要你的访问量不是百万级别,Lambda 的免费额度足够支撑你的博客运行。
Lambda 让我重新思考了网站架构,原来真正的“服务器”可以是“无服务器”!