如果你曾经想写一个网络应用程序或API,而不需要在服务器上瞎折腾。 亚马逊的Lambda可能就是你要找的东西。
亚马逊网络服务(AWS)是亚马逊开发并公开提供的开发者工具的集合。本文将让你开始使用Lambda,这是AWS套件中的一个工具。我们将使用Lambda创建一个HTTP GET端点,使用GitHub API发出请求,从GitHub提取仓库信息,并返回一个JSON响应。
Lambda的口号是 "运行代码,无需考虑服务器"。乍一看,这可能听起来令人困惑。那么,代码在哪里或如何运行?让我们来了解一下。
要跟上这篇文章,你需要一个自己的AWS账户。你可以在aws.amazon.com创建一个免费的AWS账户。
无服务器和功能即服务
"无服务器 "是一个软件基础设施术语,你可能已经听说过。它描述了一种按需执行代码的解决方案。术语 "无服务器 "可能会产生误导,因为方程中仍有服务器。一个更好的描述词是FaaS,或 "功能即服务"。
这两个定义都描述了一种新的开发和部署体验。这种体验被认为是 "无服务器",因为作为开发者,你不再需要管理、监控或扩展任何正在运行你的代码的服务器。你将你的代码上传到FaaS提供商(本例中为AWS Lambda),由FaaS提供商来执行,并在幕后为你管理任何基础设施。
无服务器架构的优点和缺点
鉴于对 "无服务器 "架构的扩展定义,让我们来看看使用Lambda时的一些优点和缺点。
优点
-
按需使用定价。
传统的服务器托管采用循环计费周期。你的服务器总是启动和运行,使用资源并等待输入。你按月或按年支付费用,以保持它在你的计费周期内运行。有了Lambda,你只需为你使用的计算资源付费,而不是闲置时间。Lambda有两种使用定价模式:持续时间和并发性。 -
持续时间定价
Lambda持续时间定价是根据函数开始执行到终止的时间来计算价格。这种价格计算方式对使用短期计算资源的项目很有利。与传统的 "闲置 "托管方案相比,你可以节省大量的资金。Lambda持续时间的定价如下。
- 每100万个请求0.20美元
- 每GB秒的计算时间为0.00001667美元,每次执行都四舍五入到最近的100ms
持续时间的定价取决于你部署的函数的预先配置的内存用量。这种持续时间和内存的可变性创造了一个定价矩阵,在Lambda定价页面上有进一步的详细说明。
-
并发定价
"提供并发 "模式定价从启用到禁用的时间计算价格。并发模式使lambda函数保持就绪,并从持续时间模式中删除任何启动时间。Lambda并发定价如下。
- 提供的并发性是每GB秒0.0000041667美元
- 请求是每100万个请求0.20美元
- 持续时间是每GB秒0.0000097222美元。
AWS定价页面包括定价矩阵的进一步细节和例子。在Lambda定价页面上了解更多。
-
内置自动扩展
在传统的托管基础设施中,有一段时间你可能需要担心性能和扩展问题。随着你的应用程序的流量和使用量的增加,你可能需要添加更多的托管服务器到你的基础设施,以满足需求。自我管理的扩展可能会给你的用户带来故障和瓶颈。Lambda会在需要时自动处理扩展问题,消除额外的认知开销。
缺点
-
不一致的本地开发工作流程。
你可以在本地编写Lambda函数代码,并对其进行隔离测试。但是,如果不创建你的黑客版本的Lambda,你就无法在本地模拟生产环境。
Lambda的关键概念。代码和触发器
Lambda有两个主要概念:代码和触发器。代码是不言自明的。在我们的例子中,它是你编写并上传到Lambda的JavaScript代码,以产生你想要的行为。
一旦上传,代码就不会自行执行。这就是触发器的作用。触发器是由其他AWS服务触发的事件,将数据传递给Lambda函数执行。
一些触发器的例子可见于以下情况。
- 对AWS API Gateway的HTTP请求触发了Lambda代码
- 一个事件以一定的时间间隔被触发,比如CloudWatch Events的一个cron job
- 一个DynamoDB表被更新并触发了Lambda代码
Lambda代码的函数签名
你通过从JavaScript导出一个符合预期Lambda签名的常规函数来定义Lambda函数。
exports.myLambdaFunction = (event, context, callback) => {
// Use callback() and return
}
该函数接收三个参数。
-
event:Lambda传递给函数的 "触发数据 "的键值对字典。 -
context:AWS内部信息,如AWS请求ID、Lambda到期超时和日志信息。更多信息请参见Lambda文档。 -
callback: 一个标准的异步JavaScript回调处理器。更多信息请参见Lambda docs