本文共 4486 字,大约阅读时间需要 14 分钟。
摘要:第一手的一步一步的,带你体验亚马逊“函数即服务(function as aservice)”平台。
为什么一名开发者应该使用AWS Lambda?简单一句话的说,AWS Lambda-是另外一种事件驱动方式,“function-as-a-service”就像Microsoft Azure 的函数计算、谷歌云的函数计算、IBM 的OpenWhisk-simolify,实现了开发工作的任何事情从代码和底层的堆栈的分离。开发者写一个功能来响应特定的事件(例如一项表单提交、创建一个网络链接、给数据库添加一行),上传这些代码,只有代码运行的时候才付费。
在“无服务器计算如何改变应用发展”一文中,我指出function-as-a-service(FaaS)如何运行及如何启用无服务器软件架构的具体要点。今天我们进一步亲自动手在AWS Lambda上创建一个简单的函数,然后讨论一些常见的让这项技术更强大的设计模式。
在2014年的AWSre:Invent大会上第一次宣布了最早的FaaS运行态,即AWSLambda。重新修改图片大小然后上传到亚马逊S3,是最常见用于解释事件驱动的示例,计算即服务平台的仍然保留了这个例子,如下图:
一个图片被上传到一个S3桶中,触发一个执行Lambda函数的事件。在事件被触发之前,函数以文件的形式保存到硬盘上,在工作任务下达之前没有CPU资源的使用(或者预留)。一旦触发,函数进入Lambda运行时并且传递有关事件的信息。在这个例子中,函数从S3中读取图片文件到内存中并且创建各种尺寸的缩略图,然后写入到第二个S3桶。
让我们走进一点看看,我们不必麻烦到具体实现修改图片尺寸的代码,但是,我们将创建实现这个示例所需的Lambda代码的框架,以实现这个示例,创建触发器,然后测试代码。我们还将深入了解CloudWatch日志,以调试我遇到的一个小权限问题。
创建一个AWS lambda 函数和触发器
创建一个AWS lambda 函数有许多方式,包括使用像Eclipse这样的IDE工具,或者像无服务器框架这样的工具,但是最容易的起步方式是使用AWS提供的蓝图(译者注:英文原文为blueprint,本意为蓝图,亚马逊这里应该类似产品的代号,在这里还是翻译为蓝图)。如果我们到AWS Lambda的控制台,然后点击创建新函数,我们将得如下图的界面:
我们将使用Node.js创建一个响应S3事件的函数,我们从运行菜单选择Node.js 6.10,并且进入过滤器对话框:
在蓝图上单击s3 -get-object,然后我们进入到配置触发器页面:
在这里,我们设置将用于生成事件的桶t(infoworld.d .walkthrough),并设置事件类型,以在该桶中创建新对象时触发。我们可以进一步过滤事件,只有当对象名称中的某些前缀或后缀出现时才会触发,但是我们会跳过它,然后点击复选框,在按下Next按钮之前启动触发器。
下一步将创建基于蓝图的函数的框架:
我们给我们的函数命名为infoworldWalkthrough。尽管我们稍后会更仔细地查看代码,但你可以看到它自动检索引起触发器的对象的信息。
在同样的配置页面下,我们需要做一些权限设置:
每个函数都必须有一个IAM角色,这样我们就可以控制它对AWS资源的使用。在这里,我们要求系统创建一个名为infoworldRole的新角色,并将这个角色设置为S3的只读权限。如果我们要实现完整的规范示例并生成缩略图,我们还需要添加S3写权限。但是,因为我们只会读取触发的S3对象的信息,所以只读权限应该是足够的。
最后,我们需要注意一些高级设置:
最重要的项目是在顶部的部分,我们设置了内存的数量和执行超时。请记住,Lambda运行时使用的是容器,这些容器预装了不同的语言运行时。当事件触发时,它将把我们的代码加载到其中一个容器中并执行我们的函数。内存和超时设置决定了容器的大小,以及我们的函数必须执行多少时间。就我们的目的而言,128MB和3秒的默认值将会很好。对于其他用例,这些设置通常被更改。按下Next我们到一屏,我们可以回顾我们已经输入的所有设置:
按下Create Function按钮,将保存我们的输入并在AWS Lambda中创建我们的函数。
检查我们的AWS Lambda代码
下面是蓝图为我们创建的默认代码:
在第14行和第15行,Lambda函数提取了bucket的名称和引发触发器的对象名称(也称为键)。然后它使用S3 API获取关于该对象的更多信息,并(如果顺利的话)输出其内容类型。我们还没有这样做,但是我们可以很容易地包含代码,然后在对象中读取,并相应地生成缩略图。
测试我们的AWS Lambda代码
现在让我们到S3控制台中,观察下桶的问题,在这个例子中,开始完全是空的:
然后上传一张PNG的图片到这个桶:
然后……到底是什么?
从S3控制台上,不清楚我们的函数是否执行了,如果你进入Lambda控制台,你将会发现类似的信息缺乏。然而,每个Lambda函数都通过CloudWatch记录信息,因此如果我们检查CloudWatch,我们就会看到我们现在有了一个新的日志组:
检查这个日志显示对S3 bucket的访问被拒绝:
出于某种神秘的原因,当我们的代码试图读取关于S3对象的信息时,它被拒绝访问该数据。但是为什么呢?我们是否设置了IAM角色,以便我们的函数在S3存储桶上具有只读权限?让我们在IAM控制台进行双重检查:
是的,事实上这个角色有一个策略。让我们来看看这个策略:
奇怪的是,我们有在CloudWatch中创建日志的权限,但是在任何地方都没有提到S3。不知何故,我们的S3只读permissons策略没有接受。让我们解决这个问题。
如果我们按下附加策略按钮,我们将看到下面这个屏幕:
通过选择AmazonS3FullAccess选项并按下附加策略按钮,我们应该提供所需的所有权限。
这次我们将使用内置的测试钩子,而不是像以前那样手动地将PNG文件添加到S3 bucket中来测试函数。回到主页,我们的函数:
现在,如果我们按下测试按钮,我们将会得到一个对话框,让我们从许多例事件中进行选择。我们想测试S3 put。我们需要在S3 key和bucketname字段中编辑值,以对应我们的图像文件和bucket的名称:
在这里可以设置的事件中有各种其他字段,但是因为我们知道代码只查看键和桶名,所以我们可以忽略其余部分。按下保存和测试按钮将触发事件并导致我们的函数执行。不像上次,当我们通过S3控制台触发事件时,这次我们看到了实时反馈。我们还得到了CloudWatch日志的相关部分,在Lambda UI中:
您可以看到我们的代码执行并确定了内容类型。
使用IDE集成工具和命令行工具Serverless框架可以大幅加速这个过程,但是这个例子已经展示了创建具有正确权限的函数所涉及的基本步骤,搭建事件,通过监测和调试代码,以及两种不同的方式触发事件的函数进行测试。
让我们总结一下一些常见的Lambda设计模式。
AWS Lambda设计模式
已经出现了许多用于服务器应用架构的设计模式。在12月的AWS re:Invent大会上,一个名为“无服务器架构模式和最佳实践”的会议强调了四个这样的模式。在这里,我将介绍我的两个最喜欢的内容,因为它们代表任何想要开始使用无服务器架构的组织的甜蜜果实。
首先,很容易构建web应用程序,使用S3和CloudFront用于构建静态内容,并使用Lambda和DynamoDB支持的API网关以满足动态需求:
这种基本模式可以与多个级别的安全紧密联系在一起:
对于所有的用户来说,web应用程序的大部分内容都是只读的,并且这种模型可以从S3和CloudWatch中得到很便宜的服务。被授权的数据可以利用IAM钩子进入API网关,以及IAM角色,以单独的Lambda函数与一个DynamoDB交互。
我的第二个最喜欢的用例,一个由CapitalOne实现的云托管项目,即使用Lambda建立自动化挂钩。在CapitalOne的实现中,CloudWatch日志事件触发Lambda函数对特定于Capital One的遵从性和策略规则进行检查。当发现潜在问题时,该函数会通过Amazon SNS生成通知,可以将其配置为发送SMS消息、电子邮件和其他一些机制,以提醒正确的人注意那些需要注意的违反政策的行为。
我喜欢这种自动化模式,因为它为现有过程增加了巨大的价值,而不会以任何方式干扰这个过程。系统的遵从性是自动化的,不涉及被监视的系统。和之前的模式一样,它为组织提供了一种简单的方法,让企业能够轻松使用无服务器计算。
服务之外的思考
正如我们所看到的,即使没有IDE或命令行工具,搭建Lambda函数、配置事件、应用安全策略以及测试出结果是小菜一碟,微软、谷歌和IBM的FaaS运行态也同样轻松。此外,更好的设计模式正在出现,这无疑将为工具的多次使用更好的铺平道路。
无服务器架构代表了一种非常不同的心态。代码块更小,降低成本,只有在触发时才执行它们,它们通过松散耦合的事件而不是静态定义的api来绑定在一起。服无务器提供了比以前更快速的开发周期,并且通过简单的自动化和web应用程序设计模式来绘制,很容易以低风险开始。
本文翻译源:
https://www.infoworld.com/article/3204669/application-development/get-started-with-aws-lambda.html
译者补充:
原文标题直译为:“为什么是无服务器计算?遇见AWS lambda”。无服务器计算是目前云计算的热点,由亚马逊首先提出,目前主流的公有云都支持。本文用一个示例,通过一步一步的配置,让读者对无服务器计算有了了解。通过本文可以感受到,通过无服务器计算,业务层的开发者不需要掌握底层的知识,也不需要关心底层的资源如何调度,很好的提高了开发效率,降低了开发门槛。
无服务器计算背后的技术应该使用的是容器,隔离性,安全性如何有待时间的验证。
目前没有听说那个业务全部使用无服务器计算,或者有那个公司有大规模使用无服务器计算的例子,公有云的无服务器计算在大压力情况下表现如何,还需要验证,应该也有一个过程。
Lambda的背景知识,Lambda(大写Λ,小写λ)读音:lan b(m) da(兰木达)['lmd]是第十一个希腊字母。大写Λ用于:粒子物理学上,小写λ用于:物理上的波长符号。计算机编程语言中的Lambda 表达式是一个匿名函数,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型(以上引用自自百度百科)。可见亚马逊使用Lambda代表自己的无服务器计算产品,也有一定的深意。
原文链接:infoworld
欢迎加我微信(ID:xiaolikvm)一起交流。
转载地址:http://rmdkx.baihongyu.com/