AWS Lambda – 快速指南


AWS Lambda – 概述

AWS Lambda是一项执行无服务器计算的服务,即无需任何服务器即可进行计算。该代码根据 AWS 服务中的事件响应执行,例如在 S3 存储桶中添加/删除文件、更新 Amazon dynamo dB 表、来自 Amazon API 网关的 HTTP 请求等。

要使用AWS Lambda,我们只需将代码推送到 AWS Lambda 服务中即可。所有其他任务和资源(例如基础设施、操作系统、服务器维护、代码监控、日志和安全性)均由 AWS 负责。

AWS Lambda支持 Java、NodeJS、Python、C#、Go、Ruby 和 Powershell 等语言。请注意,AWS Lambda 仅适用于 AWS 服务。

什么是 AWS Lambda?

AWS Lambda 官方文档给出的定义如下:

AWS Lambda 是一项计算服务,让您无需预置或管理服务器即可运行代码。AWS Lambda 仅在需要时执行您的代码,并自动扩展,从每天几个请求到每秒数千个请求。您只需为消耗的计算时间付费 - 当您的代码未运行时无需付费。

AWS Lambda 是如何工作的?

下面显示了通过五个简单步骤解释 AWS Lambda 工作原理的框图 -

AWS lambda 框图

步骤 1 -使用 AWS lambda 支持的任何语言上传 AWS lambda 代码,即 NodeJS、Java、Python、C# 和 Go。

步骤 2 -这些是可以触发 AWS lambda 的少数 AWS 服务。

步骤 3 - AWS Lambda,其中包含上传代码和发生触发器的事件详细信息。例如,来自 Amazon S3、Amazon API Gateway、Dynamo dB、Amazon SNS、Amazon Kinesis、CloudFront、Amazon SES、CloudTrail、移动应用程序等的事件。

步骤 4 -仅在以下情况下由 AWS 服务触发时执行 AWS Lambda 代码 -

  • 用户在S3存储桶中上传文件
  • http get/post 端点 URL 被命中
  • 在 dynamo dB 表中添加/更新/删除数据
  • 推送通知
  • 数据流收集
  • 网站托管
  • 电子邮件发送
  • 移动应用程序等

步骤 5 -请记住,AWS 仅在执行 AWS lambda 代码时收费,否则不收费。

使用 AWS Lambda 的优点

当您使用 AWS Lambda 时,它可以提供多种优势。本节详细讨论它们 -

轻松使用代码

AWS Lambda 为您提供上传代码的基础设施。它负责维护代码并在所需事件发生时触发代码。它允许您选择代码所需的内存和超时。

AWS Lambda 还可以根据事件触发器执行并行请求。

日志提供

AWS Lambda 提供代码执行次数、执行时间、消耗的内存等详细信息。AWS CloudWatch 收集所有日志,这有助于了解执行流程和调试代码。

根据使用情况计费

AWS Lambda 根据内存使用情况、发出的请求和执行情况进行计费,按最小 100 毫秒的增量计费。因此,对于 500 毫秒的执行,将每 100 毫秒计费一次。如果您指定 AWS lambda 代码在 500 毫秒内执行,而执行时间仅为 200 毫秒,则 AWS 将仅根据所花费的时间向您计费,即执行 200 毫秒,而不是 500 毫秒。AWS 始终按使用的执行时间收费。如果该功能没有执行,则无需付费。

多语言支持

AWS Lambda 支持 Node.js 等流行语言。Node.js、Python、Java、C# 和 Go。这些都是广泛使用的语言,任何开发人员都会发现为 AWS Lambda 编写代码很容易。

易于代码编写和部署

Lambda 有许多选项可用于编写和部署代码。为了编写代码,您可以使用 AWS 在线编辑器、Visual Studio IDE 或 Eclipse IDE。它还支持无服务器框架,使 AWS Lambda 代码的编写和部署变得容易。除了AWS控制台之外,我们还有AWS-cli来创建和部署代码。

其他特性

您可以通过登录 AWS 免费套餐来免费使用 AWS Lambda。它为您提供一年免费服务。查看 AWS 免费套餐提供的免费服务。

使用 AWS Lambda 的缺点

尽管有很多优点,AWS Lambda 仍具有以下缺点 -

  • 它不适合小型项目。

  • 您需要仔细分析您的代码并决定内存和超时。如果您的函数需要的时间比分配的时间多,它将根据指定的超时终止,并且代码将不会完全执行。

  • 由于 AWS Lambda 的基础设施完全依赖于 AWS,因此如果您的代码需要,您无法安装任何其他软件。

触发 AWS Lambda 的事件

可以触发AWS Lambda的事件如下:

  • 进入 S3 对象
  • Dynamo DB 表中数据的插入、更新和删除
  • 来自 SNS 的推送通知
  • 对 API 网关的 GET/POST 调用
  • CloudFront 中查看器或源请求/响应处的标头修改
  • AWS Kinesis 数据流中的日志条目
  • CloudTrail 中的日志历史记录

AWS Lambda 的用例

AWS Lambda 是一项主要用于运行后台进程的计算服务。与其他 AWS 服务一起使用时可能会触发。我们可以使用 AWS Lambda 的 AWS 服务列表如下:

S3 对象和 AWS Lambda

当 S3 中存在任何文件上传时,Amazon S3 会将事件详细信息传递给 AWS Lambda。文件上传或删除文件或移动文件的详细信息将传递到 AWS Lambda。AWS Lambda 中的代码可以在收到事件详细信息时采取必要的步骤。例如,创建插入 S3 的图像的缩略图。

DynamoDB 和 AWS Lambda

