云计算-无服务器计算与AWS Lambda (Serverless Computing with AWS Lambda)

2024-05-28 09:44

本文主要是介绍云计算-无服务器计算与AWS Lambda (Serverless Computing with AWS Lambda),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AWS Lambda

无服务器计算与AWS Lambda

        AWS Lambda支持无服务器计算,不需要任何预配置和管理,同时还能最大限度地降低成本。我们将看到如何创建一个简单的Lambda函数,以及如何将其与AWS事件映射。在现实生活中,任何托管在线的应用程序或服务都可能有多个并发用户访问。在设计应用程序时,扩展是一个重要因素。AWS Lambda是一种无服务器计算服务,使用它我们可以运行代码而无需担心服务器(基础设施、扩展和容器)的预配置和管理。AWS Lambda会自动扩展和缩减我们的代码,无需管理。这是成本效益的,因为我们只需为代码消耗的执行时间付费。

创建Handler

        AWS Lambda允许创建自动运行的函数(即方法),这种特定函数由称为“handler”的源代码片段管理。Handler可以是一个简单的使用日志记录器,也可以包含用于在S3或DynamoDB中执行多个操作的高级代码。我们可以为这个handler添加触发器,以便当我们的S3桶或DynamoDB表中发生变化时,上传为handler的代码会在Lambda中自动运行。

我们需要上传的代码可以在Cloud9编辑器中编写。我们可以通过以下命令创建一个名为“Hello”的简单Maven应用:

mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=au.edu.scu.app -DartifactId=lambdaapp

        现在我们需要更改pom.xml文件,附录1末尾提供的源代码是本周实验的工作文件。我们需要为“java-core”和“java-events”添加两个依赖项。只有当我们将触发事件与handler一起添加时,才需要“java-events”的依赖项。

<dependency><groupId>com.amazonaws</groupId><artifactId>aws-lambda-java-core</artifactId><version>1.2.0</version>
</dependency><dependency><groupId>com.amazonaws</groupId><artifactId>aws-lambda-java-events</artifactId><version>1.3.0</version>
</dependency>

        Lambda函数的后台基本上是一个具有特殊方法“handler”的应用程序。handler方法看起来像这样:

outputType handler-name (inputType input, Context context) {………………}public String myHandler (String input, Context context) {………………}

inputTypeoutputType可以是以下之一:

  • 原始Java类型(例如String或int)。
  • 在aws-lambda-java-events库中预定义的AWS事件类型。例如,S3Event是库中预定义的POJO之一,提供方法以便您轻松读取来自传入Amazon S3事件的信息。
  • 您自己的POJO类型:您还可以编写自己的POJO类。AWS Lambda将根据POJO类型自动序列化和反序列化输入和输出JSON。要了解POJO,请参阅模块3教程(B部分)。

        我们可以将以下代码放入App.java中。我们从头开始构建代码,因此这种方法被称为“创作”。代码包含一个名为“myHandler()”的handler,它应该有一个“Context”对象以及一个原始或POJO作为输入类型。我们可以在handler中放入更多复杂的代码,以执行更多AWS操作。现在,我们将看到一个简单的handler。这个handler还可以以其他方式设计,例如使用“RequestHandler”接口。请记住,如果我们使用“RequestHandler”接口,我们的handler方法名称必须是“handleRequest()”。在本教程中,我们将使用更简单版本的handler,因此我们可以为handler方法命名任何名称。我们不需要为这个应用程序编写主方法,因为我们只会构建应用程序,而不会运行它。它将由Lambda函数运行。现在让我们看看代码。

package au.edu.scu.app;import com.amazonaws.services.lambda.runtime.Context;public class App 
{public String myHandler(String name, Context context) {return ("Hello, " + name);}
}

        这是一个简单的handler方法,它接受两个参数——一个“String”和一个“Context”参数。“Context”对象提供有关函数调用的信息,并返回一个“String”输出。

        现在我们需要打包这个handler。我们可以通过使用mvn package命令轻松完成打包。打包完成后,创建的JAR文件需要通过右键单击并选择“下载”来下载。我们需要这个JAR文件来在AWS Lambda中创建Lambda handler。将JAR文件上传到您的S3桶,并复制S3 URI以备后用。

创建Lambda函数

        可以通过在“AWS Management Console”的搜索栏中轻松找到“Lambda”服务。如果单击左侧的“Functions”菜单,将显示所有可用的Lambda函数列表。如果单击“Dashboard”,将看到一个名为“Create function”的按钮。

        单击“Create function”按钮将带我们进入下面的“Create function”界面,在这里我们需要提供函数详细信息,包括名称、JDK(运行时)版本、执行角色。

        在“Create Function”界面中,执行以下操作:

  1. 选择“Author from scratch”,因为我们不使用任何模板。
  2. 在“Function name”中,我们给出名称“test-function”。最好在名称中带有后缀“-function”。
  3. 我们使用Java,因此“Runtime”将是“Java 8 on Amazon Linux 2”。
  4. 在“Permissions”中单击“Choose or create an execution role”,然后从列表中选择“Use an existing role”。
  5. 从“Existing role”列表中选择“LabRole”。
  6. 单击“Create function”按钮。

        一个新窗口将出现如下。现在我们必须上传handler的代码,可以作为.jar或.zip文件上传,或从S3桶中引用。我们已经在S3中上传了JAR文件,并记录了S3 URI,现在我们需要提供它。

        在“Code”选项卡下,我们需要提供JAR文件URI并单击“Save”。

        在“Runtime settings”部分,我们需要选择正确的运行时(即Amazon Linux 2),并提供正确的handler名称为“package.main class::handler”,即“au.edu.scu.app.App::myHandler”。然后单击“Save”。

