无服务器强势来袭,程序员应该如何使用?

本文涉及的产品
函数计算FC,每月15万CU 3个月
日志服务 SLS,月写入数据量 50GB 1个月
简介:

程序员为什么要使用AWS Lamdba?一言以蔽之,简单。AWS Lambda和function-as-a-service平台(如Microsoft Azure函数,Google Cloud Functions和IBM OpenWhisk)通过抽象代码堆栈中的内容来简化开发。程序员编写了响应某事件的函数(如表单提交,webhook等),并将其上传,在代码执行时付费。

在《程序员请注意,无服务器将改变应用程序开发》一文中,我们介绍了FaaS运行时的工作原理以及实现无服务器的软件架构。今天,我们会通过在AWS Lambda中创建一个简单函数来展现更多事件操作,并讨论这项强大技术的常见设计模式。

在2014年的AWS re:Invent大会上,AWS首次发布了AWS Lambda。用于解释事件驱动的计算平台平台如何工作的示例如下:

将图片上传到S3存储区,触发执行Lambda功能的事件。在事件触发之前,该函数位于磁盘上的文件中,没有CPU 资源被使用,直到工作到达。一旦触发器触发,该函数将被加载到Lambda运行时并传递有关该事件的信息。在此示例中,该函数将图像文件从S3读入存储器,并创建不同大小的缩略图,然后将其写入第二个S3存储区。

下面我们就将创建实现此示例所需的Lambda代码框架,设置触发器并测试我们的代码。我们还将挖掘CloudWatch日志,以调试遇到的一些权限问题。

创建一个AWS Lambda函数并触发

创建Lambda函数有很多方法,如Eclipse插件或者是类似Serverless Framework这样的工具。这其中最简单的方法之一就是使用AWS提供的蓝图。如果我们转到AWS Lambda控制台并单击创建新功能,就会出现如下界面:

接下来使用Node.js来创建一个对S3事件作出响应的函数,所以我们从Select Runtime菜单中选择Node.js 6.10,并将S3输入到Filter 对话:

单击s3-get-object blueprint,进入“配置触发器”页面:

在这里设置用于生成事件(infoworld.walkthrough)的bucket,并将事件类型设置为在每个bucket中创建新对象时触发。接下来我们也可以进一步过滤 ,仅当存在对象名称中的某些前缀或后缀时才会触发事件。但是我们跳过该操作,并单击“下一步”按钮启用触发器。

这就创建了基于 blueprint的功能骨架:

我们把功能命名为infoworldWalkthrough,我们可以看到它会自动检索触发触发器的对象信息。

在同一配置页面下,我们需要设置一些权限:

每个功能必须分配一个IAM角色,以便我们可以控制对AWS资源的访问。这里我们要求系统创建一个名为infoworldRole的新角色,并将该角色的只读权限赋予给S3。如果我们要实现完整的规范示例并生成缩略图,我们还要添加S3写入权限。但是,由于我们只需读取有关触发S3对象的信息,所以只读权限应该是足够的。

最后,我们需要注意一些高级设置:

最重要的工作是我们要设置内存量和执行超时的上限。请记住,Lambda运行时借鉴了容器的流水线,它们预装了各种语言运行时。当一个事件触发它会将代码加载到这些容器中,并执行功能。内存和超时设置决定了容器将有多大,以及我们的功能需要执行多少时间。在这个示例中,默认值设置为128MB和3秒比较好。如果是其它示例,可以根据自己的需求来更改默认值。

点击“Next”进入到另一个页面,来查看我们目前为止所有输入的设置:

点击“创建函数”按钮在AWS Lambda中创建函数。

检查我们的AWS Lambda代码

以下是blueprint为我们创建的默认代码:

在第14和15行,Lambda函数提取了bucket的名称和触发触发器的对象名称(也称为键)。然后使用S3 API获取有关对象的更多信息,(如果顺利)输出其内容类型。虽然我们在这里没有这样做,但是我们可以很容易地包含,然后读取对象的代码,并相应地生成缩略图。

测试我们的AWS Lambda代码