当表中有数据添加、更新和删除时,DynamoDB 可以触发 AWS Lambda。AWS Lambda 事件包含有关插入/更新或删除的 AWS DynamoDB 表的所有详细信息。

API 网关和 AWS Lambda

API Gateway 可以在 GET/POST 方法上触发 AWS Lambda。我们可以创建一个表单并与 API Gateway 端点共享详细信息,并将其与 AWS Lambda 一起使用以进行进一步处理,例如,在 DynamoDB 表中输入数据。

SNS 和 AWS Lambda

SNS 用于推送通知、发送短信等。当 SNS 中发生任何推送通知时,我们可以触发 AWS lambda。当 AWS Lambda 收到触发器时,我们还可以向该电话号码发送短信。

预定事件和 AWS Lambda

计划事件可用于 cron 作业。它可以触发AWS Lambda定期执行任务。

CloudTrail 和 AWS Lambda

CloudTrail 有助于监控帐户日志。我们可以使用AWS Lambda来进一步处理CloudTrail日志。

Kinesis 和 AWS Lambda

Kinesis 用于捕获/存储来自网站点击、日志、社交媒体源的实时跟踪数据,AWS Lambda 的触发器可以对此日志进行额外处理。

CloudFront 和 Lambda@Edge

CloudFront 是一个内容交付网络,您可以在其中托管您的网站,Lambda@Edge 可用于处理来自查看器请求、源请求、源响应和查看器响应的标头。标头修改包括修改 cookie 数据、URL 重写、用于 AB 测试以更改发送给用户的响应、出于安全目的添加额外标头信息等任务。

AWS Lambda – 环境设置

在开始使用 AWS Lambda 之前,您需要登录 Amazon 控制台。AWS Lambda 支持两种 IDE:Visual studioEclipse。在本章中,我们将逐步详细讨论AWS Lambda的安装。

在 AWS 控制台中创建登录名

您可以使用 Amazon 免费套餐在 AWS 控制台中免费创建登录信息。您可以按照下面给出的步骤创建亚马逊登录名以使用亚马逊服务 -

步骤1

转到https://aws.amazon.com/free/并单击创建免费帐户。您可以看到如下所示的屏幕截图 -

亚马逊免费套餐

第2步

单击“创建免费帐户”按钮,您将被重定向到如下所示的屏幕 -

创建免费帐户

现在,根据您的选择在上面所示的表单中填写电子邮件地址、密码和 AWS 账户名称的详细信息,然后单击继续

步骤3

现在,您可以找到如下所示的屏幕 -

联系信息

在此表格中输入所有必需的详细信息。

请注意,根据所选国家/地区,需要支付最低费用。一旦输入的详细信息得到验证,同样的金额将被退还。您需要信用卡或借记卡详细信息才能创建免费帐户。对于印度用户,将扣除2 卢比并收取1 美元。一旦用户得到验证,该费用将退还给相应的卡用户。

请注意,该帐户是免费的,并且服务的使用受到限制。如果使用量超过限制,用户将被收取费用。

在上面显示的表格中输入详细信息后,单击“创建帐户并继续”

您将被重定向到下一个屏幕,如下所示。

步骤4

您需要输入付款详细信息,即信用卡或借记卡,及其到期日期和持卡人姓名,如下所示 -

支付信息

步骤5

输入所有详细信息后,单击“安全提交”,银行将验证该卡,并在您的手机上提供与该卡关联的OTP 。您可以找到一个窗口,如下所示 -

卡详情

现在,输入OTP详细信息并单击“付款”。您需要根据所选国家/地区付费。

步骤6

付款完成后,下一步是电话验证。您需要输入您的手机号码,如下所示 -

电话验证

填写详细信息后,单击“立即致电我”。AWS 将立即使用自动化系统进行呼叫。当通话时出现提示时,使用电话键盘将 AWS 网站上显示的 4 位数号码输入到您的手机上。这将验证您的号码,并且您将在创建登录时在开始时指定的邮件 ID 中收到邮件激活信息。

步骤7

单击邮件链接并输入帐户名或电子邮件 ID 和密码并登录 AWS 服务,如下所示 -

帐户名称

帐户名称显示在右上角,如上所示。您现在可以开始使用 AWS Lambda 服务。对于 AWS Lambda 服务,支持的语言包括 NodeJS、Python、Java、C# 和 Go。

安装 Visual Studio 2017

有 2 个与 AWS 兼容的 IDE:Visual StudioEclipse。在本节中,我们将讨论在 Windows、Linux Mac 上安装 Visual studio 2017。访问 Visual Studio 官方网站: https: //www.visualstudio.com/downloads/。您可以找到如图所示的欢迎屏幕 -

下载社区版本,即Visual Studio Community 2017,现在免费进行练习。安装后,它将引导您完成安装步骤,您需要选择稍后使用的软件包。您可以选择nodejs、python、c#包供我们后续工作。

视觉工作室

针对 Visual Studio 2017 的 AWS 工具包支持

安装 Visual Studio 2017 后,您必须按照给定的步骤安装对 Visual Studio 2017 的 AWS Toolkit 支持 -

步骤1

转到https://aws.amazon.com/visualstudio/并下载适用于 Visual Studio 的 AWS 工具包。显示如下所示 -

AWS 工具包

请注意,为 Visual Studio 2017 下载的包是vsix包。如果您的 Visual Studio 版本在 2013-2015 之间,它将安装msi安装程序。单击下载按钮,如下所示。

AWS 工具包下载

第2步

现在,双击下载的 vsix 软件包,它将运行您完成安装步骤,如下所示 -

AWS安装

Visual Studio 安装成功后,您可以看到一个窗口,如下所示 -

安装完成

步骤3

