# AWS Lambda 介绍

Serverless Computing 是一种云计算执行模型,在这种模型中,云提供商动态地管理基础设施资源的分配,因此我们不必担心管理服务器或任何基础设施。

AWS Lambda 是AWS提供的一个事件驱动的无服务器计算平台或计算服务。

AWS Lambda 上运行的代码被称为 Lambda函数

将代码部署到Lambda后,就可以运行了。

当它被预先配置的事件源触发时,它就会运行。

Lambda函数可以由众多事件源触发,例如API网关调用,S3文件上传,对DynamoDB表数据的更改,CloudWatch事件,SNS通知,第三方API调用等。

Lambda函数容器化 环境中运行,只有在事件源触发时才会启动。AWS Lambda的成本非常低,不需要任何前期投资,不会对空闲时间进行计费。

# AWS Lambda 控制台

# 函数代码

Lambda函数代码编辑区域

  • 代码输入种类: 您可以内联编辑它或上传一个ZIP文件,或者您可以将相同的ZIP文件上传到S3,然后使用此选项从S3上下载。
  • 运行时:有各种可用的运行时——c#或.NET Core、谷歌Go、Java、NodeJS和Python。
  • 处理程序:index.handler,这意味着名称为handler的函数位于index.js文件中。

# 环境变量

在这里,可以添加函数代码在运行时需要的键值对。因此,您可以在此处添加特定于环境的常量或API密钥等,然后可以在代码内访问它们,避免硬编码在代码中。

如果这些环境变量的值是敏感的,那么您还可以使用 KMS服务 对它们进行加密,在函数代码中调用时需要对它们进行解密。

# 标签

标签是您为 AWS 资源分配的一种标记。每个标签由一个键和一个可选值组成。这些是区分大小写的键值对。标签可用于对功能进行分组和过滤,您可以使用标签来搜索和筛选您的资源或跟踪您的 AWS 成本。

# 基本设置

您可以根据需要添加函数说明,您还可以调整函数所需的最大内存。这里值得一提的是,分配给函数的CPU资源,总是与我们在这里选择的内存大小成比例。

然后您可以以秒为单位设置超时。您可以设置1秒到15分钟之间的任何值,所以 Lambda函数 运行的最长时间是 15分钟。在构建 Serverless 应用程序时,超时是一个重要的考虑因素。理想情况下,Lambda函数应该设计为执行单个特定任务,而不是执行多个任务,您可以将应用程序逻辑划分为多个Lambda函数,每个函数执行一项特定任务,这种方法通常用于 微服务 体系结构中,并且这种基于 微服务 的体系结构最适合 Serverless 应用程序。

# 执行角色

选择定义您的函数权限的角色。要创建自定义角色,请转至 IAM 控制台。

可以使用现有角色,或者从 AWS 策略模板创建新角色,或者使用IAM创建自定义角色。

# VPC

虚拟私有云。可以将Lambda函数附加到VPC上。当您将Lambda函数附加到VPC时,该函数将在该VPC中运行,并且只能访问VPC中的资源。这意味着,它将失去对VPC外部资源的访问。它还将无法访问互联网,如果需要访问internet,您需要在选定的安全组中打开适当的出站连接,在这种情况下,VPC也需要NAT网关。

# 并发

在这里,我们定义Lambda函数的最大并发执行数。所有AWS非预留账户的并发限制为1000,如果为特定函数保留并发限制,则剩余的并发限制将由帐户中的其他Lambda函数共享。所以如果你为这个函数保留了600个并发执行,剩下的Lambda函数只能使用400个。

# 异步调用

当Lambda函数即使多次重试后仍然出错时,这些命令很有用。

因此,如果Lambda函数出错,Lambda可以将此事件负载发送到SQS队列或作为SNS通知。

# 审计与合规性

可以使用AWS CloudTrail服务设置审核和合规性,如果您的组织出于审核和合规性的目的而需要此功能,则可以在CloudTrail中记录该功能的调用。

# 测试

在Lambda函数右上角有测试选项。您可以使用下拉菜单来配置测试事件。

可以创建新测试事件,不同事件模板,产生的 event 事件源对象是不同的。

点击测试,会有函数执行的相关日志产生。

# 操作

在“操作”菜单下,我们有创建版本和别名,导出和删除函数选项。

如果单击导出,则可以使用这个下载部署包选项将函数代码下载为AWS SAM文件或ZIP文件。

# 版本控制

在版本控制下拉框,您可以选择版本和别名。

# 限制

此操作会将 Lambda函数 的预留并发设置为零,这将限制将来对此函数的所有调用。请只在紧急情况下使用此操作。

# 监控

我们可以在运行时监视函数,从这里详细查看日志和跟踪。

# AWS Lambda权限模型

AWS Lambda使用一个解耦的权限模型。触发Lambda函数的服务或事件仅需要必要的权限,就能调用Lambda函数。

Lambda函数可以添加 触发器。将事件触发器添加到Lambda函数时,会自动为其分配适当的IAM策略以调用此Lambda函数,该角色称为Lambda调用策略或函数策略。

Lambda函数可以添加 目标对象。点击Lambda函数编辑页面顶部 权限 导航栏,可以查看您的函数有权访问的资源和操作,可以查看资源摘要,以及分配给该函数的执行角色。这些权限称为Lambda执行角色。

因此,Lambda实际上应用了两组IAM权限。触发事件或服务使用函数策略来调用Lambda函数,而Lambda函数使用执行角色来访问它所依赖的不同AWS服务。