现在让我们来到S3控制台来解决这个问题,在这种情况下,bucket最开始是空的:

我们将InfoWorld徽标的PNG上传到该存储区:

从S3 控制台还无法看出函数是否被执行,即使访问Lambda控制台,也无法完全获得。每个Lambda函数都通过CloudWatch记录信息,所以如果我们检查CloudWatch,就会看到有一个函数的新日志组。

检查该日志,其显示访问S3 bucket 被拒绝:

当我们的代码尝试读取S3对象的信息时,被拒绝访问数据。为什么呢?是因为我们没有设置IAM角色,以便我们的函数在S3 bucket上具有只读权限吗?我们需要在IAM控制台上仔细检查一下:

没错,这个角色有一个策略,我们来看一下:

我们有权在CloudWatch中创建日志,但是S3只读权限策略不知为何没有被采取。点击附加策略按钮之后,我们会看到下方界面:

通过选择AmazonS3FullAccess选项并按附加策略按钮,为函数添加所需的权限。通过手动将PNG文件添加到S3 bucket中来测试功能:

现在,如果我们按测试按钮,我们将得到一个对话框,让我们从许多示例事件中进行选择。我们要测试S3 put。我们需要编辑S3 key和bucket名称字段中的值,分别对应于我们的图像文件和存储bucket的名称:

事件中各种各样的其他字段也可以在这里设置,但是由于我们的代码仅查看关键字和bucket名称,所以先暂时忽略其余的字段。按保存和测试按钮将触发事件并执行函数。与上一次不同,当通过S3控制台触发事件时,我们看到了现场反馈。我们还可以在Lambda UI中获取CloudWatch日志的相关部分:

您可以看到我们的代码执行并按预期标识了内容类型。

IDE集成和命令行工具(如Serverless Framework)能够显著加速此过程,但是这次演示显示了通过CloudWatch创建具有正确权限,设置事件和调试代码的功能以及两种不同的方式触发事件,以便可以测试该功能。

我们来看看一些常见的Lambda设计模式。

AWS Lambda设计模式

针对无服务器应用程序架构出现了许多设计模式。AWS re:Invent上“ 无服务架构模式”和“最佳实践 ”的会议上强调了四个模式。接下来,我会介绍两个自己很喜欢的模式,因为它们适用于刚刚开始使用无服务器架构!

首先,构建Web应用程序,使用S3和CloudFront进行静态内容,使用由Lambda和DynamoDB支持API网关的动态需求:

这种基本模式可以在多个级别的安全性下紧密锁定:

Web应用程序的大部分内容对于用户来说是只读的,并且可以从S3和CloudWatch获得此模型。授权数据可以利用IAM hook API网关以及与DynamoDB进行交互的单个Lambda函数的IAM角色。

我第二个最喜欢的用例 - 由Capital One为其Cloud Custodian项目实施 - 是使用Lambda设置自动化hook。 在Capital One的实施中,CloudWatch日志事件触发Lambda函数,以针对Capital One特有的合规性和策略规则执行检查。 当发现潜在问题时,该功能将通过Amazon SNS生成通知,可通过Amazon SNS配置发送短信,电子邮件和其他一些机制,以便向正确的人员发出需要注意的违规策略。

我喜欢这种自动化模式,因为它为现有流程增加了巨大的价值,而不会以任何方式扰乱该流程。系统合规性是自动化的,而不会触及被监控的系统。

更多思考

如我们所见,设置Lambda功能,配置事件,应用安全策略和测试结果是一个没有IDE或命令行工具的快照。 Microsoft,Google和IBM为他们的FaaS运行时提供了类似的轻松onboarding功能。 加上设计模式的出现,这无疑将为更高级的工具和重用铺平道路。

无服务器应用程序体系结构表现出非常不同的心态。 代码段较小,仅在触发时才执行,降低了成本,并通过松散耦合的事件而不是静态定义的API绑定在一起。 无服务器可以实现比之前可能更快的开发周期,并且利用简单的自动化和Web应用程序设计模式,风险更低。


本文作者:田晓旭