现在,打开 Visual Studio 2017,您应该会看到来自 AWS 的欢迎页面,如下所示 -

AWS 欢迎页面

请注意,您需要添加访问密钥、秘密密钥、帐号才能开始使用 Visual Studio.s 中的 AWS 服务

适用于 NodeJS 的 AWS Lambda BoilerPlate

您可以将其与Visual Studio 代码一起使用,如下所示。

步骤1

您可以从官方网站免费下载Visual studio代码:https: //www.visualstudio.com/downloads/。Visual Studio 下载的主页如下所示 -

视觉工作室代码

第2步

现在,打开 Visual Studio 代码,如下所示 -

打开视觉工作室

步骤3

要安装对 AWS 的支持,扩展内提供了对 Nodejs 选项的支持。您可以搜索AWS,它将显示如下选项 -

支持Nodejs

步骤4

现在,在Nodejs中安装 AWS Lambda 的样板,如下所示 -

Nodejs 样板

步骤5

单击存储库并在 Visual Studio 中克隆它,以开始在 Visual Studio 中编写 Lambda 函数。它将您重定向到我们可以在 Visual Studio 中克隆的存储库: https: //github.com/loganarnett/vscode-lambda-snippets。现在,从Visual Studio 中的“查看”选项打开命令选项板。

命令面板

步骤6

单击它并选择 git clone ,如下所示 -

克隆

步骤7

输入存储库 URL 并根据您的选择将其保存在本地。创建如下所示的index.js文件以使用 lambda 函数 -

拉姆达函数

Lambda 片段

Eclipse IDE 的安装

现在,您必须安装最新的 eclipse Java EE IDE。您可以从 Eclipse 官方网站下载:https://www.eclipse.org/downloads/

Eclipse IDE 安装

Eclipse IDE Java

对 Eclipse IDE 的 AWS Toolkit 支持

安装 Eclipse 后,执行以下步骤 -

步骤1

从菜单转到帮助并单击安装新软件

第2步

在对话框顶部标有“使用”的文本框中输入https://aws.amazon.com/eclipse 。

步骤3

现在,从下面显示的列表中选择所需的AWS 核心管理工具和其他可选项目。

核心管理工具

步骤4

现在,单击“下一步”。Eclipse 将引导您完成剩余的安装步骤,如下面给出的进一步步骤所示。

步骤5

AWS 核心模块显示在下面的网格中,如下面的屏幕截图所示 -

AWS 核心模块

步骤6

安装后,AWS 工具将在 Eclipse 中可用,如下所示 -

日食工作表

Eclipse 工具

步骤7

当您点击亚马逊服务时,您可以看到以下屏幕。

亚马逊服务

现在,单击 AWS Explorer 查看可用的服务。我们将在接下来的章节中讨论如何使用已安装的 IDE。

AWS Lambda – 简介

AWS Lambda 是一项无需任何服务器即可计算代码的服务。据说这是无服务器计算。该代码是根据 AWS 服务中的事件响应执行的,例如在 S3 存储桶中添加/删除文件、更新 Amazon DynamoDBtables、来自 Amazon Api 网关的 HTTP 请求等。

AWS Lambda 代码可以用 NodeJS、Java、C#、Python 和 Go 编写。本章将详细讨论在AWS控制台中创建AWS Lambda函数。

AWS 控制台

通过链接https://aws.amazon.com/console登录 AWS 控制台。登录后,它会将您重定向到显示 AWS 服务的屏幕。

AWS 控制台

示例:创建函数

让我们借助示例来了解 AWS 控制台的功能。单击 Lambda(如上标记),它将重定向到创建函数,如下所示 -

创建函数

单击创建功能按钮,屏幕显示以下详细信息 -

创建功能显示

请注意,默认情况下,该选项是从头开始创作。此选项允许您从头开始编写 Lambda 代码。它只有一个带有hello world消息的简单函数。

第二个选项蓝图具有以下详细信息。

蓝图

它以 AWS Lambda 可用的语言提供了已为某些 aws 服务编写的代码的详细信息。如果您需要为任何服务编写 AWS Lambda 代码,您可以检查蓝图并开始使用。

第三个选项无服务器应用程序存储库具有无服务器应用程序的设置,这将有助于部署 AWS Lambda 代码。

在进一步的讨论中,我们将研究第一个选项,即使用Author from scrap来创建 AWS lambda 函数。

在我们创建 Lambda 函数之前,需要一个角色,即使用 AWS 服务和 aws lambda 的权限。稍后必须将角色分配给 aws lambda 函数。

在 AWS 控制台中创建角色

要在 AWS 控制台中创建角色,请转到 AWS 控制台服务并单击 IAM,如下所示 -

角色创建

现在,如果您单击IAM,您将看到如下所示的屏幕 -

仪表板

如果您选择Roles,您可以在屏幕上看到以下按钮 -

创建角色按钮

现在,单击创建角色。它将要求您选择需要使用创建的角色的服务。

创建角色服务

由于我们需要将此角色与 AWS Lambda 一起使用,因此选择Lambda并单击下一步:权限按钮,如上所示。下一个屏幕显示根据 AWS 服务可用的策略名称。您可以从这里选择政策 -

附加权限策略

例如,如果您希望 AWS Lambda 能够与 S3 和 DynamoDB 配合使用,则需要选择策略。在搜索框中,输入 AWS 服务并单击复选框。您可以选择多个策略,然后单击“下一步:审核”

也可以创建您自己的策略。例如,有一个 dynamodb 表,您只需授予该表权限,在这种情况下您可以创建策略。

单击创建策略按钮,如上面的屏幕所示。以下是屏幕上显示的详细信息。

创建政策

选择您要为其创建策略的服务。稍后它将显示操作、资源请求条件的数据。

