程序员为什么要用AWSLamdba?一句话,很简单。AWSLambda和功能即服务平台(如MicrosoftAzureFunctions、GoogleCloudFunctions和IBMOpenWhisk)通过抽象代码堆栈中的内容来简化开发。程序员编写响应某些事件(如表单提交、webhooks等)的函数,上传它们,并在代码执行时付费。在《程序员请注意,无服务器将改变应用程序开发》中,我们介绍了FaaSruntime是如何工作的,以及实现serverless的软件架构。今天,我们将通过在AWSLambda中创建一个简单函数来演示更多事件操作,并讨论这项强大技术的常见设计模式。在2014年的AWSre:Invent大会上,AWS首次发布了AWSLambda。下面举例说明事件驱动计算平台的工作原理:上传图片到S3存储区,触发事件执行Lambda函数。在事件触发之前,该函数驻留在磁盘上的文件中,并且在工作到达之前不使用CPU资源。一旦触发器触发,该函数将加载到Lambda运行时并传递有关事件的信息。在此示例中,该函数将图像文件从S3读取到存储中并创建不同大小的缩略图,然后将其写入第二个S3存储桶。下面我们将创建实施此示例、设置触发器和测试我们的代码所需的框架Lambda代码。我们还将深入研究CloudWatch日志以调试我们遇到的一些权限问题。创建AWSLambda函数并触发创建Lambda函数的方法有很多种,例如Eclipse插件或像ServerlessFramework这样的工具。最简单的方法之一是使用AWS提供的蓝图。如果我们转到AWSLambda控制台并单击CreateNewFunction,将出现以下屏幕:接下来我们使用Node.js创建一个响应S3事件的函数,因此我们从SelectRuntime菜单中选择Node.js6.10,并且inputS3toFilterDialogue:点击s3-get-objectblueprint,进入“ConfigureTrigger”页面:这里设置用于生成事件的bucket(infoworld.walkthrough),事件类型设置为在每个新对象时触发在存储桶中创建。接下来我们还可以进一步过滤,仅在对象名称中有某些前缀或后缀时才触发事件。但是让我们跳过它并单击“下一步”按钮以启用触发器。这创建了基于蓝图的函数的骨架:我们将函数命名为infoworldWalkthrough,我们可以看到它会自动检索触发触发器的对象信息。在同一个配置页面下,我们需要设置一些权限:每个功能都必须分配一个IAM角色,这样我们才能控制对AWS资源的访问。这里我们要求系统新建一个名为infoworldRole的角色,并将该角色的只读权限授予S3。如果我们要实现完整的规范示例并生成缩略图,我们还要添加S3写入权限。但是,由于我们只需要读取有关触发S3对象的信息,因此只读权限应该足够了。***,我们需要注意一些高级设置:最重要的工作是我们要设置内存量和执行超时的上限。请记住,Lambda运行时借用了容器管道,并且它们预装了各种语言运行时。当事件触发时,它会将代码加载到这些容器中并执行函数。内存和超时设置决定了容器的大小以及我们的函数执行所需的时间。在此示例中,默认值128MB和3秒就可以了。如果是其他例子,可以根据自己的需要更改默认值。单击“Next”转到另一个页面,查看我们目前输入的所有设置:单击“CreateFunction”按钮在AWSLambda中创建一个函数。检查我们的AWSLambda代码以下是蓝图为我们创建的默认代码:在第14行和第15行,Lambda函数提取存储桶的名称和触发触发器的对象(也称为键)的名称。然后使用S3API获取有关对象的更多信息,输出(如果一切顺利的话)其内容类型。虽然我们在这里没有这样做,但我们可以很容易地包含,然后读取对象的代码,并相应地生成缩略图。测试我们的AWSLambda代码现在让我们转到S3控制台来解决问题,在这种情况下,存储桶最初是空的:我们将InfoWorld徽标的PNG上传到存储桶:S3控制台尚不可用查看功能是否可用即使通过访问Lambda控制台也无法完全执行。每个Lambda函数都通过CloudWatch记录信息,因此如果我们检查CloudWatch,我们会看到该函数有一个新的日志组。查看日志,显示accesstoS3bucketdenied:当我们的代码试图读取S3对象的信息时,访问数据被拒绝。为什么?是不是因为我们没有设置IAM角色,导致我们的函数对S3bucket有只读权限?我们需要在IAM控制台上仔细检查:是的,这个角色有一个策略,让我们看看:我们有在CloudWatch中创建日志的权限,但不知何故S3只读权限策略没有被采用。单击AttachPolicy按钮后,我们将看到以下界面:通过选择AmazonS3FullAccess选项并按下AttachPolicy按钮,为该功能添加所需的权限。通过手动将PNG文件添加到S3存储桶来测试功能:现在,如果我们按下测试按钮,我们将看到一个对话框,让我们从多个示例事件中进行选择。我们想测试S3put。我们需要编辑S3key和bucketname字段中的值,对应我们图片文件和存储桶的名称:事件中的其他各种字段也可以在这里设置,但是由于我们的代码只看密钥和存储桶名称,因此暂时忽略其余字段。按下保存和测试按钮将触发事件并执行函数。与上次不同,我们在通过S3控制台触发事件时看到了实时反馈。我们还可以在LambdaUI中获取CloudWatch日志的相关部分:您可以看到我们的代码执行并按预期识别内容类型。IDE集成和ServerlessFramework等命令行工具可以显着加快此过程,但此演示展示了通过CloudWatch创建具有正确权限的代码、设置事件和调试代码的能力,并以两种不同的方式触发事件,以便事件可以被测试。功能。让我们来看看一些常见的Lambda设计模式。AWSLambda设计模式无服务器应用程序架构出现了许多设计模式。AWSre:Invent的“无服务器架构模式”和“最佳实践”会议重点介绍了四种模式。接下来,我将介绍两个我最喜欢的模式,因为它们适用于刚刚开始使用Serverless架构!首先,为静态内容构建一个使用S3和CloudFront的Web应用程序,以及一个由Lambda和DynamoDB支持的动态API网关用户,此模型可从S3和CloudWatch获得。授权数据可以利用与DynamoDB交互的各个Lambda函数的API网关和IAM角色的IAM挂钩。我第二喜欢的用例-由CapitalOne为他们的CloudCustodian项目实施-是使用Lambda设置自动化挂钩。在CapitalOne的实施中,CloudWatch日志事件触发Lambda函数以针对CapitalOne特定的合规性和政策规则执行检查。当发现潜在问题时,该功能将通过AmazonSNS生成通知,可以将其配置为发送文本消息、电子邮件和许多其他机制,以提醒相关人员注意需要注意的政策违规行为。我喜欢这种自动化模式,因为它在不以任何方式中断该流程的情况下为现有流程增加了巨大的价值。系统合规性是自动化的,无需接触受监控的系统。更多想法正如我们所见,设置Lambda函数、配置事件、应用安全策略和测试结果是一个没有IDE或命令行工具的快照。微软、谷歌和IBM为其FaaS运行时提供了类似的简单入门功能。再加上设计模式的出现,这无疑将为更高级的工具和重用铺平道路。无服务器应用程序架构表现出截然不同的思维方式。代码片段更小,仅在触发时执行,降低了成本,并通过松散耦合的事件而不是静态定义的API绑定在一起。无服务器支持比以前更快的开发周期,并利用简单的自动化和Web应用程序设计模式来降低风险。
