Lambda 的工作原理
Lambda 函数是用于构建 Lambda 应用程序的基本构建块。要编写函数,了解构成 Lambda 编程模型的核心概念和组件至关重要。本节将指导您了解使用 Lambda 构建无服务器应用程序所需了解的基本要素。
-
Lambda 函数和函数处理程序 - Lambda 函数是为响应事件而运行的一小段代码。函数是用于构建应用程序的基本构建块。函数处理程序是 Lambda 函数代码处理的事件对象的入口点。
-
Lambda 执行环境和运行时 - Lambda 执行环境管理运行函数所需的资源。运行时是您的函数在其中运行的特定于语言的环境。
-
事件和触发器 - 其他 Amazon Web Services 服务 服务如何响应特定事件来调用函数。
-
Lambda 权限和角色 - 如何控制谁可以访问您的函数以及您的函数可以与哪些其他 Amazon Web Services 服务 服务交互。
提示
如果您想从更全面地了解无服务器开发开始,请参阅《Amazon 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 函数,您需要将函数代码及其依赖项捆绑到一个部署包中。Lambda 支持两种类型的部署包:.zip 文件归档和容器映像。
-
函数具有一项特定任务或目的
-
它们仅在需要时运行,以响应特定事件
-
完成后,它们会自动停止运行
Lambda 执行环境和运行时
Lambda 函数在 Lambda 为您管理的安全、隔离的执行环境中运行。这个执行环境负责管理运行函数所需的流程和资源。首次调用函数时,Lambda 会为该函数创建一个新的执行环境以供其运行。函数运行完毕后,Lambda 不会立即停止执行环境;如果再次调用该函数,Lambda 可以重复使用现有执行环境。
Lambda 执行环境还包含运行时,即特定于语言的环境,可用于在 Lambda 与您的函数之间中继事件信息和响应。Lambda 为最流行的编程语言提供了多种托管运行时,您也可以创建自己的运行时。
对于托管运行时,Lambda 会使用运行时自动应用安全更新和函数补丁。
事件和触发器
您也可以使用 Lambda 控制台 Amazon CLI
为了使函数响应事件,您需要设置一个触发器。触发器将函数连接到事件源,并且函数可以有多个触发器。当事件发生时,Lambda 会以 JSON 文档形式接收事件数据,并将其转换为代码可处理的对象。您可以为事件定义下面的 JSON 格式,Lambda 运行时会将此 JSON 转换为对象,然后再将其传递给函数的处理程序。
例 自定义 Lambda 事件
{ "Location": "SEA", "WeatherData":{ "TemperaturesF":{ "MinTempF": 22, "MaxTempF": 78 }, "PressuresHPa":{ "MinPressureHPa": 1015, "MaxPressureHPa": 1027 } } }
与 Amazon Kinesis 或 Amazon SQS 等流和队列服务一样,Lambda 使用事件源映射而非标准触发器。事件源映射会轮询源以获取新数据,批处理记录,然后使用批量事件调用函数。
要了解触发器的工作原理,请先完成使用 Amazon S3 触发器教程,或者要了解有关使用触发器的一般概述以及有关使用 Lambda 控制台创建触发器的说明,请参阅与其他服务集成。
Lambda 权限和角色
对于 Lambda,您需要配置两种主要的权限类型:
-
您的函数访问其他 Amazon Web Services 服务所需的权限
-
其他用户和 Amazon Web Services 服务访问您的函数所需的权限
以下部分介绍了这两种权限类型,并讨论了应用最低权限许可的最佳实践。
函数访问其他 Amazon 资源的权限
Lambda 函数通常需要访问其他 Amazon 资源并对这些资源执行操作。例如,函数可能从 DynamoDB 表中读取项目,将对象存储在 S3 存储桶中,或者写入 Amazon SQS 队列。要向函数提供执行这些操作所需的权限,可以使用执行角色。
Lambda 执行角色是一种特殊的 Amazon Identity and Access Management(IAM)角色,即您在账户中创建的身份,其具有策略中定义的与之相关的特定权限。
每个 Lambda 函数都必须有一个执行角色,并且一个角色可以供多个函数使用。调用函数时,Lambda 将担任该函数的执行角色,并获得权限可以执行该角色策略中定义的操作。
在 Lambda 控制台中创建函数时,Lambda 会自动为函数创建一个执行角色。该角色的策略授予函数向 Amazon CloudWatch Logs 写入日志输出的基本权限。要向您的函数授予对其他 Amazon 资源执行操作的权限,您需要编辑角色以添加额外的权限。添加权限的最简单方法是使用 Amazon 托管策略。托管策略由 Amazon 创建和管理,并为许多常见应用场景提供权限。例如,如果您的函数对 DynamoDB 表执行 CRUD 操作,则可以将 AmazonDynamoDBFullAccess 策略添加到您的角色中。
其他用户和资源访问您的函数的权限
要授予其他 Amazon Web Services 服务访问 Lambda 函数的权限,您需使用基于资源的策略。在 IAM 中,基于资源的策略附加到资源(在本例中为您的 Lambda 函数),并且指定了有权访问资源的用户以及此类用户可以执行的操作。
要让其他 Amazon Web Services 服务通过触发器调用您的函数,则函数基于资源的策略必须向该服务授予使用 lambda:InvokeFunction
操作的权限。如果您使用控制台创建触发器,则 Lambda 会自动为您添加此权限。
要向其他 Amazon 用户授予访问您的函数的权限,您可以用与针对其他 Amazon Web Services 服务或资源完全相同的方式,在函数基于资源的策略中定义此项操作。您也可以使用与用户关联的基于身份的策略。
Lambda 权限的最佳实践
在使用 IAM 策略设置权限时,安全最佳实践是仅授予执行任务所需的许可。这称为最低权限原则。要开始为您的函数授予权限,您可以选择使用 Amazon 托管策略。托管策略可能是授予执行任务所需权限的最快、最简单的方法,但它们也可能包含您不需要的其他权限。在您从早期开发过渡到测试和生产时,我们建议您通过定义自己的客户管理型策略,将权限减少到仅限于所需权限。
使用基于资源的策略授予访问函数的权限时,同样的原则也适用。例如,如果您想授予 Amazon S3 调用函数的权限,最佳实践是限制对单个存储桶或特定 Amazon Web Services 账户中存储桶的访问权限,而不是向 S3 服务授予一揽子权限。