请求条件

现在,我们应该选择服务。让我们从搜索中选择AWS Dynamodb操作有以下详细信息 -

AWS 动态数据库

现在,输入您想要给予 DynamoDB 的访问级别。然后,资源将显示以下详细信息 -

资源

现在,选择表资源类型。您可以看到以下输出 -

表资源

对于表的权限,您需要添加 ARN。ARN 是在 AWS DynamoDB 中创建的表所特有的详细信息。当在 dynamodb 中创建表时,您将获得详细信息。

如果您单击添加 ARN,它将显示以下详细信息 -

添加 ARN

现在,如果您输入ARN区域,则会填充账户和表名称。您应该单击“添加”按钮来添加策略。同样,您可以为其他服务创建策略。

角色描述

在这里,我们选择了两个策略AmazonS3FullAccessAmazonDynamoDBFullAccess。我们已授予该角色对 S3 和 DynamoDB 的完全访问权限。但是,建议您仅向必要的存储桶和表授予权限。

您可以按照前面讨论的步骤使用ARN创建策略。

步骤1

单击“创建角色”按钮创建角色。所有创建的角色都显示如下 -

创建角色显示

第2步

请注意,如果您需要对创建的角色进行任何修改,您可以选择所需的角色。如果我们选择“从头开始创作”选项,则必须输入“名称”、“运行时”和“角色”

作者从头开始

步骤3

您可以在运行时下拉列表中观察以下详细信息-

运行

步骤4

您可以选择所需的运行时并如图所示继续。

选择继续

角色下拉菜单有以下选项 -

  • 选择现有角色 -这将显示在 IAM 角色中创建的所有角色。

  • 从模板创建新角色 -这将允许您创建角色并将显示为该角色选择的权限。观察屏幕截图以便更好地理解。

  • 创建自定义角色-这允许用户创建我们之前讨论的策略。

步骤5

选择运行时、角色并添加函数。单击“创建函数”按钮来创建 lambda 函数。显示的下一个屏幕如下 -

创建功能按钮

AWS Lambda 函数的部分内容

AWS Lambda 函数有两个部分:配置监控。让我们详细讨论每一个。

配置

配置中包含以下功能。

添加触发器

需要添加到 AWS Lambda 函数的触发器显示如下 -

添加触发器

请注意,当我们选择触发器时,我们需要添加该触发器的配置详细信息。以S3触发器为例,我们需要选择bucket名称;对于 Dynamodb 触发器,我们需要选择表名称。

例子

让我们看一下 S3 触发器的配置详细信息示例 -

配置

现在,添加 S3 触发器的配置详细信息 -

配置详情

在这里,您需要选择存储桶名称、要触发 Lambda 的事件类型、前缀和过滤模式(如果有),然后添加触发器。

在 Lambda 中添加代码

现在,我们应该关注要编写的 Lambda 代码。要在 aws lambda 中添加代码,有三个选项 -

  • 使用内联编辑器
  • 使用 .zip 文件
  • 从 Amazon S3 上传文件

如下面的屏幕截图所示 -

截屏

让我们详细讨论它们中的每一个。

使用内联编辑器

您可以在其中编写代码的内联代码编辑器如下 -

内联编辑器

您可以通过选择您选择的语言来编写代码。您可以在此处再次选择运行时。

请观察以下屏幕截图以更好地理解 -

运行时菜单

代码必须写在index.js.Handler中。详细信息将根据运行时间而有所不同。对于nodejs,它是filename.export函数,现在是index.lambda处理程序

上传 .ZIP 文件

您可以先编写代码,将其压缩,然后选择“上传 .ZIP 文件”来上传 zip 文件。

从 Amazon S3 上传文件

您可以将文件上传到 S3 存储桶中,然后选择选项从 Amazon S3 上传文件

请注意,对于.ZIPS3,无法更改运行时。

环境变量

它们接收键值对并与 AWS Lambda 代码共享。我们可以使用 AWS Lambda 中的环境变量来存储数据库连接详细信息、文件详细信息以存储输出、日志文件详细信息等。

环境变量

标签

它们是添加到 AWS Lambda 的键值对,以便在跨不同区域使用时更好地组织函数。对于简单的用例,这不是必需的。当创建大量 Lambda 函数时,标记有助于过滤和管理 Lambda 函数。

标签

执行角色

如果在创建 Lambda 函数时未正确完成,您可以在此处再次更改角色。您可以在此处更新或创建新角色。它提供了与创建 Lambda 函数开始时显示的选项相同的选项。

执行角色

基本设置

您需要在此处输入 Lambda 函数正在执行的操作的简短描述。选择 Lambda 函数所需的内存和超时。

基本设置

网络

这允许您选择 VPC,从而允许您从 VPC 访问 Lambda 函数。默认情况下,未选择任何VPC。

网络

调试和错误处理

对于调试和错误处理,您可以选择 AWS 服务发送详细信息。可用选项有None、SNSSQS

调试和错误处理

并发性

这允许您为此函数分配允许的并发执行的特定限制。

并发性

审计与合规

其中包含在 AWS CloudTrail 的帮助下管理的日志。

审计与合规

完成后,您需要使用“保存”按钮保存更改,如下所示 -

保存按钮.jpg

现在,如果您单击测试按钮,它将要求测试事件。您可以通过示例测试事件,如下所示 -

创建的测试事件如下所示 -

配置测试事件

现在,保存测试事件并单击测试按钮以查看 AWS Lambda 函数的执行情况 -

执行结果

index.js的代码如下 -

exports.lambdahandler = (event, context, callback) => {
   // TODO implement
   console.log(event.key1);
   console.log(event.key2);
   console.log(event.key3);
   callback(null, 'Lambda test');
};

