我们只需4/30即可调整Futureestack注册。条款和条件适用。 现在注册

AWS Lambda入门的提示和实际指导

11分钟阅读

经过肖恩冬天

与流行意见相反,“无法无友”一词并不完全是同义词AWSλ。事实上,Lambda的兴起似乎有激发普遍存在使用术语“无服务器”(可能是误用)。无服务器是一个通用术语,它包括所有不需要管理员启动服务器才能运行的云服务亚马逊DynamoDB.亚马逊S3)。亚马逊网络服务一直在推广无服务器计算有一段时间,AWS Lambda是他们作为服务(FAAS)平台的功能。

AWS Lambda的关键特性是,您可以上传和运行应用程序代码,而基本上没有管理监督。AWS负责你的应用程序的规模和提供高可用性,你的代码只有在通过API调用触发时才能运行。这些轻量级的、不干涉的服务器功能是更改开发人员工作流程

我已经尝试了AWS Lambda,因为它在推出时,在我的业余时间,我建立了一些有趣的项目使用函数和新遗物的AWS Lambda监测集成。我发现Lambda从行为到成本考虑来考虑很多思考。为此,我将这一提示和实用建议放在一起,以便开始使用AWS Lambda。

(注意:其他主要云提供商喜欢微软Azure谷歌云平台已经推出了自己的无服务员FAAS平台,但这篇文章侧重于AWS Lambda。)

如果没有必要,就不要重复做

创建新的AWS Lambda函数时,您可以选择从头开始启动新功能,选择预先配置的模板(或“蓝图”)作为起点,或者使用另一个用户已上传的现有功能AWS无服务器应用程序存储库。如果您正在寻找创建共同的服务或应用程序,那么您将找到进口或借用的实现。无服务器应用程序存储库中的应用程序和蓝图遵守无服务器应用模型(SAM)模板。AWS无要应用程序模型是一个扩展CloudFormation模板- 用于定义AWS Cloud Stack - 定义无服务器应用程序如何连接到其他AWS资源。在某些情况下,运送使用AWS Lambda函数的应用程序可以像部署模板一样简单,并更改一些环境变量和参数。

了解仍然存在底层基础设施

SPOILER ALERT:全部下面,你的AWS Lambda函数运行在AWS后端的容器上

使用无服务器功能的一个主要优点是,您不需要担心管理后端。但是,如果您的AWS Lambda函数使用了大量容器的内存或CPU,或者如果它使用了主机的底层文件系统(例如,编写临时文件),那么您必须相应地指定资源。

值得注意的是,FAAS提供商已经开始推出服务级别协议(SLA)。AWS最近发布了确保每个AWS区域99.95%的可用性。这是Amazon对这项服务承诺的良好标志,也是越来越多的企业在其开发实践和工作流程中采用AWS Lambda函数的可能标志。

不要忽视你的功能

当您第一次触发AWS Lambda函数时,它需要一些时间才能初始化:将代码和任何依赖项加载到分配的容器中,然后开始执行代码。这个初始运行时被称为“冷启动”。随后,及时运行该容器不需要冷启动,因此将更快。

如果您使该函数(以及容器)处于非活动状态,AWS最终将关闭它,并且在下次运行它时该函数将冷启动。对于AWS允许一个功能闲置多长时间,没有明确的衡量标准——一位工程师做了足够多的研究来假设这一点在45分钟不活动后发生60%的冷启动但它似乎依赖于功能大小等因素和共享云中运行的其他函数的需要。

有方法可以最大限度地减少冷启动的影响。首先,考虑构建AWS Lambda功能尽可能小,并最大限度地减少捆绑依赖项。根据我们的2017年服务器状态报告,“AWS Lambda的总代码大小 - 磁盘空间的代码和函数依赖性的磁盘空间往往是较小的现代软件标准。近一半的受监控功能可能几乎适用于3½英寸的软盘。Java功能是值得注意的异常值。它们的平均代码大小超过20MB,指示比Node.js或Python函数明显更大的功能部署大小。“换句话说,将5 MB Python函数加载到冷启动时的新容器中需要的时间比加载20+ MB Java功能的时间明显更少。

减少冷启动的另一种方法是使用“保持温暖”解决方案,以确保AWS Lambda函数容器不会被终止。有许多为此目的而设计的工具,例如无刀长的预热插件,您可以使用它来安排一个“热身”事件,以最低成本每隔几分钟运行您的函数。

当然,如果您的AWS Lambda函数接受并发请求,它将需要启动并发容器,以便您的函数能够尽可能快地为请求提供服务。在这种情况下,如果请求量不断增加,并且AWS必须启动新的容器,那么冷启动可能是不可避免的。

(看看我们的帖子“了解AWS Lambda表现 - 冷酷的人真的很重要吗?“有关冷启动优化的更多信息。)

消除递归,拥抱并发

