云计算-无服务器计算与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
相关推荐
亚林瓜子11 小时前
AWS Elastic Beanstalk部署极简Spring工程(EB CLI失败版)
spring·云计算·aws·cli·eb
Johny_Zhao14 小时前
Vmware workstation安装部署微软SCCM服务系统
网络·人工智能·python·sql·网络安全·信息安全·微软·云计算·shell·系统运维·sccm
国际云19 小时前
阿里云国际站与国内站的核心布局与本土化服务的选择
阿里云·云计算
小雨光19 小时前
阿里云ECS部署Dify
阿里云·云计算
亚林瓜子1 天前
AWS Elastic Beanstalk控制台部署Spring极简工程(LB版)
spring·云计算·aws·elb·beanstalk·alb·eb
国际云,接待1 天前
云服务器的运用自如
服务器·架构·云计算·腾讯云·量子计算
Blossom.1181 天前
使用Python实现简单的人工智能聊天机器人
开发语言·人工智能·python·低代码·数据挖掘·机器人·云计算
亚林瓜子1 天前
AWS Elastic Beanstalk控制台部署Spring极简工程
java·spring·云计算·aws·eb
小王格子1 天前
AI 编程革命:腾讯云 CodeBuddy 如何重塑开发效率?
人工智能·云计算·腾讯云·codebuddy·craft
亚林瓜子1 天前
AWS CloudTrail日志跟踪启用
云计算·aws·log·cloudtrail