请注意,当出现错误或成功时,将调用回调函数。如果成功,您可以看到将显示Lambda 测试。

监控

选择监控选项卡可以查看Lambda函数的执行详细信息。图表显示了执行时间、发生的错误等详细信息。

监控

您还可以在 Cloudwatch 中查看日志。为此,请转到 AWS 服务并选择 cloudwatch,如下所示 -

管理工具

现在,从左侧选择日志并在过滤器中输入您的函数名称 -

云观看

构建 Lambda 函数

AWS Lambda 函数在被调用时执行代码。本章详细讨论AWS Lambda函数生命周期中涉及的所有这些步骤。

构建 Lambda 函数的步骤

Lambda 函数的生命周期包括四个必要步骤 -

  • 创作
  • 部署
  • 监控
  • 故障排除

编写 Lambda 代码

AWS Lambda 函数代码可以用以下语言编写 -

  • NodeJS
  • 爪哇,
  • Python
  • C#
  • 去。

我们可以使用 AWS 控制台、AWS CLI、Eclipse IDE、Visual Studio IDE、无服务器框架等为 AWS Lambda 编写代码。

下表显示了可用于编写 Lambda 函数的语言以及不同工具和 IDE 的列表 -

语言 用于编写 Lambda 代码的 IDE
NodeJS

AWS Lambda 控制台

视觉工作室集成开发环境

爪哇 Eclipse集成开发环境
Python AWS Lambda 控制台
C#

视觉工作室集成开发环境

.NET核心

AWS Lambda 控制台

部署 Lambda 代码

一旦您决定要编写 Lambda 函数的语言,有两种方法来部署代码 -

  • 直接在AWS控制台编写代码
  • 压缩或 jar 包含所有文件和依赖项的文件

但是,请记住,必须向 zip 文件授予适当的权限。

测试 Lambda 代码

可以针对 AWS Lambda 控制台内的事件测试 Lambda 代码。还可以从 AWS cli 和 serverless cli 测试 Lambda 函数。AWS 控制台还具有事件数据,可在测试 AWS Lambda 函数时用作示例事件。

监控 Lambda 函数

可以使用 AWS CloudWatch 来监控 Lambda 函数。我们可以用我们选择的语言添加必要的日志消息,并在 AWS CloudWatch 中看到相同的信息。

要开始编写 Lambda 函数,需要遵循一些模式。以下是编写 Lambda 函数时应遵循的主要核心概念 -

处理程序

Handler 是开始执行的 AWS lambda 函数的名称。它出现在 AWS 控制台中,如下所示 -

处理程序

请注意,这里我们已将默认处理程序更改为另一个名称,并在处理程序中更新了相同的名称 -

默认处理程序

请注意,调用处理程序的方式与选择作为运行时的语言不同。

参数传递给处理程序

如果观察处理函数,传递的参数是事件、上下文回调函数,如下所示 -

参数已通过

事件参数包含所用触发器的所有详细信息。

上下文参数基本上负责 Lambda 函数执行的运行时详细信息。我们可以使用上下文参数与 Lambda 函数进行交互。它包含 AWS Lambda 终止函数之前剩余的时间等详细信息,即创建 Lambda 函数时指定的超时、Lambda 函数的名称、cloudwatch 组名称、arn 详细信息等。

例子

让我们借助示例了解从 AWS Lambda 上下文对象获取的详细信息 -

exports.lambdahandler = (event, context, callback) => {
   // TODO implement
   console.log("context object details");
   console.log(JSON.stringify(context));
   callback(null, 'Lambda test');
};

当您执行上面所示的 Lambda 函数时,您可以看到以下输出 -

输出

概括

上下文详细信息如下 -

{
   "callbackWaitsForEmptyEventLoop":true,"logGroupName":"/aws/lambda/myfirstlambdafunction",
   "logStreamName":"2018/05/20/[$LATEST]04f17ee4ff7048d5bb1fedffaa807c71","functionName":
   "myfirstlambdafunction","memoryLimitInMB":"128","functionVersion":"$LATEST","invokeid":
   "c931e21c-5bf3-11e8-acfe-47fdbb39eee9","awsRequestId":"c931e21c-5bf3-11e8-acfe-47fdbb39eee9",
   "invokedFunctionArn":"arn:aws:lambda:us-east-1:625297745038:function:myfirstlambdafunction"
}

观察它有诸如 functionName、memorylimit、requestId 等详细信息。

记录

当 AWS 函数执行时,Lambda 函数内添加的日志将显示在 AWS CloudWatch 中。日志语法将根据所选语言的不同而有所不同。例如在nodejs中,它是console.log。

这是您可以在 AWSCloudWatch 中看到的输出 -

AWS云观察

错误处理

AWS Lambda 函数提供了一个回调函数,用于通知 Lambda 函数发生了错误或成功。注意,这里我们使用了nodejs作为运行时。错误处理将根据所选语言而有所不同。

观察此处给出的示例以更好地理解 -

exports.lambdahandler = (event, context, callback) => {
   // TODO implement
   var error = new Error("There is error in code");
   callback(error);
};

输出

当您测试 Lambda 代码时,您可以找到如下所示的输出 -

执行结果失败

日志详细信息如下 -

日志输出

AWS Lambda – NODEJS 中的函数

Nodejs 是 AWS Lambda 函数支持的语言之一。Nodejs支持的版本是v6.10和v8.10。在本章中,我们将详细了解NODEJS中AWS Lambda函数的各种功能。

NodeJS 中的处理程序