函数策略执行角色 是相互独立的。

触发Lambda函数的不同事件源不需要Lambda函数代码完成其工作所需的权限,因此,两者可以有效地分离,从而提高我们应用程序的安全性。

# AWS Lambda事件对象

Lambda函数有两个参数- event和context。

event 对象持有我们希望Lambda函数处理的输入数据或输入参数。

事件对象的结构取决于事件源,有不同的事件触发器,可以用来调用Lambda函数,每个触发器都将以特定的结构发送事件数据。

每个事件源都有自己预定义的事件数据结构,我们根据它需要处理的事件来编写Lambda函数。如果我们从代码中调用Lambda函数,例如使用AWS SDK,我们可以设置自己的自定义事件结构。

# 调用类型

Lambda支持两种调用类型——同步异步

调用类型取决于事件源。例如,S3事件总是异步的,而API网关或Cognito事件将是同步的,我们不能控制这一点。但是,如果我们使用 AWS SDK 调用Lambda函数,则可以选择调用类型——同步异步

# 事件源类型

有两种类型的事件源——基于 push 推的事件和基于 pull 拉的或基于 poll 轮询的事件。

基于推的事件将事件数据推送到Lambda以调用函数,另一方面,在pull事件或基于poll的事件的情况下,Lambda轮询事件流以查找事件数据。

S3事件或API网关事件是 push 类型的,DynamoDB流事件、kinisis流事件或Amazon SQS队列事件是 pushpoll 类型的。在这种类型的事件中,Lambda从DynamoDB、kinisis或SQS中提取事件数据并调用Lambda函数。

例如,每当我们在DynamoDB表中添加,修改或删除数据,DynamoDB便可以将事件数据推送到DynamoDB流,然后由Lambda对其进行轮询

# AWS Lambda上下文对象

当Lambda函数执行时,context 对象为我们提供一些有用的运行时信息。

例如,我们可以使用context对象来找出Lambda函数超时前剩余的时间、与Lambda函数关联的CloudWatch日志组和日志流、当前调用该Lambda函数的AWS请求ID是什么等等。

这个上下文对象提供了不同的方法和属性,我们可以使用它们来获取运行时信息。

exports.handler = async function(event, context) {
  console.log('Remaining time: ', context.getRemainingTimeInMillis()) //返回在执行超时以前剩余的毫秒数。
  console.log('Function name: ', context.functionName) //Lambda 函数的名称。
  return context.logStreamName //函数实例的日志流。
}

Node.js 中的 AWS Lambda 上下文对象

# AWS Lambda日志和错误处理

# 错误处理

在基于 callback 形式的Lambda处理程序,则可以使用回调函数的第一个参数抛出错误。

exports.handler = async function(event, context, callback) {
  const error = new Error("抛出错误")
  callback(error)
}

在基于 async/await 形式的Lambda处理程序,只需使用throw语句抛出一个错误。当然,为了更好地处理错误,您可以将代码封装在try catch块中。

exports.handler = async function(event, context, callback) {
  const error = new Error("抛出错误")
  throw error;
}

# 日志处理

如果希望将错误消息打印到日志,可以使用 console.error。类似地,我们可以使用 console.log,来输出日志消息。或者使用console.info来输出信息消息,还可以使用console.warn来打印警告消息。

我们可以使用它来进行错误处理和日志记录。

打印到控制台的这些消息将自动记录到 AWS CloudWatch 服务。

在实际情况下,当我们无法直接访问控制台时,我们可以通过CloudWatch服务访问这些日志。

# AWS Lambda限制

AWS对Lambda服务的使用有一些限制,比如最大超时或最大内存限制,或者部署包的大小等等。

  • 函数内存分配:128 MB 到 3,008 MB,以 64 MB 为增量。
  • 函数超时:900 秒(15 分钟),每个lambda函数最多可以运行900秒,即大约15分钟。
  • 调用负载(请求和响应):请求和响应体有效负载的大小也有限制。对于API网关中的同步调用,此限制最大为6 MB,对于异步调用,请求正文有效负载大小限制约为128 KB。

等等。

AWS Lambda 限制

# AWS Lambda 定价

使用 AWS Lambda,您只需按使用量付费。我们将根据您函数的请求数量和持续时间,以及代码执行花费的时间向您收费。

每当 Lambda 为响应事件通知或调用(包括控制台的测试调用)而开始执行时便记为一次请求。

持续时间从您的代码开始执行时算起直到其返回或终止为止,舍入到最近的 100ms*。价格取决于您为函数分配的内存量。在 AWS Lambda 资源模型中,您可以选择用于函数的内存量,这会分配等比例的 CPU 计算能力和其他资源。内存大小的增加会导致函数可用的 CPU 的等效增加。要了解更多信息,请参阅功能配置文档

AWS Lambda 免费使用套餐包含每月 1M 次免费请求以及每月 400000GB-秒的计算时间。

AWS Lambda 参加了 Compute Savings Plans,后者是一种灵活的定价模式,它以较低的 EC2、Fargate 和 Lambda 使用价格,换取在 1 年或 3 年期限内的稳定使用量承诺(以 USD/小时为单位衡量)。通过 Compute Savings Plans,您最多可节省 17% 的 AWS Lambda 成本。Savings 适用于持续时间、预置并发和持续时间(预置并发)。

AWS Lambda 定价

更新时间: 5/16/2020, 2:31:12 PM