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

2024-05-29 1084阅读

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”的依赖项。

  com.amazonaws
  aws-lambda-java-core
  1.2.0


  com.amazonaws
  aws-lambda-java-events
  1.3.0

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

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

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函数运行。现在让我们看看代码。

    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”的按钮。

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

            单击“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”按钮。

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

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

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

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

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

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

            在“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”。

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

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

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

            我们可以“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”。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            在“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
    
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]