FAAS模型有可能从根本上改变我们如何部署软件应用程序,但它还要求我们改变我们如何考虑写入软件以适应这种新模型。具体而言,我们需要更改我们如何考虑递归和并发性。

了解AWS Lambda使用非常重要并发规模函数。在传统应用程序中,工程师可能必须将功能插入异步框架,以获取并行运行的请求。使用AWS Lambda,并发由AWS处理;如果没有“温暖”的容器,可用于满足事件来源触发的请求亚马逊API网关亚马逊S3, AWS Lambda将启动一个新的容器。

基本上,AWS删除了一层抽象,并进行并发的工作,所以您不必担心它。

但是自动并发意味着您必须小心处理过程等递归。一些最优雅的工程功能采用了一些递归或包括算法的仔细制作递归实现。但是,在AWS Lambda函数中,您不希望外部功能呼叫自己。如果发生这种情况,AWS将旋转更多的函数实例,并且这些并发实例与冷启动耦合,将花费您计算时间和金钱(此范例中不可分割的概念)。

了解你的限制

功能限制

对于每个AWS Lambda功能请求,AWS设置限制内存分配、磁盘容量和执行时间。2018年11月初,内存分配从128mb开始,上限为3008mb;磁盘容量(/tmp目录存储)限制为512 MB;AWS Lambda函数的最大持续时间为900秒。如果您的函数需要更多内存或持续时间更长,请考虑重构函数,使其更有效,或将其分解为更小的AWS Lambda函数。如果遇到磁盘容量限制,请使用亚马逊S3用于存储。

并发限制

如上所述,AWS Lambda使用并发来扩展您的功能。AWS每个区域设置1,000个并发执行处的默认限制。如果超出此限制,期待一些节流。如果您有一个超出限制的单个函数,请考虑调整功能级别的并发执行限制

部署限额

如果您使用一种支持大型部署包的语言,则可能会遇到部署包限制。目前,AWS为压缩包设置了50 MB的部署限制,为解压缩包设置了256 MB的部署限制。在删除不需要的库时要保持警惕,否则要尽可能保持函数的小。如果您有一组专门的AWS Lambda函数(换句话说,这些函数只执行一项任务),请考虑将它们逻辑地组合到一个函数中,以避免跨AWS Lambda环境部署相同的共享库。

用新的遗物AWS Lambda集成监控您的限制

使用新遗物的AWS Lambda监测集成为了New Relic的基础设施报告调用计数、错误计数、函数计时器、并发性和其他数据指标存货数据。您可以在预构建的仪表板中查看您的AWS Lambda数据,也可以在其中创建自定义查询和图表新的遗物见解

利用互补服务

将您的团队与云带一起带来9

云9是基于浏览器的集成开发环境(IDE),您可以在AWS控制台中使用。通过捆绑必要的插件,库和SDK,AWS已经简单地从Cloud 9中设计并部署了Lambda函数。您可以在一个EC2实例上运行完整的Lamba开发环境,并与您的团队共享实时访问。

使用SAM CLI执行本地开发和迭代

如果要将AWS Lambda函数开发集成到您当地的工作流程中,请尝试开源AWS山姆CLI。AWS SAM CLI允许您在将其部署到生产之前,使用无服务器应用程序模型(SAM)到本地开发,测试和迭代功能。

利用开源,包括无服务器框架

无务框架是一个开源的、与提供者无关的CLI,它允许您在本地开发和测试函数,并在准备好时部署它们。它还拥有一个很棒的开发者社区插件的广泛列表来构建你的功能。

将AWS Lambda函数转换为具有AWS步骤功能的状态机

最终您可能有几个AWS Lambda函数 - 或在容器中运行的几个AWS Lambda函数和服务或在Amazon Elastic Compute Cloud(EC2)实例上 - 在应用程序中执行不同的任务。协调,调试和可视化您的后端中发生的内容可能具有挑战性。这是哪里AWS步骤功能帮助。

将步骤函数视为工作流程,您可以将应用程序定义为必须以特定顺序执行的一系列步骤。它最终类似于州机在无服务器应用程序中强制执行程序流程。

您(可能)不需要对所有事情都使用无服务器功能

随着尖端技术范式划分进入主流,渴望用户自然会想要应用新技术来解决旧问题。使用无服务技术,我们应该努力避免虚假的二分法:它不是关于无刀与雄性的巨石,或无服务器与容器。

相反,让我们努力解决无服务器函数和服务的定义,与其他一切相结合,适合我们的现代化建筑。事实上,一些云用户是在其混合云环境中与传统服务器和容器一起使用无服务器。毕竟,某些应用程序适合无服务器框架,而其他人则不然

如果您正在考虑完全无服务器,我们建议您进行研究,并计算无服务架架构是否对您的需求更便宜或更加可行。你可以进行自己的比较,使用A.AWS计算器,或尝试有趣第三方估计

关于无服务器功能是否准备好了的争论还将持续一段时间,所以一定要与双方确认,就像我们在“伟大的无法辩论“播客。