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

打印 上一主题 下一主题

主题 1826|帖子 1826|积分 5478

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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应用:
  1. 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”的依赖项。
  1. <dependency>
  2.   <groupId>com.amazonaws</groupId>
  3.   <artifactId>aws-lambda-java-core</artifactId>
  4.   <version>1.2.0</version>
  5. </dependency>
  6. <dependency>
  7.   <groupId>com.amazonaws</groupId>
  8.   <artifactId>aws-lambda-java-events</artifactId>
  9.   <version>1.3.0</version>
  10. </dependency>
复制代码
        Lambda函数的背景基本上是一个具有特别方法“handler”的应用步伐。handler方法看起来像如许:
  1. outputType handler-name (inputType input, Context context) {
  2. ………………
  3. }
  4. public String myHandler (String input, Context context) {
  5. ………………
  6. }
复制代码
inputType和outputType可以是以下之一:


  • 原始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函数运行。现在让我们看看代码。
  1. package au.edu.scu.app;
  2. import com.amazonaws.services.lambda.runtime.Context;
  3. public class App
  4. {
  5.     public String myHandler(String name, Context context) {
  6.         return ("Hello, " + name);
  7.     }
  8. }
复制代码
        这是一个简单的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”界面中,执行以下操作:

  • 选择“Author from scratch”,由于我们不使用任何模板。
  • 在“Function name”中,我们给着名称“test-function”。最幸亏名称中带有后缀“-function”。
  • 我们使用Java,因此“Runtime”将是“Java 8 on Amazon Linux 2”。
  • 在“Permissions”中单击“Choose or create an execution role”,然后从列表中选择“Use an existing role”。
  • 从“Existing role”列表中选择“LabRole”。
  • 单击“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。
  1. package au.edu.scu.app;
  2. import com.amazonaws.services.lambda.runtime.Context;
  3. import com.amazonaws.services.lambda.runtime.events.S3Event;
  4. public class App
  5. {
  6.     public String myHandler(S3Event event, Context context) {
  7.         context.getLogger().log("An S3 event is triggered");
  8.         return "Test is complete";
  9.     }
  10. }
复制代码
        我们需要一个新的“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”。
  1. mvn clean package
复制代码
        运行此命令将JAR文件上传到,例如,“xyz-bucket”。
  1. aws s3 cp target/xyz-1.0.jar s3://xyz-bucket
复制代码
        运行此命令以使用上传的JAR文件更新现有的Lambda函数,例如“xyz-function”。
  1. aws lambda update-function-code --function-name xyz-function --s3-bucket xyz-bucket --s3-key xyz-1.0.jar
复制代码
        使用此命令检查Lambda函数是否已更新。一旦看到“END”,您可以按Ctrl+C退出命令行并返回bash。
  1. aws lambda get-function --function-name xyz-function
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表