测试Lambda函数

        我们现在将测试Lambda函数。由于我们的handler接受一个字符串输入,我们将通过提供一个字符串值来测试Lambda函数。我们将必须创建一个测试事件来调用函数。在“Test”选项卡下,我们选择“Create new event”。

        这个新事件将从“hello-world”事件模板改编。我们需要为“Event Name”命名,即“test-event”。关键部分是我们提供的测试值。myHandler()方法接受一个字符串输入,因此我们必须给出一个字符串值作为测试输入。AWS Lambda使用JSON序列化和反序列化此输入。

        我们可以“Save”测试事件。但是,如果我们只想测试一次,可以通过单击“Test”按钮来测试函数。我们将在“Execution result”中看到函数的输出。现在需要注意的是,这种类型的测试仅适用于我们使用Java数据类型作为输入时,例如String、int等。然而,如果我们使用事件作为输入(我们将在下一节中这样做),则无法这样测试。在这种情况下,我们需要添加一个称为“触发器”的东西并测试Lambda函数。

为Lambda函数添加触发器

        触发器是一个Lambda属性,我们可以配置它以响应外部事件调用我们的Lambda函数,例如在S3中上传新文件,在DynamoDB中插入记录。我们现在将看到如何为S3桶添加触发器以调用Lambda函数。此触发器将在S3桶中发生任何更改时自动调用Lambda函数。在此示例中,我们将使用“创建”对象的事件来演示。我们可以简单地上传一个文件来模拟这个过程。我们需要一个与上一节使用的handler稍有不同版本的myHandler()。我们将使用以下代码在Cloud9中创建我们的新handler。

package au.edu.scu.app;import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.events.S3Event;public class App 
{public String myHandler(S3Event event, Context context) {context.getLogger().log("An S3 event is triggered");return "Test is complete";}
}

        我们需要一个新的“S3Event”类的import语句。此handler将由S3事件调用,因此我们必须使用S3Event类型的输入参数。上述代码将在S3桶中尝试创建对象时被调用。代码将在AWS Lambda中写入日志,“A S3 Event is triggered”。我们将不得不按照前面提到的步骤将其打包为.jar文件并作为函数上传到AWS Lambda中。我们再次构建应用程序,下载JAR,上传到S3桶,复制S3 URI。然后我们通过将S3 URI添加到“代码”中来更新handler,因为现在我们有新的JAR文件。

        现在我们必须“Add trigger”,并在“Trigger configuration”中选择“S3”。

        它将在同一窗口中带来一些配置输入字段。从列表中选择一个现有桶,在此示例中桶名称为“csc73001-lab-prithwi-2”。我们选择“所有对象创建事件”作为“事件类型”。我们勾选“递归调用”的确认框。单击“Add”按钮将触发器添加到我们的Lambda函数。

它将带我们回到Lambda函数主页。

        现在我们将通过向指定桶中上传文件来测试Lambda函数。我们可以上传(实际上是一个创建事件)任何文件到桶中。一旦文件上传,一个事件将触发我们与桶事件映射的Lambda函数。由于我们创建的handler应该在被调用时写入日志,我们可以在Lambda界面中看到该日志。要查看输出,单击“Monitor”选项卡。然后单击“View logs in CloudWatch”按钮。它将打开一个带有日志流列表的新窗口。

        单击“View logs in CloudWatch”按钮将打开这个新页面。

        我们单击最新的日志流,应该能够看到handler写入的日志。

        要查看此信息,我们首先必须转到“Configuration”选项卡,然后单击“Permissions”菜单。我们将看到一个名为“Execution role”的部分,其中列出了“robomaker_students”角色。

        我们单击“LabRole”链接,它将带我们进入AWS IAM控制台,并显示当前为“LabRole”角色设置的“Permission policies”摘要。在“Permission”选项卡下,我们将看到此角色下存在的策略列表。您还将在页面顶部看到一个称为Amazon Resource Name (ARN)的“LabRole”角色的标识。Amazon为每种资源类型的管理目的保留此标识。

        在“Add permission”按钮下,您将看到“Create inline policy”,通常用于为LabRole添加额外权限。但是,我们无权完成此操作。因此,这仅供您参考。不要尝试修改或更新任何内容。

上传JAR文件并自动更新Lambda

        每次我们更新Cloud9应用程序时,需要打包JAR,下载它,然后手动上传到Lambda函数,这是一项繁琐的任务。有一种方法可以从Cloud9 bash终端自动完成此操作。在此过程中,我们将JAR文件上传到S3桶中,然后将该桶作为Lambda代码的源进行引用。

        首先,确保Lambda函数已正确创建和配置,例如运行时设置。 通过以下命令构建Cloud9应用程序。例如,我的JAR文件是“xyz-1.0.jar”。

mvn clean package

        运行此命令将JAR文件上传到,例如,“xyz-bucket”。

aws s3 cp target/xyz-1.0.jar s3://xyz-bucket

        运行此命令以使用上传的JAR文件更新现有的Lambda函数,例如“xyz-function”。

aws lambda update-function-code --function-name xyz-function --s3-bucket xyz-bucket --s3-key xyz-1.0.jar

        使用此命令检查Lambda函数是否已更新。一旦看到“END”,您可以按Ctrl+C退出命令行并返回bash。

aws lambda get-function --function-name xyz-function

这篇关于云计算-无服务器计算与AWS Lambda (Serverless Computing with AWS Lambda)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010213

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显