

# Lambda 的工作原理
<a name="concepts-basics"></a>

Lambda 函数是用于构建 Lambda 应用程序的基本构建块。要编写函数，了解构成 Lambda 编程模型的核心概念和组件至关重要。本节将指导您了解使用 Lambda 构建无服务器应用程序所需了解的基本要素。
+ **[Lambda 函数和函数处理程序](#gettingstarted-concepts-function)**：Lambda 函数是为响应事件而运行的一段小型的代码块。函数可以是标准型（最长 15 分钟）或[持久性](durable-functions.md)（最长一年）。函数是用于构建应用程序的基本构建块。函数处理程序是 Lambda 函数代码处理的事件对象的入口点。
+ **[Lambda 执行环境和运行时](#gettingstarted-concepts-runtime)** - Lambda 执行环境管理运行函数所需的资源。对于[持久性函数](durable-functions.md)，执行环境包括自动状态管理和检查点功能。运行时是您的函数在其中运行的特定于语言的环境。
+ **[事件和触发器](#gettingstarted-concepts-event)**：其他 Amazon Web Services 服务可以响应特定事件来调用函数。对于持久性函数，事件还可以触发暂停工作流的恢复。
+ **[Lambda 权限和角色](#gettingstarted-concepts-permissions)** - 控制谁可以访问您的函数以及您的函数可以与哪些其他 Amazon Web Services 服务 服务交互。持久性函数需要额外的权限进行状态管理和扩展执行。

**提示**  
如果您想从更全面地了解无服务器开发开始，请参阅《Amazon Serverless Developer Guide》**中的 [Understanding the difference between traditional and serverless development](https://docs.amazonaws.cn/serverless/latest/devguide/serverless-shift-mindset.html)。

## Lambda 函数和函数处理程序
<a name="gettingstarted-concepts-function"></a>

在 Lambda 中，**函数**是用来创建应用程序的基本构建块。Lambda 函数是一段代码，为响应事件而运行，例如用户点击网站上的按钮或将文件上传到 Amazon Simple Storage Service（Amazon S3）存储桶。借助持久性函数，您的代码能够在步骤之间暂停执行，并自动保存状态，使其非常适合用于诸如订单处理或内容审核等长时间运行的工作流。您可以将函数想象成一种具有以下属性的独立程序。

Lambda **函数处理程序**是函数代码中用于处理事件的方法。当函数为响应事件运行时，Lambda 会运行函数处理程序。有关导致函数运行的事件的数据将直接传递给处理程序。虽然 Lambda 函数中的代码可包含多个方法或函数，但 Lambda 函数只能有一个处理程序。

要创建 Lambda 函数，您需要将函数代码及其依赖项捆绑到一个部署包中。Lambda 支持两种类型的部署包：[.zip 文件归档](configuration-function-zip.md)和[容器映像](images-create.md)。
+ 函数具有一项特定任务或目的
+ 它们仅在需要时运行，以响应特定事件
+ 完成后，它们会自动停止运行

## Lambda 执行环境和运行时
<a name="gettingstarted-concepts-runtime"></a>

Lambda 函数在 Lambda 为您管理的安全、隔离的*[执行环境](lambda-runtime-environment.md)*中运行。对于[持久性函数](durable-functions.md)，执行环境包括用于状态管理和工作流协调的其他组件。该执行环境负责管理运行函数所需的流程和资源。首次调用函数时，Lambda 会为该函数创建一个新的执行环境以供其运行。函数运行完毕后，Lambda 不会立即停止执行环境；如果再次调用该函数，Lambda 可以重复使用现有执行环境。

Lambda 执行环境还包含*运行时*，即特定于语言的环境，可用于在 Lambda 与您的函数之间中继事件信息和响应。Lambda 为最流行的编程语言提供了多种[托管运行时](lambda-runtimes.md#runtimes-supported)，您也可以创建自己的运行时。

对于托管运行时，Lambda 会使用运行时自动应用安全更新和函数补丁。

## 事件和触发器
<a name="gettingstarted-concepts-event"></a>

您也可以使用 Lambda 控制台 [Amazon CLI](https://www.amazonaws.cn/cli/) 或其中一个 [Amazon 软件开发工具包（SDK）](https://www.amazonaws.cn/developer/tools/)直接调用 Lambda 函数。在生产应用程序中，更常见的情况是，其他 Amazon Web Services 服务服务会调用您的函数来响应特定事件。例如，您可能希望在向 Amazon DynamoDB 表中添加项目时运行一个函数。

为了使函数响应事件，您需要设置一个**触发器**。触发器将函数连接到事件源，并且函数可以有多个触发器。当事件发生时，Lambda 会以 JSON 文档形式接收事件数据，并将其转换为代码可处理的对象。您可以为事件定义下面的 JSON 格式，Lambda 运行时会将此 JSON 转换为对象，然后再将其传递给函数的处理程序。

**Example 自定义 Lambda 事件**  

```
{
  "Location": "SEA",
  "WeatherData":{
    "TemperaturesF":{
      "MinTempF": 22,
      "MaxTempF": 78
    },
    "PressuresHPa":{
      "MinPressureHPa": 1015,
      "MaxPressureHPa": 1027
    }
  }
}
```

Amazon Kinesis 或 Amazon SQS 等流和队列服务使用[事件源映射](invocation-eventsourcemapping.md)而非标准触发器。事件源映射会轮询源以获取新数据，批处理记录，然后使用批量事件调用函数。有关更多信息，请参阅 [事件源映射与直接触发器的区别](invocation-eventsourcemapping.md#eventsourcemapping-trigger-difference)。

要了解触发器的工作原理，请先完成[使用 Amazon S3 触发器](with-s3-example.md)教程，或者要了解有关使用触发器的一般概述以及有关使用 Lambda 控制台创建触发器的说明，请参阅[与其他服务集成](lambda-services.md)。

## Lambda 权限和角色
<a name="gettingstarted-concepts-permissions"></a>

对于 Lambda，您需要配置两种主要的[权限](permissions-granting-access.md)类型：
+ 您的函数访问其他 Amazon Web Services 服务所需的权限
+ 其他用户和 Amazon Web Services 服务访问您的函数所需的权限

以下部分介绍了这两种权限类型，并讨论了应用最低权限许可的最佳实践。

### 函数访问其他 Amazon 资源的权限
<a name="gettingstarted-concepts-permissions-role"></a>

Lambda 函数通常需要访问其他 Amazon 资源并对这些资源执行操作。例如，函数可能从 DynamoDB 表中读取项目，将对象存储在 S3 存储桶中，或者写入 Amazon SQS 队列。要向函数提供执行这些操作所需的权限，可以使用*[执行角色](lambda-intro-execution-role.md)*。

Lambda 执行角色是一种特殊的 Amazon Identity and Access Management（IAM）[角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)，即您在账户中创建的身份，其具有*策略*中定义的与之相关的特定权限。

每个 Lambda 函数都必须有一个执行角色，并且一个角色可以供多个函数使用。调用函数时，Lambda 将担任该函数的执行角色，并获得权限可以执行该角色策略中定义的操作。

在 Lambda 控制台中创建函数时，Lambda 会自动为函数创建一个执行角色。该角色的策略授予函数向 Amazon CloudWatch Logs 写入日志输出的基本权限。要向您的函数授予对其他 Amazon 资源执行操作的权限，您需要编辑角色以添加额外的权限。添加权限的最简单方法是使用 Amazon [托管策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。托管策略由 Amazon 创建和管理，并为许多常见应用场景提供权限。例如，如果您的函数对 DynamoDB 表执行 CRUD 操作，则可以将 [AmazonDynamoDBFullAccess](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) 策略添加到您的角色中。

### 其他用户和资源访问您的函数的权限
<a name="gettingstarted-concepts-permissions-resource-based"></a>

要授予其他 Amazon Web Services 服务访问 Lambda 函数的权限，您需使用*[基于资源的策略](access-control-resource-based.md)*。在 IAM 中，基于资源的策略附加到资源（在本例中为您的 Lambda 函数），并且指定了有权访问资源的用户以及此类用户可以执行的操作。

要让其他 Amazon Web Services 服务通过触发器调用您的函数，则函数基于资源的策略必须向该服务授予使用 `lambda:InvokeFunction` 操作的权限。如果您使用控制台创建触发器，则 Lambda 会自动为您添加此权限。

要向其他 Amazon 用户授予访问您的函数的权限，您可以用与针对其他 Amazon Web Services 服务或资源完全相同的方式，在函数基于资源的策略中定义此项操作。您也可以使用与用户关联的*[基于身份的策略](access-control-identity-based.md)*。

### Lambda 权限的最佳实践
<a name="gettingstarted-concepts-permissions-best-practice"></a>

在使用 IAM 策略设置权限时，[安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)是仅授予执行任务所需的许可。这称为*最低权限*原则。要开始为您的函数授予权限，您可以选择使用 Amazon 托管策略。托管策略可能是授予执行任务所需权限的最快、最简单的方法，但它们也可能包含您不需要的其他权限。在您从早期开发过渡到测试和生产时，我们建议您通过定义自己的[客户管理型策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)，将权限减少到仅限于所需权限。

使用基于资源的策略授予访问函数的权限时，同样的原则也适用。例如，如果您想授予 Amazon S3 调用函数的权限，最佳实践是限制对单个存储桶或特定 Amazon Web Services 账户中存储桶的访问权限，而不是向 S3 服务授予一揽子权限。