无服务器
概要
无服务器(serverless),是把服务器的配置、扩缩容、打补丁、故障处理等基础设施管理委托给云服务商的架构。开发者专注于编写应用程序代码,不需要关心这些代码在什么时候、在哪台服务器上、以多少台来执行。它的意思不是“没有服务器”,而是“不管理服务器”。
按量计费与成本结构
无服务器的一大特点,是只按发生的请求计费的按量计费模式。传统的服务器 24 小时持续运行,所以即使在流量为零的深夜时段也会产生成本。在无服务器中,没有请求的话,那部分的执行费用也不会产生。
对个人开发和小规模服务来说,这个特性是很大的优势。每月几千次请求左右的服务,请求数能落在 AWS Lambda 的免费额度(每月 100 万次请求)以内。服务成长、流量增加时,也会自动横向扩展,所以事先做容量规划的负担很小。
冷启动及其对策
无服务器的课题之一是冷启动。一段时间没有请求,执行环境就会被销毁,下一次请求时需要重新构建环境。这个初始化处理所需的时间,从不到 100 毫秒到超过 1 秒不等。
减轻冷启动影响的方法有好几种。选择运行时(不同种类启动速度不同)、减小部署包的大小、利用 Provisioned Concurrency(事先确保执行环境的功能)等。像提问箱服务这样需要对用户操作实时响应的服务,需要设计得让用户不太感受到冷启动。
提问箱服务的无服务器架构
提问箱服务从前端到后端都由无服务器构成。前端用 OpenNext 把 Next.js 部署到 Lambda 上,API 用 Lambda Function URL 提供。数据库使用 DynamoDB,认证令牌的发送使用 SES,内容过滤使用 Bedrock。
在这种架构中,没有管理服务器本身的工作,基础设施成本随流量增减。如果让 EC2 实例一直运行,即使没有流量也会按运行时间产生费用,而无服务器架构在流量少的期间更容易压低费用。