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

news2024/11/16 17:51:52

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1705099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Eureka全面解析:轻松实现高效服务发现与治理!

一、引言 Eureka是Netflix开源的一款服务发现框架&#xff0c;它提供了一种高效的服务注册和发现机制&#xff0c;适用于大规模分布式系统。本文将详细介绍Eureka的相关知识。 二、Eureka简介 Eureka是一个基于REST的服务发现框架&#xff0c;它提供了一种简单的服务注册和发…

签到打卡页面如何设计?

设计一个UI签到打卡页面时&#xff0c;以下是一些建议和注意事项&#xff1a; 页面布局&#xff1a;将签到打卡按钮放置在页面的显眼位置&#xff0c;以便用户快速找到。可以考虑将其他相关信息&#xff0c;如签到日期、时间、地点等也显示在页面上&#xff0c;以增加用户的参…

Modbus工业网关

随着工业自动化程度的不断提高&#xff0c;设备之间的数据通信与交互变得至关重要。在这一背景下&#xff0c;Modbus协议凭借其简单、可靠、开放的特点&#xff0c;成为了工业自动化领域中最常用的通信协议之一。而HiWoo Box网关作为一款支持Modbus协议的工业网关设备&#xff…

C++ std::reference_wrapper:让引用更强大

std::reference_wrapper 的通俗易懂解释 一、简介二、std::reference_wrapper 的初衷三、常用示例3.1、与 make_pair 和 make_tuple 一起使用3.2、引用容器3.3、通过 std::thread 按引用传递参数给启动函数3.4、引用作为类成员3.5、按引用传递函数对象3.6、与绑定表达式一起使用…

Megatron-LM源码系列(八): Context Parallel并行

1. Context Parallel并行原理介绍 megatron中的context并行(简称CP)与sequence并行(简称SP)不同点在于&#xff0c;SP只针对Layernorm和Dropout输出的activation在sequence维度上进行切分&#xff0c;CP则是对所有的input输入和所有的输出activation在sequence维度上进行切分&…

「小明赠书活动」第四期《Java开发坑点解析:从根因分析到最佳实践》

⭐️ 赠书 - 《Java开发坑点解析&#xff1a;从根因分析到最佳实践》 这是一本帮助Java开发人员规避常见错误的书。从业务代码开发、项目技术设计、代码安全3个层面剖析150多个常见坑点。 业务代码开发层面&#xff0c;近20个方面的坑&#xff0c;涉及多线程、数据访问、池技术…

【VTKExamples::Utilities】第四期 CameraModifiedEvent

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例CameraModifiedEvent,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. CameraModifi…

521源码-免费音乐源码-最新流媒体在线音乐系统网站源码| 英文版源码| 音乐社区 | 多语言 | 开心版

免费音乐源码 一键自动安装&#xff1a;安装用翻译看提示操作即可 本源码下载地址&#xff1a;最新流媒体在线音乐系统网站源码| 英文版源码| 音乐社区 | 多语言 | 开心版 - 521源码 更多网站源码学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源…

APM2.8如何供电

APM2.8飞控供电有两种&#xff0c; 1.电流计供电&#xff0c; 2.带BEC&#xff08;稳压功能&#xff09;的电调供电 飞控有一个JP1&#xff0c;它是一个供电选择接口&#xff0c;当插入跳线帽时&#xff0c;飞控用带BEC电调供电&#xff0c;当不插入时&#xff0c;用电流计供…

基于springboot的论坛管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的论坛管理系统3拥有两种角色 管理员&#xff1a;用户管理、公告管理、帖子管理、分类管理、留言管理、系统管理等 用户&#xff1a;登录注册、查看发布帖子等 1.1 背景…

深度学习论文: YOLOv10: Real-Time End-to-End Object Detection

深度学习论文: YOLOv10: Real-Time End-to-End Object Detection YOLOv10: Real-Time End-to-End Object Detection PDF: https://arxiv.org/pdf/2405.14458 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/PyTo…

