由于 Lambda 是一种事件驱动的无服务器计算服务,它使用的编程范式不同于传统 Web 应用程序。如果您不熟悉 Lambda 或无服务器开发,以下各部分介绍的一些重要基础概念将帮助您开始学习之路。除了对每个概念的解释外,这些部分还包含指向教程、详细文档和其他资源的链接,您可以使用这些资源来加深对每个主题的理解。
在本页上,您将了解以下内容:
-
Lambda 函数 – 用于构建应用程序的 Lambda 的基本构建块
-
Lambda 运行时 – 您的函数在其中运行的特定语言环境
-
触发器和事件源映射 – 其他 AWS 服务调用函数以响应特定事件的方式
-
事件对象 – JSON 对象,包含函数要处理的事件数据
-
Lambda 权限 – 您控制函数可以与哪些其他 AWS 服务交互以及谁可以访问函数的方式
提示
如果您想从更全面地了解无服务器开发开始,请参阅《AWS Serverless Developer Guide》中的 Understanding the difference between traditional and serverless development。
Lambda 函数
在 Lambda 中,函数是用来创建应用程序的基本构建块。Lambda 函数是一段代码,为响应事件而运行,例如用户点击网站上的按钮或将文件上传到 Amazon Simple Storage Service(Amazon S3)存储桶。您可以将函数想象成一种具有以下属性的独立程序。
-
函数具有一项特定任务或目的
-
它们仅在需要时运行,以响应特定事件
-
完成后,它们会自动停止运行
当函数为响应事件而运行时,Lambda 会运行该函数的处理程序函数。有关导致函数运行的事件的数据将直接传递给处理程序。虽然 Lambda 函数中的代码可包含多个方法或函数,但 Lambda 函数只能有一个处理程序。
要创建 Lambda 函数,您需要将函数代码及其依赖项捆绑到一个部署包中。Lambda 支持两种类型的部署包:.zip 文件归档和容器映像。
为了更好地理解 Lambda 函数,如果您尚未完成 创建第一个 Lambda 函数 教程,我们建议您先完成本教程。本教程提供了有关处理程序函数以及如何将数据传入和传出函数的更多详细信息。它还介绍了如何创建函数日志。
Lambda 执行环境和运行时
Lambda 函数在 Lambda 为您管理的安全、隔离的执行环境中运行。这个执行环境负责管理运行函数所需的流程和资源。首次调用函数时,Lambda 会为该函数创建一个新的执行环境以供其运行。函数运行完毕后,Lambda 不会立即停止执行环境;如果再次调用该函数,Lambda 可以重复使用现有执行环境。
Lambda 执行环境还包含运行时,即特定于语言的环境,可用于在 Lambda 与您的函数之间中继事件信息和响应。Lambda 为最流行的编程语言提供了多种托管运行时,您也可以创建自己的运行时。
对于托管运行时,Lambda 会使用运行时自动应用安全更新和函数补丁。
触发器和事件源映射
尽管您可以使用 AWS Command Line Interface(AWS CLI)或 Lambda API 手动调用 Lambda 函数,但在生产应用程序中,通常会由另一项 AWS 服务调用您的函数以响应特定事件。例如,您可能希望在向 Amazon DynamoDB 表中添加项目时运行一个函数。
要配置函数,以便为响应特定事件而运行,请添加触发器。当您创建触发器时,其他 AWS 服务可以通过在特定事件发生时将事件对象推送到 Lambda 来直接调用您的函数。一个函数可以有多个触发器,每个触发器都独立调用您的函数。
某些类型的流和队列服务,例如 Amazon Kinesis 或 Amazon Simple Queue Service(Amazon SQS),无法使用触发器直接调用 Lambda。对于这些服务,您需要改为创建事件源映射。事件源映射是一种特殊类型的 Lambda 资源,它会持续轮询流或队列以检查是否有新事件。例如,事件源映射可能会轮询 Amazon SQS 队列,检查是否添加了新消息。Lambda 将新消息批量放入单个有效载荷中,直至达到您配置的限制,然后使用包含批处理中所有记录的单个事件对象调用您的函数。
创建触发器或事件源映射的最简单方法是使用 Lambda 控制台。尽管 Lambda 创建的基础资源和调用函数的方式不同,但在控制台中创建触发器或事件源映射的过程使用的是同一种方法。
要查看关于触发器实际作用的示例,请先阅读 Using an Amazon S3 trigger to invoke a Lambda function 教程,或者如需了解使用触发器的一般概述和使用 Lambda 控制台创建触发器的说明,请参阅 使用来自其 AWS 他服务的事件调用 Lambda。
事件对象
Lambda 是一项事件驱动型计算服务。这意味着您的代码是为响应外部产生器生成的事件而运行。事件数据以 JSON 格式文档的形式传递给您的函数,运行时会将其转换为对象供您的代码处理。例如,在 Python 中,运行时将 JSON 对象转换为 Python 字典,并将其作为 event
输入参数传递给函数。
如果事件由另一项 AWS 服务生成,则事件格式取决于生成该事件的服务。例如,Amazon S3 的事件包括触发函数的存储桶的名称,以及有关该存储桶中对象的信息。要详细了解由不同 AWS 服务生成的事件的格式,请参阅 使用来自其 AWS 他服务的事件调用 Lambda 中的相关章节。
您也可以使用 Lambda 控制台 AWS CLI
例 自定义 Lambda 事件
{ "Location": "SEA", "WeatherData":{ "TemperaturesF":{ "MinTempF": 22, "MaxTempF": 78 }, "PressuresHPa":{ "MinPressureHPa": 1015, "MaxPressureHPa": 1027 } } }
由于 Lambda 运行时会将事件转换为对象,您可以轻松地将事件中的值分配给变量,而不必反序列化 JSON。以下示例代码片段展示了如何使用 Python 和 Node.js 运行时将前一个示例事件的最小温度值分配给变量 MinTemp
。在这两种情况下,事件对象都将作为名为 event
的参数传递给函数的处理程序函数。
例 Python 代码片段
MinTemp = event['WeatherData']['TemperaturesF']['MinTempF']
例 Node.js 代码片段
let MinTemp = event.WeatherData.TemperaturesF.MinTempF;
有关调用包含自定义事件的 Lambda 函数的示例,请参阅 创建第一个 Lambda 函数。
Lambda 权限
对于 Lambda,您需要配置两种主要的权限类型:
-
您的函数访问其他 AWS 服务所需的权限
-
其他用户和 AWS 服务访问您的函数所需的权限
以下部分介绍了这两种权限类型,并讨论了应用最低权限许可的最佳实践。
函数访问其他 AWS 资源的权限
Lambda 函数通常需要访问其他 AWS 资源并对这些资源执行操作。例如,函数可能从 DynamoDB 表中读取项目,将对象存储在 S3 存储桶中,或者写入 Amazon SQS 队列。要向函数提供执行这些操作所需的权限,可以使用执行角色。
Lambda 执行角色是一种特殊的 AWS Identity and Access Management(IAM)角色,即您在账户中创建的身份,其具有策略中定义的与之相关的特定权限。
每个 Lambda 函数都必须有一个执行角色,并且一个角色可以供多个函数使用。调用函数时,Lambda 将担任该函数的执行角色,并获得权限可以执行该角色策略中定义的操作。
在 Lambda 控制台中创建函数时,Lambda 会自动为函数创建一个执行角色。该角色的策略授予函数向 Amazon CloudWatch Logs 写入日志输出的基本权限。要向您的函数授予对其他 AWS 资源执行操作的权限,您需要编辑角色以添加额外的权限。添加权限的最简单方法是使用 AWS 托管策略。托管策略由 AWS 创建和管理,并为许多常见应用场景提供权限。例如,如果您的函数对 DynamoDB 表执行 CRUD 操作,则可以将 AmazonDynamoDBFullAccess 策略添加到您的角色中。
其他用户和资源访问您的函数的权限
要授予其他 AWS 服务访问 Lambda 函数的权限,您需使用基于资源的策略。在 IAM 中,基于资源的策略附加到资源(在本例中为您的 Lambda 函数),并且指定了有权访问资源的用户以及此类用户可以执行的操作。
要让其他 AWS 服务通过触发器调用您的函数,则函数基于资源的策略必须向该服务授予使用 lambda:InvokeFunction
操作的权限。如果您使用控制台创建触发器,则 Lambda 会自动为您添加此权限。
要向其他 AWS 用户授予访问您的函数的权限,您可以用与针对其他 AWS 服务或资源完全相同的方式,在函数基于资源的策略中定义此项操作。您也可以使用与用户关联的基于身份的策略。
Lambda 权限的最佳实践
在使用 IAM 策略设置权限时,安全最佳实践是仅授予执行任务所需的许可。这称为最低权限原则。要开始为您的函数授予权限,您可以选择使用 AWS 托管策略。托管策略可能是授予执行任务所需权限的最快、最简单的方法,但它们也可能包含您不需要的其他权限。在您从早期开发过渡到测试和生产时,我们建议您通过定义自己的客户管理型策略,将权限减少到仅限于所需权限。
使用基于资源的策略授予访问函数的权限时,同样的原则也适用。例如,如果您想授予 Amazon S3 调用函数的权限,最佳实践是限制对单个存储桶或特定 AWS 账户中存储桶的访问权限,而不是向 S3 服务授予一揽子权限。