来源:51CTO

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
4月前
|
固态存储 安全 程序员
搭建程序员个人博客网站的服务器配置怎么选?
搭建个人博客网站时,合理选择服务器配置至关重要。推荐1核CPU、2GiB内存、SSD硬盘及2M-10M带宽,适合大多数个人博客。操作系统方面,Linux更为经济高效。建议选择如阿里云等知名云服务商,同时考虑服务器的可扩展性和安全性,确保网站稳定运行与良好体验。
|
3天前
|
机器学习/深度学习 人工智能 程序员
阿里云出手DeepSeek拒绝服务器繁忙,程序员直呼:真香!
阿里云PAI平台支持一键部署DeepSeek-V3和DeepSeek-R1大模型,用户无需编写代码即可完成从训练到部署的全过程。通过PAI Model Gallery,开发者可轻松选择并部署所需模型版本,享受高效、便捷的AI开发体验。教程详细介绍了开通PAI、选择模型及一键部署的具体步骤,帮助用户快速上手。
|
7月前
|
存储 弹性计算 程序员
新手程序员如何阿里云服务器配置?新人开发者CPU内存带宽存储怎么选?
对于新手开发者、个人或学生选择阿里云服务器,推荐ECS经济型e实例(ecs.e-c1m1.large),适用于小型网站或轻量应用。配置2核2G内存、3M固定带宽、40G ESSD系统盘,仅99元/年且续费同价。
|
8月前
|
人工智能 Linux 程序员
老程序员分享:PhysX和NavMesh在服务器的应用
老程序员分享:PhysX和NavMesh在服务器的应用
|
SQL Java 关系型数据库
java程序员怎么创建自己的网站:第五章:图解阿里云服务器部署SpringBoot项目
java程序员怎么创建自己的网站:第五章:图解阿里云服务器部署SpringBoot项目
213 0
java程序员怎么创建自己的网站:第五章:图解阿里云服务器部署SpringBoot项目
|
缓存 前端开发 NoSQL
程序员该知道大型网站架构的发展历程吗?如何有效地增加服务器?
前面介绍了大型网站的业务需求和大致的工作原理,但是不能简单地理解为只要增加服务器就能把一个网站变成一个能应对大量用户的网站。 通过增加服务器来达到支持更多的用户是大型网站架构的目的。 本节简要介绍大型网站架构的发展,并介绍大型网站架构如何有效地增加服务器。 本节介绍的技术点只要了解即可,后续章节会有更详细的说明。 大型网站系统的内部是复杂的,一般是多种网站架构的混合(包括静态网站、动态网站和B/S架构网站等)。
|
存储 弹性计算 前端开发
云服务器对程序员来说意味着什么?
维基百科写到服务器指: ①一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器(能使用户在其他计算机访问文件),数据库服务器和应用程序服务器。
224 0
|
存储 弹性计算 前端开发
服务器对程序员来说意味着什么,此文带你来了解
一、什么是服务器? 维基百科写到服务器指: ①一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器(能使用户在其他计算机访问文件),数据库服务器和应用程序服务器。 ②运行以上软件的计算机,或称为网络主机(Host)。 服务器通常以网络作为介质,既可以通过局域网对内提供服务,也可以通过广域网对外提供服务,服务器的最大特点就是其强大的运算能力。 一般我们说做APP需要两个人,一个前端,一个后台。 前端:画UI页面及UI交互逻辑的人,需要写一些APP无需联网就能做到的内在逻辑,可能还需要写一些读取、写入后台数据逻辑的接口; 后端:写数据处理逻辑,通过服务器对数据进行处理,给前端提供
166 0
服务器对程序员来说意味着什么,此文带你来了解
|
Java 程序员 Windows
java程序员菜鸟进阶(九)windows下搭建SVN服务器及配置myeclipse SVN客户端
  java程序员菜鸟进阶(九)windows下搭建SVN服务器及配置myeclipse SVN客户端 分类: 学习专区 java Web    1.下载SVN最新版本安装文件,官网下载地址是:http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100,选择最新发布的SVN安装文件进行下载。
1535 0

热门文章

最新文章