如何评价 OpenAI 最新发布支持实时语音对话的模型GPT-4o?OpenAI发完GTP-4o,国内大模型行业还有哪些机会?

文章目录 OpenAI发完GTP-4o&#xff0c;国内大模型行业还有哪些机会&#xff1f;详细了解一下OpenAI最新发布的支持实时语音对话的模型GPT-4o国内大模型如何寻找发展机会&#xff1f;想要发展技术必须要创新与追赶或许应用场景拓展也是一种出路产业生态构建 ChatGPT 问世才 17 …

隆道专属商城 | 助力企业跨平台整合优势资源,解决采购寻源比价难题!

数字化采购时代&#xff0c;企业面临着日益激烈的市场竞争&#xff0c;如何优化资源配置、降低采购成本、提高采购效率成为企业追求的核心目标。当前&#xff0c;网上商城凭借其强大的供应链资源整合能力&#xff0c;为企业内部采购商城的搭建提供了独特的优势&#xff0c;已然…

【Lexus.4】Executive Sedan——Dismantling Follow-up

文章目录 【碰撞测试】前后防撞钢梁偏置碰撞A/B/C柱&#xff0c;边梁抗拉、屈服强度 【底盘】平整度护板&#xff08;发动机&#xff0c;底盘&#xff09;前副车架结构前悬架形式后悬架形式与材质簧下质量 【发动机】【轮上马力】【零部件供应商】 来自2021《懂车大爆炸》——是…

网络风暴:揭秘DDoS攻击的幕后黑手

在数字化时代的浪潮中&#xff0c;网络攻击已成为一种新型的战争手段。其中&#xff0c;分布式拒绝服务攻击&#xff08;DDoS&#xff09;以其强大的破坏力和隐蔽性&#xff0c;成为网络安全领域的一大挑战。DDoS攻击通过发动海量的恶意流量&#xff0c;如同狂风暴雨般席卷目标…

Springboot项目——博客平台

前言&#xff1a;为巩固之前学习的知识&#xff0c;同时锻炼自己的代码能力&#xff0c;项目经验&#xff0c;熟悉前后端交互方式等&#xff0c;特此完成一个博客平台系统。&#xff08;总之&#xff0c;为了学习&#xff0c;为了进步&#xff09; 博客平台&#xff1a;本项目…

干货|图生代码实例整理,让你的代码更高效

前言 “图生代码”。这项新功能允许开发人员直接利用产品设计图一键生成相应的代码&#xff0c;极大地提高了编程效率和研发速度。甚至会未来软件开发可能迎来一场革命性的变革。但图生代码究竟能直到什么程度&#xff1f;本文结合一款图生代码的实例程序整理了一些有代表意义…

如何在 DigitalOcean Droplet 云主机上创建 Ubuntu 服务器

在本文中&#xff0c;你将通过 DigitalOcean 的管理面板创建一个 Ubuntu 服务器&#xff0c;并将其配置为使用你的 SSH 密钥。设置好服务器后&#xff0c;你可以在其上部署应用程序和网站。 本教程是DigitalOcean云课程简介的一部分&#xff0c;它指导用户完成将应用程序安全地…

期望薪资30k字节java2面,A给B转账的同时B给A转账怎么并发量最高

一面 1、自我介绍 2、详细介绍一下自己的做的项目&#xff1f;根据项目提了一些问题 3、hashmap原理 4、B树原理&#xff1f; 5、final禁止重排序原理&#xff1f; 6、设计一个榨汁机类&#xff0c;面向对象怎么设计&#xff1f; 7、get、post区别&#xff0c;使用场景&…

mysql实战——mysql5.7保姆级安装教程

1、上传 上传5.7压缩包到/usr/local目录下 2、解压 cd /usr/local tar -zxvf mysql--5.7.38-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.38-linux-glibc2.12-x86_64/ mysql 3、创建mysql用户组和用户 groupadd mysql useradd -g mysql mysql 4、创建数据目录data&#xf…