要在nodejs中编写AWS Lambda函数,我们首先应该声明一个处理程序。Nodejs 中的处理程序是文件的名称和导出函数的名称。例如,文件名是index.js,导出函数名是lambda handler,那么它对应的handler就是index.lambdahandler

观察此处显示的示例处理程序 -

exports.lambdahandler = function(event, context, callback) {   //code goes here}

传递给处理程序的参数

Handler是构建Lambda函数的主要核心。该处理程序采用三个参数:事件、上下文回调

事件参数

它包含触发事件的所有详细信息。例如,如果我们使用 Lambda 函数在 S3 上触发,则事件将包含 S3 对象的详细信息。

上下文参数

它包含上下文的详细信息,例如 Lambda 函数的属性和配置详细信息。

回调函数

它有助于向呼叫者返回详细信息。回调的结构如下 -

callback(error, result);

回调函数的参数解释如下 -

错误 -如果在执行 Lambda 函数期间发生任何错误,这将包含详细信息。如果 Lambda 函数成功,则可以将null作为回调函数的第一个参数传递。

结果 -这将提供 lambda 函数成功执行的详细信息。如果发生错误,结果参数将被忽略。

注意 -不强制要求在 AWS Lambda 中使用回调函数。如果没有回调函数,则处理程序会将其返回为 null。

有效的回调签名如下 -

callback();                // It will return success, but no indication to the caller
callback(null);            // It will return success, but no indication to the caller
callback(null, "success"); // It will return the success indication to the caller
callback(error);           //  It will return the error indication to the caller

每当执行 AWS Lambda 时,错误或成功等回调详细信息都会与控制台消息(如果有)一起记录在 AWS CloudWatch 中。

在 Nodejs8.10 中使用 AWS Lambda

让我们了解如何在nodejs8.10中使用AWS Lambda并以同步和异步方式调用该函数。

以同步方式调用Lambda函数

以下示例向您展示了如何以同步方式调用 Lambda 函数 -

exports.handler = function(event, context, callback) {
   let arrItems = [4,5,6,8,9,10,35,70,80,31];
   function countevennumbers (items) {
      return new Promise(resolve => {
         setTimeout(() => {
            let a = 0;
            for (var i in items) {
               if (items[i] % 2 == 0) {
                  a++;
               } 
            }
            resolve(a);
         },2000);
      });
   }
   let evennumber = countevennumbers(arrItems);
   callback(null,'even numbers equals ='+evennumber);
};

在 AWS 控制台中测试此代码后,您可以观察到以下输出 -

偶数计数

请注意,上述代码的输出是一个 Promise 对象。它不给出计数,因为计数在 setTimeout 内递增,并且函数调用不会等待 setTimeout 内的执行并返回 Promise 对象。

如果我们在处理函数上有async/await将会从 lambda 函数获得准确的输出。

以异步方式调用Handler

以下示例为您提供了有关以异步方式调用 Lambda 函数的想法 -

exports.handler = async function(event, context, callback) {
   let arrItems = [4,5,6,8,9,10,35,70,80,31];
   function countevennumbers (items) {
      return new Promise(resolve => {
         setTimeout(() => {
            let a = 0;
            for (var i in items) {
               if (items[i] % 2 == 0) {
                  a++;
               } 
            }
            resolve(a);
         }, 2000);
      });
   }
   let evennumber = await countevennumbers(arrItems);
   callback(null,'even numbers equals ='+evennumber);
};

我们在上面的代码中添加了asyncawait。当我们在函数调用旁边使用await时,执行会暂停,直到函数内的promise得到解决。请注意,await仅对异步函数有效。

在 AWS 控制台中测试此代码后,您可以观察到以下输出 -

偶数计数输出

NodeJS 中的 ContextDetails

Context 对象提供详细信息,例如 Lambda 函数的名称、剩余时间(以毫秒为单位)、请求 ID、cloudwatch 组名称、超时详细信息等。

下表显示了上下文对象可用的方法和属性的列表 -

可用于上下文对象的方法

先生编号 方法名称和描述
1

getRemainingTimeInMillis()

此方法给出 Lambda 函数终止该函数之前的剩余时间(以毫秒为单位)

可用于上下文对象的属性

先生编号 属性名称和描述
1

函数名

这给出了 AWS Lambda 函数名称

2

函数版本

这给出了 AWS Lambda 函数执行的版本

3

调用函数Arn

这将提供 ARN 详细信息。

4

内存限制(以 MB 为单位)

这显示了创建 Lambda 函数时添加的内存限制

5

aws请求ID

这给出了 AWS 请求 ID。

6

日志组名

这将给出 cloudwatch 组的名称

7

日志流名称

这将给出写入日志的 cloudwatch 日志流名称。

8

身份

这将提供与 aws mobile sdk 一起使用时有关 amazon cognito 身份提供商的详细信息。

详细信息如下 -

  • 身份.cognito_identity_id
  • 身份.cognito_identity_pool_id
9

客户端上下文

这将是与 aws mobile sdk 一起使用时客户端应用程序的详细信息。详细信息如下 -

  • client_context.client.installation_id
  • client_context.client.app_title
  • client_context.client.app_version_name
  • client_context.client.app_version_code
  • client_context.client.app_package_name
  • client_context.custom - 它具有来自移动客户端应用程序的自定义值的字典
  • client_context.env - 它具有来自 AWS Mobile SDK 的环境详细信息

查看以下示例以更好地了解上下文对象 -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log('Remaining time =>', context.getRemainingTimeInMillis());
   console.log('functionName =>', context.functionName);
   console.log('AWSrequestID =>', context.awsRequestId);
   console.log('logGroupName =>', context.log_group_name);
   console.log('logStreamName =>', context.log_stream_name);
   console.log('clientContext =>', context.clientContext);
   callback(null, 'Name of aws Lambda is=>'+context.functionName);
};

