![image.png](https://dev-media.amazoncloud.cn/0802a1277ac44681b4ebfb3f314e9003_image.png "image.png")
在亚马逊云科技工作的一大优势在于,在将基础模块交到客户手中的同时,我们可以长期关注他们的使用方式,然后就经常会看到很多出其不意的操作。有时客户是为了行业创新,有时则是为了突破现有的桎梏——这时就意味着我们又要提供新的工具了,以化繁为简。Amazon Lambda 就是这样诞生的。
我们发现有的客户的整个 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)集群处于相对闲置的状态,只是用来等待,等待写入数据库或等待处理文件。**这太浪费了!因此我们下定决心,要构建一项服务,让客户专注于他们的业务程序,而非服务器配置、自动扩展、打补丁和日志记录等简单重复的工作**。于是,我们就写了一份 Doc。
**只要是亚马逊云科技的员工,无论职位与职级,想法都要诉诸纸面——1页纸、2页纸,最多6页纸,用清晰、简洁、具体的文字回答问题**。最为外界所熟知的当属“公关新闻稿与常见问题文档”(PR/FAQ)——这是内部文件,从不对外分享。它要求逻辑清晰且完整、观点立场鲜明、有数据支撑,目的是确保我们可以明确地定义要交付的服务。这非常难!我还从未见过谁能一稿过,而是需要不断收集反馈并一次又一次的修改。但事实证明,一个清晰的文档加上一个好想法,就是能创造卓越的产品——从“一键购买”到 Amazon Prime,再到 Kindle,皆如此。
**此逢 Amazon Lambda 十周年,我们首次公开这份启动 Amazon Lambda 的 PR/FAQ。考虑到篇幅和可读性,我们做了修改,但仍然可以窥见我们在2010初期看到的问题,以及我们在 Serverless 领域的远见。**
过去十年,Amazon Lambda 不断迭代。在阅读本篇文档时,您会发现有些想法最终成为功能,有些变化已悄然发生,比如以1毫秒为单位计费,以及支持 10GB 内存函数。这篇文章是用于提醒我们自己,**铭记我们所追求的是什么:我们要极尽可能的力争完美,但我们也要承认,我们从来都不是无所不能的;写 Doc 的目的不是为了“写得”完美,而是将尽可能“接近完美”的产品交到客户手中,要长期关注他们的使用方式,并与之一起持续创新。**
正如马克布鲁克(Marc Brooker)在新一集 Amazon Developer Podcast 阐述的那样:亚马逊云科技的客户总能出其不意地创造出我们在 PR/FAQ 中意想不到的使用场景,比如 Amazon Lambda。**作为工程师,我们太爱看到这种挑战了。它会激励我们有更远大的想法,打开更广阔的思路。这些出其不意驱动了一系列创新,比如 Amazon SnapStart、FireCracker 和用于 Amazon Lambda 函数容器——才使得所有使用亚马逊云科技产品的人更易于构建。**
谨以此文庆祝 Amazon Lambda 的十周岁!也同样祝福所有曾用它解决复杂问题,突破 Serverless 边界的客户!
### **亚马逊云科技推出 Amazon Lambda**
#### **可扩展、安全可靠的云服务,轻松运行任何代码**
(西雅图时间2014年11月XX日)今天,亚马逊云科技宣布推出 Amazon Lambda ——云代码运行的最简单方式。以前在云上运行代码意味着,创建云服务来托管应用,然后再运行该服务,这就要求开发者成为各个方面的专家:从自动故障切换到安全、可靠性等等。Amazon Lambda 可在数秒内将任何代码转化为安全、可靠、高可用的云服务,并提供可访问的网络端,降低运维成本。**Amazon Lambda 能确保服务瞬时扩展,且性能或行为不变,开发者能够专注于应用本身。Amazon Lambda 几乎没有学习成本,它支持 Java、Node.js、Python 和 Ruby 等语言,并支持每种语言的标准库和三方库**。Amazon Lambda 每个请求 XX 美元,执行时间每250毫秒 XX 美元,因此在任何使用量下都具有成本优势。要开始使用,请访问aws.amazon.com/lambda?trk=cndc-detail。
> **Werner 批注:Serverless 引入了客户只需为其用量付费的理念。我们的目标是按 250ms 的执行时间收费,而在发布时,我们已降至 100ms!**
Amazon Lambda 的使用方式非常简单。开发者可自己选择应用程序的逻辑。准备就绪后,将代码以 ZIP 文件的形式上传。Amazon Lambda 可在数秒内将上传或编写的代码转化为安全、高可用的服务,可以从任何设备或应用程序中调用,无需更改代码或配置,使用 Amazon Lambda 控制台及 [Amazon CloudWatch](https://aws.amazon.com/cn/cloudwatch/?trk=cndc-detail) Logging。
> **Werner 批注:对 ZIP 文件的支持也是2014年的一件大事!如果没有 ZIP,构建者将不得不单独添加文件。**
### **外部常见问题**
#### **一般问题**
**1.什么是 Amazon Lambda?**
Amazon Lambda 是一种安全、可靠和可扩展的 Serverless 服务,允许开发者运行代码而无需管理服务器,适合专注于代码而非云运维的专业人员。
> **Werner 批注:安全性是不容讨价还价的。在 Firecracker 发布之前,我们一直使用单租户 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例——没有两个客户共享一个实例。这样做成本非常高,但不得不这么做,因为我们知道创新迟早会发生,会有更好的解决办法。如今,我们可以将数千个虚拟机安全地打包到一个裸机上。创新从来不是一蹴而就的,有意义的变革往往是循序渐进的。正如杰夫·贝索斯所说:“如果要做任何创新的事情,那你必须承受被误解。如果你不愿意被误解,那就不要做任何创新的事。”**
**2.谁应该使用 Amazon Lambda?**
Amazon Lambda 适合不具备架构知识的开发者,Amazon Lambda 直接将云上运行代码给抽离出来,开发者不需要再考虑选什么样的实例类型、跨可用区切换、runtime、库、给操作系统打补丁等等……对于需要更多控制权和自定义环境的开发者,用 Amazon Elastic Beanstalk 部署管理应用程序,还是可以保留对云资源的绝对掌控。
**3. Amazon Lambda 可托管哪些应用程序?**
Amazon Lambda 可用于托管无需高度定制、长期状态或持久数据库连接的应用程序,无论其流量、语言、大小。
#### **开发和部署应用程序**
**4.如何创建和部署应用程序?**
使用 Amazon Lambda 开发和部署应用程序非常简单:
* 将应用程序代码和任何所需库,以 ZIP 文件的形式,存储在 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 中。
* 使用亚马逊云科技控制台、命令行或 Amazon Lambda invoke API 部署应用程序。
> **Werner 批注:2020年,我们添加了函数容器支持。这简化了依赖关系,让开发者用熟悉的容器工具,甚至超越 250MB 函数限制,部署 10GB 的容器镜像。将大型容器镜像作为函数而不产生延迟,并非易事。我建议大家观看 Marc Brooker 在 USENIX ATC '23 上发表的关于按需加载容器的2023演讲,了解我们是如何做到的。**
**5.如何调用应用程序?**
文件命名规范(如 “main.py”)和可选的代码注释,可轻易地从移动端用 SDK 调用程序,响应 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 或 [Amazon DynamoDB](https://aws.amazon.com/cn/dynamodb/?trk=cndc-detail) 的更新。这使得应用程序调用异常简单,无需学习、部署和维护复杂的框架。同时还支持 Python WSGI、Ruby Rack 和 Node.js 的调用模式。
**6.如何将更新应用?**
将新版本保存在 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 中,或使用简单部署直接从 Git 存储库中更新。部署过程都是相同的:只需使用代码的 URL 调用 Amazon Lambda 上的更新应用程序 API,几秒钟即可完成。
**7.如何在桌面端开发和测试应用程序?**
Amazon Lambda 使用的是运行时和标准库的通用版本,开发者可在桌面或自己的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例上轻松开发、测试和调试代码,其环境与在 Amazon Lambda 上运行相同。
> **Werner 批注:2020年推出的 Serverless 应用程序模型 CLI,那就变得更简单了。**
**8.如何优化在 Amazon Lambda 上运行的应用程序?**
开发者可以尽量减少启动和关闭开销,来降低成本和提高性能。使用标准(默认)版本的库可以最大限度地减少部署和启动开销。
#### **语言和库**
**9.支持哪些语言和库?**
Amazon Lambda 支持您使用 Java、JavaScript、Ruby 和 Python 编写应用程序。
> **Werner 批注:正如我在前面所说,我们在推出 Node 支持后,一直关注客户使用 Amazon Lambda 的情况,并根据这些经验添加了对其他流行运行时的支持。以下是时间表:**
>
> * **Node 支持(2014年11月)**
>
> * **Java 支持(2015年6月)**
>
> * **支持 Python(2015年10月)**
>
> * **.NET 支持(2016年12月)**
>
> * **Go 支持(2018年1月)**
>
> * **Ruby 支持(2018年11月)**
>
> * **自定义运行时(2018年11月)**
**10.如何访问其他亚马逊云科技服务?**
无需学习或使用特殊的 API,Amazon Lambda 托管的应用程序可访问互联网的任何服务。为了方便起见,我们还预装了亚马逊云科技产品的客户端 SDK。
**11.如果没有我想使用的库怎么办?**
可以加载第三方库,同时支持本地自定义库。
> **Werner 批注:虽然我们并不知道客户会如何使用 Amazon Lambda,但我们知道支持本地自定义库,是必需的。2018年,我们推出了 Amazon Lambda Layers,让开发者能够创建多层可重用代码、自定义库,亦或是创建应用监控或安全层**。
**12.Amazon Lambda 如何维护运行时环境?**
Amazon Lambda 负责更新操作系统、运行时、标准库和预装三方库,同时确保高可用性。自动运维让开发者无需做更多的动作。而且应用程序代码和库都不会被更改。
**13.如何响应重大更新?**
Amazon Lambda 为每种语言提供最通用的版本作为默认运行时,也可以在配置文件中选择其他版本。
**14.运行的代码有限制吗?**
由 Amazon Lambda 托管的应用程序是无状态的;持久状态应存储在 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail)、[Amazon DynamoDB](https://aws.amazon.com/cn/dynamodb/?trk=cndc-detail) 或其他可用存储服务中。入站网络连接由 Amazon Lambda 管理。出于安全考虑,限制某些级别低的系统调用,但语言功能和大多数库都能正常运行。本地文件系统访问仅用于临时存储数据,在每次调用之后都会被清空。这些限制让 Amazon Lambda 代替开发者启动和扩展应用程序多个副本,以应对快速增加的请求。
#### **调用应用程序**
**15.如何调用 Amazon Lambda 上的应用程序?**
一旦部署了应用程序,就可以通过 Amazon Lambda 的 invoke API、命令行或亚马逊云科技控制台调用。开发者还可以通过移动客户端调用,在 Amazon Simple Workflow Service 的 crontab 文件中引用它,将其设置为 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 或 [Amazon DynamoDB](https://aws.amazon.com/cn/dynamodb/?trk=cndc-detail) 更新的处理程序,或将它命名为 [Amazon Simple Notification Service](https://aws.amazon.com/cn/sns/?trk=cndc-detail) 发布目标。
**16.如何响应 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) PUT 或 COPY 操作?**
使用 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 的 SetUpdateHandler API,确定 Amazon Lambda 需要处理的应用程序、存储桶和路径,并确认 PUT、COPY 的更新。之后,每次 PUT 或 COPY 更新都会触发应用程序,以及相应的 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 的操作。
**17.如何响应 [Amazon DynamoDB](https://aws.amazon.com/cn/dynamodb/?trk=cndc-detail) 的更新?**
使用 [Amazon DynamoDB](https://aws.amazon.com/cn/dynamodb/?trk=cndc-detail) 的 SetTableHandler API,确定要跟踪的表格。之后,相关表格的每次成功写入都会触发相应的应用程序,使其能够响应 [Amazon DynamoDB](https://aws.amazon.com/cn/dynamodb/?trk=cndc-detail) 的更新。
> **Werner 批注:使用过 Amazon Lambda 触发器的客户肯定注意到,这项功能比 PR/FAQ 里写的还要简单得多。**
**18.如何以 cron 托管的形式调用应用程序?**
开发者有两种选择:在大多数情况下,只需使用 Amazon Lambda 控制台 UI、命令行工具或 API 配置应用程序,并指定运行时间即可。极少数更复杂的情况下,Amazon Simple Workflow 支持 crontab 指定作业的功能,并允许开发者使用 Amazon Lambda 确定其活动。
**19.如何批处理应用程序?**
可以用 Amazon Lambda API 和应用程序代码,进行 Amazon Lambda 应用程序的批处理;还可以用 [Amazon Simple Queue Service](https://aws.amazon.com/cn/sqs/?trk=cndc-detail) (SQS) 维护作业队列,用 Amazon Lambda 集成 SQS 监控运行。
#### **安全**
**20.如何确保应用程序的安全?**
应用程序在沙箱中执行,彼此隔离,保护代码和数据的完整性。
**21.如何控制应用程序可访问的服务和数据?**
Amazon Lambda 与 Amazon IAM 的集成,使开发者和管理员能够按照安全角色控制其可访问的数据和服务。确保只授予所需的最小权限,并且权限有时效性。
**22.如何保护我的源代码?**
Amazon Lambda 的文件隔离确保每个应用程序只能对自己可见。应用程序的传输始终是加密的。固定性测试分层进行,防止开发者意外更改代码。代码加密备份在服务器端并存储在 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 中。
#### **容量和规模**
**23.如何快速扩展以响应请求?**
低延迟,Amazon Lambda 几乎瞬时调度底层计算资源——每次调用应用程序时,Amazon Lambda 都会快速找到空闲资源并安全运行代码,而且只对实际执行时间收费,所以对非经常性或周期性的调度操作有很高的成本优势。面对突发不可预测的工作负载,如移动应用突然出现的流量激增,开发者也无需预测:按秒计费,即便在负载忽高忽低的情况下,Amazon Lambda 也能同时兼顾高度响应和成本效益。
**24.如何保护程序免受流量拥堵的影响?**
当调用应用程序时,会将其放置到有足够容量的 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例上。Amazon Lambda 会持续监控每个应用程序及其计算集群的性能,如有需要则自动获取额外容量。
**25.扩容和缩容的速度如何?**
应用程序启动时,Amazon Lambda 的扩展速度与启动速度匹配。应用程序是按 CPU 用量计费,Amazon Lambda 的费用在下一秒程序启动完成后立即结束,没有预热或冷却期,也不收费。
**26.Amazon Lambda 的可用性?**
Amazon Lambda 为其上运行的应用程序**提供99.99%的可用性**。没有维护窗口或计划停机时间。
#### **限制和配额**
**27.应用程序可以运行多久?**
批处理和定时作业的应用程序会在连续(挂钟)运行约4小时后终止,但出于维护或安全需要有时会提前终止。由 HTTP 请求启动的应用程序必须在请求期间完成,通常是30秒内,但有时会调用批处理,这使得比原始请求时间长。
> **Werner 批注:批量和定时作业是在后来才出现的,但我们当时已经知道这是客户想要的。**
**28.应用程序可以使用多少内存?**
每个运行应用最多**可分配 1GB 的虚拟内存**。
#### **性能**
**29.使用 Amazon Lambda API 调用应用程序的延迟是多少?**
根据 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)托管的客户端调用 echo 应用程序的时间,**典型延迟时间在 20-50ms 之间**。首次部署应用程序和调用近期未使用应用程序,延迟会高一些。
> **Werner 批注:在过去十年,我们一直改善延迟,主要是通过 Firecracker microVMs 实现的。我们在2022年推出了 SnapStart,将冷启动延迟(尤其是 Java 函数)降低了90%。**
**30.我的代码运行在什么 CPU 上?**
在 Amazon Lambda 上运行的应用程序在 vCPU 上执行,最低额定值为1 ECU。
**31.Amazon Lambda 如何支持并行处理?**
开发者可以同时运行多个应用程序或同一应用程序的多个副本。开发者还可以使用亚马逊云科技客户端 SDK 以编程方式访问 Amazon Lambda API,以协调运行其他应用程序。
举例来说,当原始图片存储在 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 上时,要创建图片的十种不同形式,单个应用程序可以串行生成所有十种形式。或者,可以注册十个处理程序,每个处理程序只处理一个任务。后一种方法通常**能让 Amazon Lambda 和 [Amazon S3](https://aws.amazon.com/cn/s3/?trk=cndc-detail) 并行工作,从而更快地完成。**
### **内部常见问题**
**1.什么情况下“不”建议客户使用 Amazon Lambda?**
移动后端和任何亚马逊云科技服务内嵌的脚本,Amazon Lambda 会在“幕后”发挥作用,有这样需求的客户会自然地选择该服务。
亚马逊云科技的事件处理程序、可以轻易表达为应用程序的批处理或实时作业,是 Amazon Lambda 擅长的任务。Amazon Lambda 以近乎无限的能力来并行运行多个应用程序,兼具易用和简洁的特质,快速完成任务。Amazon Lambda 还具备超强的性价比,最大限度地降低成本。
希望访问底层 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)实例的客户、希望使用服务更多语言编写代码的客户、需要“有状态”代码的客户,则应该使用 Amazon Beanstalk 或 Amazon EC2。
**2.Amazon Lambda 的原则是什么?**
除非您能提出更好的原则,否则截至当前 Amazon Lambda 的原则是:
* **安全而不复杂**——亚马逊云科技的服务将保护客户数据拒绝未经授权的访问,并抵御攻击。开发者无需采取更多行动,即可从操作系统、运行时和库中享受最新的安全性保护。
* **简单易用**——“无运维”(NoOps)服务,通过为开发者提供无差别的管理,用户也可以自助部署和管理自己的应用程序。
* **弹性扩展(直至为零)**——在不更改代码或配置的情况下扩展应用程序,可以支持从“每月一次”到“每秒一千次”的应用调用。
* **任何规模下都具有成本效益**——精细化的按需收费,开发者无需为闲置时间付费。我们努力实现成本和计费粒度的最小化。
* **服务集成**——使开发者轻松地从应用程序内部访问亚马逊云科技的服务。
* **可靠**——我们为亚马逊云科技的服务和在其上运行的应用程序,提供可预测和可靠的运行。
> **Werner 批注:在亚马逊云科技,“原则”(Tenet)是指导团队决策和整体战略的根基。你可以在每个文档中找到它,它让我们忠于自己的初心。在发展变化中,原则是我们的唯一指南,在共识很难达成时,原则帮助我们简化决策。**
**3.为改善客户体验,我们考核和优化哪些指标?**
我们将努力优化客户体验的三个关键指标:**延迟、吞吐和可用性**;并将监控第四个指标——**抖动**,以保障客户体验。
* **延迟**:通过运行在 [Amazon EC2 ](https://aws.amazon.com/cn/ec2/?trk=cndc-detail)上的金丝雀客户端,反复调用托管在 Amazon Lambda 上的 echo 应用程序来公开监测延迟,并公开延迟图表。我们还在内部监测服务器端延迟、进程和代码缓存的有效性,以及从进程调用到执行客户代码的延迟。
* **吞吐量**:用分页速率、CPU 利用率和网络带宽,衡量每台主机的资源使用情况,确定出现延迟的应用程序;并在日志和 [Amazon CloudWatch](https://aws.amazon.com/cn/cloudwatch/?trk=cndc-detail) 中展示挂钟执行时间。
* **可用性**:Amazon Lambda 服务本身和应用程序的可用性,由 [Amazon CloudWatch](https://aws.amazon.com/cn/cloudwatch/?trk=cndc-detail) 监控和报告。
**4.Amazon Lambda 如何为客户节约成本?**
Amazon Lambda 按需付费的定价模式为客户节省成本,为实际使用的计算资源付费,特别适合中小型客户和对程序调用不频繁的用户。对大客户而言,Amazon Lambda 可以优化工作负载,减少专用实例,以此降低成本和满足 IT 管理需求。Amazon Lambda 为客户提供操作系统和运行时维护,与其他云服务协作,确保应用程序的安全性、可扩展性和高可用性,并降低成本。
![image.png](https://dev-media.amazoncloud.cn/5338af67ef034395a2a091b79b6bf5f5_image.png "image.png")
![image.png](https://dev-media.amazoncloud.cn/35d406d209b8489e943fa55f37954d7a_image.png "image.png")
![image.png](https://dev-media.amazoncloud.cn/8d908ddecabc4384826f10354d1dbfbc_image.png "image.png")
![image.png](https://dev-media.amazoncloud.cn/7d116afdd22f48e795e85375c448ba40_image.png "image.png")