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