在 AWS 控制台中测试此代码后,您可以观察到以下输出 -

成功日志

在 AWS 控制台中测试此代码后,您可以观察以下日志输出 -

日志输出测试

登录 NodeJS

我们可以使用 console.log 来登录 NodeJS。日志详细信息可以根据 Lambda 函数从 CloudWatch 服务中获取。

观察以下示例以更好地理解 -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log('Logging for AWS Lamnda in NodeJS');
   callback(null, 'Name of aws Lambda is=>'+context.functionName);
};

在 AWS 控制台中测试此代码后,您可以观察到以下输出 -

测试后输出

您可以从 CloudWatch 观察以下屏幕截图 -

截图云观看

NodeJS 中的错误处理

让我们了解 NodeJS 中的错误通知是如何完成的。观察以下代码 -

exports.handler = function(event, context, callback) {
   // This Source code only throws error. 
   var error = new Error("something is wrong");
   callback(error);   
};

执行结果详情

您可以在日志输出中观察到以下内容 -

日志输出观察

回调中给出的错误详细信息如下 -

{
   "errorMessage": "something is wrong",
   "errorType": "Error",
   "stackTrace": [    "exports.handler (/var/task/index.js:2:17)"  ]
}

AWS Lambda – Java 中的函数

在本章中,让我们详细了解如何用Java详细创建一个简单的AWS Lambda函数。

在 Eclipse 中创建 JAR 文件

在继续在 AWS 中创建 lambda 函数之前,我们需要针对 Eclipse 的 AWS 工具包支持。有关安装的任何指导,您可以参考本教程中的环境设置章节。

完成安装后,请按照此处给出的步骤操作 -

步骤1

打开 Eclipse IDE 并使用AWS Lambda Java Project创建一个新项目。观察下面给出的屏幕截图以便更好地理解 -

选择向导

第2步

一旦您选择“下一步”,它将重定向您到如下所示的屏幕 -

Lambda Java 项目

步骤3

现在,为输入类型自定义创建了默认代码。单击“完成”按钮后,项目将被创建,如下所示 -

定制类型

步骤4

现在,右键单击您的项目并将其导出。从导出向导中选择Java/JAR文件,然后单击下一步

导出向导

步骤5

现在,如果您单击“下一步”,系统将提示您将文件保存到目标文件夹中,单击“下一步”时会询问该文件夹。

保存文件后,返回 AWS 控制台并创建适用于 Java 的 AWS Lambda 函数。

适用于 Java 的 AWS 控制台

步骤6

现在,使用“上传”按钮上传我们创建的.jar文件,如下面的屏幕截图所示 -

上传按钮

Java 的处理程序详细信息

Handler包名类名。请参阅以下示例以详细了解处理程序 -

例子

package com.amazonaws.lambda.demo;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler {
   @Override
   public String handleRequest(Object input, Context context) {
      context.getLogger().log("Input: " + input);

      // TODO: implement your handler
      return "Hello from Lambda!";
   }
}

从上面的代码中可以看出,处理程序将是com.amazonaws.lambda.demo.LambdaFunctionHandler

现在,让我们测试更改并查看输出 -

Lambda 函数处理程序

Lambda 函数处理程序输出

Java 中的上下文对象

与 AWS Lambda 执行的交互是使用上下文完成的。它提供了以下在 Java 中使用的方法 -

先生编号 上下文方法和描述
1

getMemoryLimitInMB()

这将给出您在创建 lambda 函数时指定的内存限制。

2

获取函数名()

这将给出 lambda 函数的名称。

3

获取函数版本()

这将给出 lambda 函数正在运行的版本。

4

getInvokedFunctionArn()

这将给出用于调用该函数的 ARN。

5

获取AwsRequestId()

这将给出 aws 请求 ID。该 id 是为 lambda 函数创建的,并且是唯一的。如果您遇到任何问题,该 ID 可以与 aws support 一起使用。

6

获取日志组名称()

这将给出与创建的 aws lambda 函数链接的 aws cloudwatch 组名称。如果 iam 用户没有 cloudwatch 日志记录的权限,则该值将为 null。

7

获取客户端上下文()

这将提供与 aws mobile sdk 一起使用时有关应用程序和设备的详细信息。它将提供版本名称和代码、客户端 ID、标题、应用程序包名称等详细信息。它可以为空。

8

获取身份()

这将提供与 aws mobile sdk 一起使用时有关 amazon cognito 身份的详细信息。它可以为空。

9

getRemainingTimeInMillis()

当函数在指定的超时后终止时,这将给出剩余的执行时间(以毫秒为单位)。

10

获取记录器()

这将给出与上下文对象链接的 lambda 记录器。

现在,让我们更新上面给出的代码并观察上面列出的一些方法的输出。请观察下面给出的示例代码以更好地理解 -

package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
   @Override
   public String handleRequest(Object input, Context context) {
      context.getLogger().log("Input: " + input);
      System.out.println("AWS Lambda function name: " + context.getFunctionName());
      System.out.println("Memory Allocated: " + context.getMemoryLimitInMB());
      System.out.println("Time remaining in milliseconds: " + context.getRemainingTimeInMillis());
      System.out.println("Cloudwatch group name " + context.getLogGroupName());
      System.out.println("AWS Lambda Request Id " + context.getAwsRequestId());
      
      // TODO: implement your handler
      return "Hello from Lambda!";
   }
}

运行上面给出的代码后,您可以找到如下输出 -

上下文对象

上下文日志

当您查看日志输出时,您可以观察到以下输出 -

上下文日志

为 Lambda 函数分配的内存为 512MB。分配的时间是25秒。上面显示的剩余时间是24961,单位是毫秒。因此,25000 - 24961(相当于 39 毫秒)用于执行 Lambda 函数。请注意,Cloudwatch 组名称和请求 ID 也会显示,如上所示。

请注意,我们使用以下命令在 Java 中打印日志 -

System.out.println (“log message”)

CloudWatch 中也提供了相同的功能。为此,请转到 AWS 服务,选择CloudWatchservices并单击Logs

现在,如果您选择 Lambda 函数,它将按日期显示日志,如下所示 -

日志日期明智

使用 Java 登录

您还可以使用 Java 中的 Lambdalogger 来记录数据。观察以下显示相同内容的示例 -

例子

package com.amazonaws.lambda.demo;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
   @Override
   public String handleRequest(Object input, Context context) {
      LambdaLogger logger = context.getLogger();
      logger.log("Input: " + input);
      logger.log("AWS Lambda function name: " + context.getFunctionName()+"\n");
      logger.log("Memory Allocated: " + context.getMemoryLimitInMB()+"\n");
      logger.log("Time remaining in milliseconds: " + context.getRemainingTimeInMillis()+"\n");
      logger.log("Cloudwatch group name " + context.getLogGroupName()+"\n");
      logger.log("AWS Lambda Request Id " + context.getAwsRequestId()+"\n");
      
      // TODO: implement your handler
      return "Hello from Lambda!";
   }
}

上面显示的代码将为您提供以下输出 -

记录Java

CloudWatch 中的输出如下所示 -

记录 Java 输出

Java 中 Lambda 函数的错误处理

本节将介绍如何处理 Java 中 Lambda 函数的错误。观察以下显示相同内容的代码 -

package com.amazonaws.lambda.errorhandling;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
   @Override
   public String handleRequest(Object input, Context context) {
      throw new RuntimeException("Error from aws lambda");
   } 
}

请注意,错误详细信息以json格式显示,并带有 errorMessage Error from AWS Lambda。此外,ErrorTypestackTrace提供了有关错误的更多详细信息。

上面给出的代码的输出和相应的日志输出将如下面给出的屏幕截图所示 -

Java 错误处理

错误处理输出

AWS Lambda – Python 中的函数

在本章中,我们将使用 Python 创建一个简单的 AWS Lambda 函数,并详细了解其工作概念。

在继续在 AWS 中创建 Lambda 函数之前,我们需要 AWS 工具包支持 Python。为此,请按照下面给出的步骤并观察随附的相应屏幕截图 -

步骤1

登录AWS控制台并创建Lambda函数并选择语言为Python。

Lambda 函数 Python

第2步

现在,单击“创建函数”按钮并输入用于在 Python 中创建简单 AWS Lambda 的详细信息。此代码使用 Python 从 Lambda返回消息Hello ,如下所示 -

创建Python函数

步骤3

现在,保存更改并测试代码以查看输出。当您使用 UI 中的测试按钮在 AWS 控制台中测试它时,您应该会看到以下输出和日志。

AWS_console_Python

步骤4

现在,您可以在任何编辑器或 Python IDE 中编写代码。在这里,我们使用 Visual Studio Code 来编写代码。您应该稍后压缩该文件并在 AWS 控制台中上传。

Python 的 IDE。

在这里,我们已经压缩了代码并使用它的 AWS 控制台。

步骤5

现在,选择上传 .ZIP 文件选项,如下所示 -

上传文件

Python 的处理程序详细信息

请注意,处理程序必须是文件名后跟函数名。在上面的例子中,我们的文件名为hellopython.py,函数名为my_handler;所以处理程序将是hellopython.my_handler

上传完成并保存更改后,它实际上会在 AWS Lambda 控制台的在线编辑器中显示 zip 文件的详细信息。现在,让我们测试代码以查看输出和日志。

处理程序详细信息 Python

现在,让我们使用以下示例代码了解 Lambda 函数的详细信息 -

def my_handler(event, context):
   return "aws lambda in python using zip file"

在上面的代码中,函数名称 my_handler 有 2 个参数:事件和上下文。

Python 中的上下文对象

Context 对象提供 Lambda 函数名称、剩余时间(以毫秒为单位)、请求 ID、云监视组名称、超时详细信息等详细信息。

上下文对象上可用的方法和属性如下表所示 -

先生编号 方法名称和描述
1

get_remaining_time_in_millis()

此方法给出 lambda 函数终止该函数之前的剩余时间(以毫秒为单位)

先生编号 属性及描述
1

函数名

这给出了 aws lambda 函数名称

2

函数版本

这给出了 aws lambda 函数执行的版本

3

调用函数_arn

这将提供 ARN 详细信息。

4

内存限制in_mb

这显示了创建 lambda 函数时添加的内存限制

5

aws_请求_id

这给出了 aws 请求 ID。

6

og_组_名称

这将给出 cloudwatch 组的名称

7

日志流名称

这将给出写入日志的 cloudwatch 日志流名称。

8

身份

这将提供与 aws mobile sdk 一起使用时有关 amazon cognito 身份提供商的详细信息。详细信息如下 -

  • 身份.cognito_identity_id
  • 身份.cognito_identity_pool_id
9

客户端上下文

这将是与 aws mobile sdk 一起使用时客户端应用程序的详细信息。详细信息如下 -

  • client_context.client.installation_id
  • client_context.client.app_title
  • client_context.client.app_version_name
  • client_context.client.app_version_code
  • client_context.client.app_package_name
  • client_context.custom - 它具有来自移动客户端应用程序的自定义值的字典
  • client_context.env - 它包含来自 AWS Mobile SDK 的环境详细信息的字典

L