

# 在 AWS Lambda 中管理权限
<a name="lambda-permissions"></a>

您可以使用 AWS Lambda（IAM）管理 AWS Identity and Access Management 中的权限。使用 Lambda 函数时需要考虑两类主要权限：
+ 您的 Lambda 函数执行 API 操作和访问其他 AWS 资源所需的权限
+ 其他 AWS 用户和实体访问您的 Lambda 函数所需的权限

Lambda 函数通常需要访问其他 AWS 资源，并对这些资源执行各种 API 操作。例如，您可能会有想通过更新 Amazon DynamoDB 数据库中的条目来响应事件的 Lambda 函数。在这种情况下，您的函数需要访问数据库的权限，以及在该数据库中放置或更新项目的权限。

您可以在名为[执行角色](lambda-intro-execution-role.md)的特殊 IAM 角色中定义 Lambda 函数所需的权限。在此角色中，您可以附加一个策略，该策略定义您的函数访问其他 AWS 资源以及从事件源读取所需的所有权限。每个 Lambda 函数都必须有一个执行角色。您的执行角色必须至少有权访问 Amazon CloudWatch，因为默认情况下，Lambda 函数会记录到 CloudWatch Logs 中。您可以将 [`AWSLambdaBasicExecutionRole` 托管策略](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaBasicExecutionRole.html)附加到执行角色以满足此要求。

要授予其他 AWS 账户 账户、组织和服务访问 Lambda 资源的权限，您有以下几种选择：
+ 您可以使用[基于身份的策略](access-control-identity-based.md)授予其他用户访问 Lambda 资源的权限。基于身份的策略可以直接应用于用户，也可以应用于与用户相关的组和角色。
+ 您可以使用[基于资源的策略](access-control-resource-based.md)授予其他账户和 AWS 服务 权限以访问您的 Lambda 资源。当用户尝试访问 Lambda 资源时，Lambda 会同时考虑用户的基于身份的策略和资源的基于资源的策略。当 Amazon Simple Storage Service（Amazon S3）等 AWS 服务调用您的 Lambda 函数时，Lambda 仅考虑基于资源的策略。
+ 您可以使用[基于属性的访问权限控制（ABAC）](attribute-based-access-control.md)模型来控制对 Lambda 函数的访问。使用 ABAC，您可以将标签附加到 Lambda 函数，在某些 API 请求中传递它们，或将它们附加到发出请求的 IAM 主体。在 IAM 策略的条件元素中指定相同的标签来控制功能访问。

在 AWS 中，最佳实践是仅授予执行任务所需的权限（[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)）。要在 Lambda 中实现这一点，建议从 [AWS 托管策略](permissions-managed-policies.md)开始。您可以按原样使用这些托管策略，也可以作为编写自己的限制性更强策略的起点。

为了帮助您微调最低权限访问的权限，Lambda 提供了一些您可以包含在策略中的其他条件。有关更多信息，请参阅 [微调策略的“资源和条件”部分](lambda-api-permissions-ref.md)。

有关 IAM 的更多信息，请参阅《IAM 用户指南》*[https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)*。

# 使用执行角色定义 Lambda 函数权限
<a name="lambda-intro-execution-role"></a>

Lambda 函数的执行角色是一个 AWS Identity and Access Management（IAM）角色，用于向函数授予访问 AWS 服务 和资源的权限。例如，您可以创建一个有权将日志发送到 Amazon CloudWatch 并将跟踪数据上传到 AWS X-Ray 的执行角色。此页面提供有关如何创建、查看和管理 Lambda 函数执行角色的信息。

当您调用函数时，Lambda 会自动代入您的执行角色。您应该避免在函数代码中手动调用 `sts:AssumeRole` 来担任执行角色。如果您的使用案例要求角色能代入自己，则必须将角色本身作为可信主体包含在角色的信任策略中。有关如何修改角色信任策略的更多信息，请参阅《IAM 用户指南》中的[修改角色信任策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)。

为了让 Lambda 正确担任执行角色，该角色的[信任策略](#permissions-executionrole-api)必须将 Lambda 服务主体（`lambda.amazonaws.com`）指定为可信服务。

**Topics**
+ [

## 在 IAM 控制台中创建执行角色
](#permissions-executionrole-console)
+ [

## 使用 AWS CLI 创建和管理角色
](#permissions-executionrole-api)
+ [

## 授予对 Lambda 执行角色的最低访问权限
](#permissions-executionrole-least-privilege)
+ [

# 查看和更新​​执行角色中的权限
](permissions-executionrole-update.md)
+ [

# 在执行角色中使用 AWS 托管策略
](permissions-managed-policies.md)
+ [

# 使用源函数 ARN 控制函数访问行为
](permissions-source-function-arn.md)

## 在 IAM 控制台中创建执行角色
<a name="permissions-executionrole-console"></a>

预设情况下，当您[在 Lambda 控制台中创建函数](getting-started.md#getting-started-create-function)时，Lambda 会创建具有最少权限的执行角色。具体而言，此执行角色包括 [`AWSLambdaBasicExecutionRole` 托管策略](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaBasicExecutionRole.html)，该策略授予您的函数将事件记录到 Amazon CloudWatch Logs 的基本权限。您可以在**权限**部分选择**创建默认角色**。

您可以通过在**权限**部分选择**使用其他角色**来选择现有角色。如果 Lambda 函数需要额外权限来执行任务，例如根据事件更新 Amazon DynamoDB 数据库中的条目，您可以创建一个具有必要权限的自定义执行角色。为此，请在**权限**部分选择**使用其他角色**，打开一个抽屉，您可以在其中自定义权限。

**从控制台配置执行角色**

1. 在角色详细信息部分输入**角色名称**。

1. 在**策略**部分，选择**使用现有策略**。

1. 选择您想要附加到角色的 AWS 托管策略。例如，如果您的函数需要访问 DynamoDB，则请选择 **AWSLambdaDynamoDBExecutionRole** 托管策略。

1. 选择**创建角色**。

或者，当您[在 Lambda 控制台中创建函数](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function)时，您可以将之前创建的任何执行角色附加到该函数。如果要为现有函数附加新的执行角色，请按照[更新函数的执行角色](permissions-executionrole-update.md)中的步骤操作。

## 使用 AWS CLI 创建和管理角色
<a name="permissions-executionrole-api"></a>

要使用 AWS Command Line Interface (AWS CLI) 创建执行角色，请使用 **create-role** 命令。在使用此命令时，您可以指定内联信任策略。角色的信任策略会向指定主体授予代入该角色的权限。在以下示例中，您向 Lambda 服务主体授予代入角色的权限。请注意，JSON 字符串中对转义引号的要求可能因 shell 而异。

```
aws iam create-role \
  --role-name lambda-ex \
  --assume-role-policy-document '{"Version": "2012-10-17",		 	 	 "Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
```

您还可以使用单独的 JSON 文件为角色定义信任策略。在下面的示例中，`trust-policy.json` 是位于当前目录中的一个文件。

**Example trust-policy.json**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

```
aws iam create-role \
  --role-name lambda-ex \
  --assume-role-policy-document file://trust-policy.json
```

要向角色添加权限，请使用 **attach-policy-to-role** 命令。以下命令将 `AWSLambdaBasicExecutionRole` 托管策略添加到 `lambda-ex` 执行角色。

```
aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```

创建执行角色后，将其附加到您的函数。当您[在 Lambda 控制台中创建函数](getting-started.md#getting-started-create-function)时，您可以将之前创建的任何执行角色附加到该函数。如果要将新的执行角色附加到现有函数，则请按照 [更新函数的执行角色](permissions-executionrole-update.md#update-execution-role) 中的步骤操作。

## 授予对 Lambda 执行角色的最低访问权限
<a name="permissions-executionrole-least-privilege"></a>

在开发阶段首次为 Lambda 函数创建 IAM 角色时，有时授予的权限可能超出所需权限。在生产环境中发布函数之前，最佳实践是调整策略，使其仅包含所需权限。有关更多信息，请参阅《*IAM 用户指南*》中的[应用最低权限许可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。

使用 IAM 访问分析器帮助确定 IAM 执行角色策略所需的权限。IAM 访问分析器将检查您指定的日期范围内的 AWS CloudTrail 日志，并生成仅具有该函数在该时间内使用的权限的策略模板。您可以使用模板创建具有精细权限的托管策略，然后将其附加到 IAM 角色。这样，您仅需授予角色与特定使用案例中的 AWS 资源进行交互所需的权限。

有关更多信息，请参阅《*IAM 用户指南*》中的[基于访问活动生成策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_generate-policy.html)。

# 查看和更新​​执行角色中的权限
<a name="permissions-executionrole-update"></a>

本主题介绍如何查看和更新函数的[执行角色](lambda-intro-execution-role.md)。

**Topics**
+ [

## 查看函数的执行角色
](#view-execution-role)
+ [

## 更新函数的执行角色
](#update-execution-role)

## 查看函数的执行角色
<a name="view-execution-role"></a>

要查看函数的执行角色，请使用 Lambda 控制台。

**查看函数的执行角色（控制台）**

1. 打开 Lamba 控制台的[函数页面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 选择一个函数的名称。

1. 选择 **Configuration**（配置），然后选择 **Permissions**（权限）。

1. 在**执行角色**下，您可以查看当前用作函数执行角色的角色。为了方便起见，您可以在**资源摘要**部分下查看该函数可以访问的所有资源和操作。您还可以从下拉列表中选择一项服务以查看与该服务相关的所有权限。

## 更新函数的执行角色
<a name="update-execution-role"></a>

可以随时在函数的执行角色中添加或删除权限，或配置您的函数以使用不同的角色。如果函数需要访问任何其他服务或资源，则必须向执行角色添加必要的权限。

向函数添加权限时，请同时简单更新其代码或配置。这会强制停止并替换函数的具有过时凭证的运行实例。

要更新函数的执行角色，您可以使用 Lambda 控制台。

**更新函数的执行角色（控制台）**

1. 打开 Lamba 控制台的[函数页面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 选择一个函数的名称。

1. 选择 **Configuration**（配置），然后选择 **Permissions**（权限）。

1. 在**执行角色**下，选择**编辑**。

1. 如果要更新函数以使用其他角色作为执行角色，则请在**现有角色**下的下拉菜单中选择新角色。
**注意**  
如果要更新现有执行角色中的权限，则只能在 AWS Identity and Access Management（IAM）控制台中执行此操作。

   如果要创建用作执行角色的新角色，则请在**执行角色**下选择**从 AWS 策略模板创建新角色**。然后，在**角色名称**下输入新角色的名称，并在**策略模板**下指定要附加到新角色的任何策略。

1. 选择**保存**。

# 在执行角色中使用 AWS 托管策略
<a name="permissions-managed-policies"></a>

以下 AWS 托管式策略提供使用 Lambda 函数所需的权限。


| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
|  **[AWSLambdaMSKExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaMSKExecutionRole)**：Lambda 将 [kafka:DescribeClusterV2](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html#v2-clusters-clusterarnget) 权限添加到了此政策。  |  `AWSLambdaMSKExecutionRole` 授予读取和访问 Amazon Managed Streaming for Apache Kafka（Amazon MSK）集群中的记录、管理网络接口 (ENI) 并写入到 CloudWatch Logs 的权限。  |  2022 年 6 月 17 日  | 
|  **[ AWSLambdaBasicExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole)** – Lambda 开始跟踪对此策略所做的更改。  |  `AWSLambdaBasicExecutionRole` 授予将日志上传至 CloudWatch 的权限。  |  2022 年 2 月 14 日  | 
|  **[ AWSLambdaDynamoDBExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole)** – Lambda 开始跟踪对此策略所做的更改。  |  `AWSLambdaDynamoDBExecutionRole` 授予读取 Amazon DynamoDB 流中的记录并写入到 CloudWatch Logs 的权限。  |  2022 年 2 月 14 日  | 
|  **[ AWSLambdaKinesisExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole)** – Lambda 开始跟踪对此策略所做的更改。  |  `AWSLambdaKinesisExecutionRole` 授予读取 Amazon Kinesis 数据流中的事件并写入到 CloudWatch Logs 的权限。  |  2022 年 2 月 14 日  | 
|  **[ AWSLambdaMSKExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaMSKExecutionRole)** – Lambda 开始跟踪对此策略所做的更改。  |  `AWSLambdaMSKExecutionRole` 授予读取和访问 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 集群中的记录、管理网络接口 (ENI) 并写入到 CloudWatch Logs 的权限。  |  2022 年 2 月 14 日  | 
|  **[ AWSLambdaSQSQueueExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole)** – Lambda 开始跟踪对此策略所做的更改。  |  `AWSLambdaSQSQueueExecutionRole` 授予读取 Amazon Simple Queue Service (Amazon SQS) 队列中的消息并写入到 CloudWatch Logs 的权限。  |  2022 年 2 月 14 日  | 
|  **[ AWSLambdaVPCAccessExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole)** – Lambda 开始跟踪对此策略所做的更改。  |  `AWSLambdaVPCAccessExecutionRole` 授予管理 Amazon VPC 中的 ENI 并写入到 CloudWatch Logs 的权限。  |  2022 年 2 月 14 日  | 
|  **[ AWSXRayDaemonWriteAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess)** – Lambda 开始跟踪对此策略所做的更改。  |  `AWSXRayDaemonWriteAccess` 授予将跟踪数据上传到 X-Ray 的权限。  |  2022 年 2 月 14 日  | 
|  **[ CloudWatchLambdaInsightsExecutionRolePolicy](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy)** – Lambda 开始跟踪对此策略所做的更改。  |  `CloudWatchLambdaInsightsExecutionRolePolicy` 授予将运行时指标写入到 CloudWatch Lambda Insights 的权限。  |  2022 年 2 月 14 日  | 
|  **[ AmazonS3ObjectLambdaExecutionRolePolicy](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AmazonS3ObjectLambdaExecutionRolePolicy)** – Lambda 开始跟踪对此策略所做的更改。  |  `AmazonS3ObjectLambdaExecutionRolePolicy` 授予与 Amazon Simple Storage Service (Amazon S3) 对象 Lambda 交互并写入到 CloudWatch Logs 的权限。  |  2022 年 2 月 14 日  | 

对于某些功能，Lambda 控制台会尝试在客户管理型策略中向执行角色添加缺失的权限。这些策略可能会变得很多。为避免创建额外的策略，在启用功能之前，请将相关的 AWS 托管策略添加到您的执行角色。

当您使用[事件源映射](invocation-eventsourcemapping.md)调用您的函数时，Lambda 将使用执行角色读取事件数据。例如，Kinesis 的事件源映射从数据流读取事件并将事件成批发送到您的函数。

当服务在您的账户中担任角色时，您的角色信任策略中可以包含 `aws:SourceAccount` 和 `aws:SourceArn` 全局条件上下文密钥，以将对角色的访问限制为仅由预期资源生成的请求。有关更多信息，请参阅[防止 AWS Security Token Service 跨服务混淆代理](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html#cross-service-confused-deputy-prevention)。

除了AWS托管式策略，Lambda 控制台还提供模板，以创建包含用于额外使用案例的权限的自定义策略。当您在 Lambda 控制台中创建函数时，可以选择利用来自一个或多个模板的权限创建新的执行角色。当您从蓝图创建函数，或者配置需要访问其他服务的选项时，也会自动应用这些模板。示例模板可从本指南的 [GitHub 存储库](https://github.com/awsdocs/aws-lambda-developer-guide/tree/master/iam-policies)中找到。

# 使用源函数 ARN 控制函数访问行为
<a name="permissions-source-function-arn"></a>

您的 Lambda 函数代码通常会向其他 AWS 服务 发出 API 请求。为了发出这些请求，Lambda 通过承担您的函数的执行角色来生成一组临时凭证。这些凭证在函数调用期间可用作环境变量。使用 AWS 开发工具包时，无需直接在代码中为开发工具包提供凭证。默认情况下，凭证提供程序链会按顺序检查每个可以设置凭证的位置，然后选择第一个可用位置，通常是环境变量（`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN`）。

如果请求是来自您执行环境中的 AWS API 请求，Lambda 会将源函数 ARN 注入到凭证上下文中。Lambda 还会为其在执行环境之外代表您发出的以下 AWS API 请求注入源函数 ARN：


| 服务 | Action | Reason | 
| --- | --- | --- | 
| CloudWatch Logs | CreateLogGroup, CreateLogStream, PutLogEvents |  将日志存储到 CloudWatch Logs 日志组  | 
| X-Ray | PutTraceSegments |  将跟踪数据发送到 X-Ray  | 
| Amazon EFS | ClientMount |  将函数连接到 Amazon Elastic File System（Amazon EFS）文件系统  | 

使用相同执行角色在执行环境之外代表您进行的其他 AWS API 调用不包含源函数 ARN。执行环境之外的此类 API 调用示例包括：
+ 调用 AWS Key Management Service (AWS KMS) 以自动加密和解密您的环境变量。
+ 调用 Amazon Elastic Compute Cloud（Amazon EC2），为启用 VPC 的函数创建弹性网络接口（ENI）。
+ 调用 Amazon Simple Queue Service（Amazon SQS）等 AWS 服务，从设置为[事件源映射](invocation-eventsourcemapping.md)的事件源进行读取。

使用凭证上下文中的源函数 ARN，您可以验证对您的资源的调用是否来自特定 Lambda 函数的代码。要对此进行验证，请在 IAM 基于身份的策略或[服务控制策略（SCP）](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)中使用 `lambda:SourceFunctionArn` 条件键。

**注意**  
您不能在基于资源的策略中使用 `lambda:SourceFunctionArn` 条件键。

在基于身份的策略或 SCP 中使用此条件键，您可以为您的函数代码对其他 AWS 服务 执行的 API 操作实施安全控制。这有一些关键的安全应用程序，例如帮助您识别凭证泄漏的来源。

**注意**  
`lambda:SourceFunctionArn` 条件键与 `lambda:FunctionArn` 和 `aws:SourceArn` 条件键不同。`lambda:FunctionArn` 条件键仅适用于[事件源映射](invocation-eventsourcemapping.md)，并帮助定义您的事件源可以调用哪些函数。`aws:SourceArn` 条件键仅适用于以您的 Lambda 函数为目标资源的策略，并帮助定义哪些其他 AWS 服务 和资源可以调用该函数。`lambda:SourceFunctionArn` 条件键可应用于任何基于身份的策略或 SCP，以定义有权对其他资源进行特定 AWS API 调用的特定 Lambda 函数。

要在您的策略中使用 `lambda:SourceFunctionArn`，请将其作为条件包含在任何 [ARN 条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN)中。密钥的值必须是有效的 ARN。

例如，假设您的 Lambda 函数代码进行了针对特定 Amazon S3 存储桶的 `s3:PutObject` 调用。您可能希望仅允许一个特定 Lambda 函数让 `s3:PutObject` 访问该存储桶。在这种情况下，您的函数的执行角色应附加如下所示的策略：

**Example 授予特定 Lambda 函数访问 Amazon S3 资源的权限的策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ExampleSourceFunctionArn",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Condition": {
                "ArnEquals": {
                    "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
                }
            }
        }
    ]
}
```

如果源是具有 ARN `arn:aws:lambda:us-east-1:123456789012:function:source_lambda` 的 Lambda 函数，则此策略仅允许 `s3:PutObject` 访问。此策略不允许 `s3:PutObject` 访问任何其他调用身份。即使不同的函数或实体使用相同的执行角色进行 `s3:PutObject` 调用也是如此。

**注意**  
`lambda:SourceFunctionARN` 条件键不支持 Lambda 函数版本或函数别名。如果您将 ARN 用于特定函数版本或别名，则函数将无权执行您指定的操作。确保使用函数的非限定 ARN（不带版本或别名后缀）。

您也可以在 SCP 中使用 `lambda:SourceFunctionArn`。例如，假设您希望将对存储桶的访问限制为单个 Lambda 函数的代码或来自特定 Amazon 虚拟私有云（VPC）的调用。以下 SCP 对此进行了说明。

**Example 在特定条件下拒绝访问 Amazon S3 的策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Effect": "Deny",
            "Condition": {
                "StringNotEqualsIfExists": {
                    "aws:SourceVpc": [
                        "vpc-12345678"
                    ]
                }
            }
        },
        {
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Effect": "Deny",
            "Condition": {
                "ArnNotEqualsIfExists": {
                    "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
                }
            }
        }
    ]
}
```

此策略将拒绝所有 S3 操作，除非它们来自具有 ARN `arn:aws:lambda:*:123456789012:function:source_lambda` 的特定 Lambda 函数，或者它们来自指定的 VPC。`StringNotEqualsIfExists` 运算符告诉 IAM 仅当请求中存在 `aws:SourceVpc` 键时才处理此条件。同样，仅当存在 `lambda:SourceFunctionArn` 时，IAM 才会考虑 `ArnNotEqualsIfExists` 运算符。

# 向其他 AWS 实体授予访问您的 Lambda 函数的权限
<a name="permissions-granting-access"></a>

要授予其他 AWS 账户 账户、组织和服务访问 Lambda 资源的权限，您有以下几种选择：
+ 您可以使用[基于身份的策略](access-control-identity-based.md)授予其他用户访问 Lambda 资源的权限。基于身份的策略可以直接应用于用户，也可以应用于与用户相关的组和角色。
+ 您可以使用[基于资源的策略](access-control-resource-based.md)授予其他账户和 AWS 服务 权限以访问您的 Lambda 资源。当用户尝试访问 Lambda 资源时，Lambda 会同时考虑用户的基于身份的策略和资源的基于资源的策略。当 Amazon Simple Storage Service（Amazon S3）等 AWS 服务调用您的 Lambda 函数时，Lambda 仅考虑基于资源的策略。
+ 您可以使用[基于属性的访问权限控制（ABAC）](attribute-based-access-control.md)模型来控制对 Lambda 函数的访问。使用 ABAC，您可以将标签附加到 Lambda 函数，在某些 API 请求中传递它们，或将它们附加到发出请求的 IAM 主体。在 IAM 策略的条件元素中指定相同的标签来控制功能访问。

为了帮助您微调最低权限访问的权限，Lambda 提供了一些您可以包含在策略中的其他条件。有关更多信息，请参阅 [微调策略的“资源和条件”部分](lambda-api-permissions-ref.md)。

# Lambda 的基于身份的 IAM policy
<a name="access-control-identity-based"></a>

您可以使用 AWS Identity and Access Management (IAM) 中基于身份的策略授予您账户中的用户访问 Lambda 的权限。基于身份的策略可以应用于用户、用户组或角色。您也可以授予另一个账户中的用户在您的账户中代入角色和访问您的 Lambda 资源的权限。

Lambda 提供AWS托管策略，授予对 Lambda API 操作的访问权限，在某些情况下还可以访问其他AWS服务，用于开发和管理 Lambda 资源。Lambda 根据需要更新这些托管策略，确保您的用户有权在新功能发布时进行访问。
+ [AWSLambda\$1FullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_FullAccess.html) - 授予对 Lambda 操作和其他用于开发和维护 Lambda 资源的 AWS 服务的完全访问权。
+ [AWSLambda\$1ReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_ReadOnlyAccess.html) – 授予对 Lambda 资源的只读访问权限。
+ [AWSLambdaRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaRole.html) – 授予调用 Lambda 函数的权限。

AWS 托管策略授予 API 操作的权限，而不限制用户可以修改的 Lambda 函数或层。要进行更精细的控制，您可以创建自己的策略来限制用户权限的范围。

**Topics**
+ [

# 授予用户对 Lambda 函数的访问权限
](permissions-user-function.md)
+ [

# 授予用户对 Lambda 层的访问权限
](permissions-user-layer.md)

# 授予用户对 Lambda 函数的访问权限
<a name="permissions-user-function"></a>

使用[基于身份的策略](access-control-identity-based.md)允许用户、用户组或角色对 Lambda 函数执行操作。

**注意**  
对于定义为容器映像的函数，必须在 Amazon Elastic container Registry（Amazon ECR）中配置访问映像的用户权限。有关示例，请参阅 [Amazon ECR 存储库策略](images-create.md#configuration-images-permissions)。

以下显示具有有限范围的权限策略示例。该策略允许用户创建和管理名称前带指定前缀 (`intern-`) 并用指定执行角色配置的 Lambda 函数。

**Example 函数开发策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadOnlyPermissions",
            "Effect": "Allow",
            "Action": [
                "lambda:GetAccountSettings",
                "lambda:GetEventSourceMapping",
                "lambda:GetFunction",
                "lambda:GetFunctionConfiguration",
                "lambda:GetFunctionCodeSigningConfig",
                "lambda:GetFunctionConcurrency",
                "lambda:ListEventSourceMappings",
                "lambda:ListFunctions",
                "lambda:ListTags",
                "iam:ListRoles"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DevelopFunctions",
            "Effect": "Allow",
            "NotAction": [
                "lambda:AddPermission",
                "lambda:PutFunctionConcurrency"
            ],
            "Resource": "arn:aws:lambda:*:*:function:intern-*"
        },
        {
            "Sid": "DevelopEventSourceMappings",
            "Effect": "Allow",
            "Action": [
                "lambda:DeleteEventSourceMapping",
                "lambda:UpdateEventSourceMapping",
                "lambda:CreateEventSourceMapping"
            ],
            "Resource": "*",
            "Condition": {
                "ArnLike": {
                    "lambda:FunctionArn": "arn:aws:lambda:*:*:function:intern-*"
                }
            }
        },
        {
            "Sid": "PassExecutionRole",
            "Effect": "Allow",
            "Action": [
                "iam:ListRolePolicies",
                "iam:ListAttachedRolePolicies",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:PassRole",
                "iam:SimulatePrincipalPolicy"
            ],
            "Resource": "arn:aws:iam::*:role/intern-lambda-execution-role"
        },
        {
            "Sid": "ViewLogs",
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/intern-*"
        }
    ]
}
```

策略中的权限基于它们所支持的[资源和条件](lambda-api-permissions-ref.md)组织成语句。
+ `ReadOnlyPermissions` – 当您浏览和查看函数时，Lambda 控制台使用这些权限。它们不支持资源模式或条件。

  ```
              "Action": [
                  "lambda:GetAccountSettings",
                  "lambda:GetEventSourceMapping",
                  "lambda:GetFunction",
                  "lambda:GetFunctionConfiguration",           
                  "lambda:GetFunctionCodeSigningConfig",
                  "lambda:GetFunctionConcurrency",                
                  "lambda:ListEventSourceMappings",
                  "lambda:ListFunctions",      
                  "lambda:ListTags",
                  "iam:ListRoles"
              ],
              "Resource": "*"
  ```
+ `DevelopFunctions`：使用任何对前缀为 `intern-` 的函数执行的 Lambda 操作，但 `AddPermission` 和 `PutFunctionConcurrency` 除外。`AddPermission` 修改函数上[基于资源的策略](access-control-resource-based.md)并可能影响安全性。`PutFunctionConcurrency` 保留函数的扩展容量，并可以从其他函数取得容量。

  ```
              "NotAction": [
                  "lambda:AddPermission",
                  "lambda:PutFunctionConcurrency"
              ],
              "Resource": "arn:aws:lambda:*:*:function:intern-*"
  ```
+ `DevelopEventSourceMappings` – 管理前缀为 `intern-` 的函数的事件源映射。虽然这些操作在事件源映射上运行，但您可以通过附带*条件*的函数限制它们。

  ```
              "Action": [
                  "lambda:DeleteEventSourceMapping",
                  "lambda:UpdateEventSourceMapping",
                  "lambda:CreateEventSourceMapping"
              ],
              "Resource": "*",
              "Condition": {
                  "StringLike": {
                      "lambda:FunctionArn": "arn:aws:lambda:*:*:function:intern-*"
                  }
              }
  ```
+ `PassExecutionRole` – 查看并仅传递名为 `intern-lambda-execution-role` 的角色，该角色必须由具有 IAM 权限的用户创建和管理。当您为函数分配执行角色时，使用 `PassRole`。

  ```
              "Action": [
                  "iam:ListRolePolicies",
                  "iam:ListAttachedRolePolicies",
                  "iam:GetRole",
                  "iam:GetRolePolicy",
                  "iam:PassRole",
                  "iam:SimulatePrincipalPolicy"
              ],
              "Resource": "arn:aws:iam::*:role/intern-lambda-execution-role"
  ```
+ `ViewLogs` – 使用 CloudWatch Logs 查看前缀为 `intern-` 的函数的日志。

  ```
              "Action": [
                  "logs:*"
              ],
              "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/intern-*"
  ```

该策略允许用户开始使用 Lambda，而不会将其他用户的资源置于风险之下。它不允许用户配置能被触发或调用其他 AWS 服务的函数，这需要更广的 IAM 权限。它也不包含对于不支持有限范围策略的服务（如 CloudWatch 和 X-Ray）的权限。将只读策略用于这些服务以便让用户能够访问指标和跟踪数据。

当您为您的函数配置触发器时，需要有权使用调用您的函数的 AWS 服务。例如，要配置 Amazon S3 触发器，您需要权限来使用管理存储桶通知的 Amazon S3 操作。其中很多权限包含在 [AWSLambda\$1FullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_FullAccess.html) 托管策略中。

# 授予用户对 Lambda 层的访问权限
<a name="permissions-user-layer"></a>

使用[基于身份的策略](access-control-identity-based.md)允许用户、用户组或角色在 Lambda 层上执行操作。以下策略授予用户创建层并通过函数使用层的权限。资源模式允许用户在任何 AWS 区域 和任何层版本中工作，只要层的名称以 `test-` 开头即可。

**Example 层开发策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "PublishLayers",
            "Effect": "Allow",
            "Action": [
                "lambda:PublishLayerVersion"
            ],
            "Resource": "arn:aws:lambda:*:*:layer:test-*"
        },
        {
            "Sid": "ManageLayerVersions",
            "Effect": "Allow",
            "Action": [
                "lambda:GetLayerVersion",
                "lambda:DeleteLayerVersion"
            ],
            "Resource": "arn:aws:lambda:*:*:layer:test-*:*"
        }
    ]
}
```

您还可以附加 `lambda:Layer` 条件以在函数创建和配置过程中强制使用层。例如，您可以防止用户使用其他账户发布的层。以下策略在 `CreateFunction` 和 `UpdateFunctionConfiguration` 操作中添加一个条件，以要求任何指定层来自账户 `123456789012`。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ConfigureFunctions",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Resource": "*",
            "Condition": {
                "ForAllValues:StringLike": {
                    "lambda:Layer": [
                        "arn:aws:lambda:*:123456789012:layer:*:*"
                    ]
                }
            }
        }
    ]
}
```

------

为确保条件应用，应验证没有其他语句向用户授予这些操作的权限。

# 在 Lambda 中查看基于资源的 IAM 策略
<a name="access-control-resource-based"></a>

Lambda 支持将基于资源的权限策略用于 Lambda 函数和层。您可以使用基于资源的策略向其他 [AWS 账户](permissions-function-cross-account.md)、[组织](permissions-function-organization.md)或[服务](permissions-function-services.md)授予访问权限。基于资源的策略应用于单个函数、版本、别名或层版本。

------
#### [ Console ]

**查看函数的基于资源的策略**

1. 打开 Lamba 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择函数。

1. 选择 **Configuration (配置)**，然后选择 **Permissions (权限)**。

1. 向下滚动到 ** Resource-based policy (基于资源的策略)**，然后选择 ** View policy document (查看策略文档)**。基于资源的策略显示了在其他账户或 AWS 服务尝试访问该函数时应用的权限。以下示例显示了一个语句，该语句允许 Amazon S3 调用为账户 `123456789012` 中名为 `amzn-s3-demo-bucket` 的存储桶调用名为 `my-function` 的函数。  
**Example 基于资源的策略**    
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Id": "default",
       "Statement": [
           {
               "Sid": "lambda-allow-s3-my-function",
               "Effect": "Allow",
               "Principal": {
                 "Service": "s3.amazonaws.com"
               },
               "Action": "lambda:InvokeFunction",
               "Resource":  "arn:aws:lambda:us-east-2:123456789012:function:my-function",
               "Condition": {
                 "StringEquals": {
                   "AWS:SourceAccount": "123456789012"
                 },
                 "ArnLike": {
                   "AWS:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket"
                 }
               }
           }
        ]
   }
   ```

------
#### [ AWS CLI ]

要查看函数的基于资源的策略，请使用 `get-policy` 命令。

```
aws lambda get-policy \
  --function-name my-function \
  --output text
```

您应看到以下输出：

****  

```
{"Version":"2012-10-17",		 	 	 "Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:us-east-2:123456789012:lambda*"}}}]}
```

对于版本和别名，请在函数名后面附加版本号或别名。

```
aws lambda get-policy --function-name my-function:PROD
```

要从函数中删除权限，请使用 `remove-permission`。

```
aws lambda remove-permission \
  --function-name example \
  --statement-id sns
```

使用 `get-layer-version-policy` 命令可查看层上的权限。

```
aws lambda get-layer-version-policy \
  --layer-name my-layer \
  --version-number 3 \
  --output text
```

您应看到以下输出：

```
b0cd9796-d4eb-4564-939f-de7fe0b42236    {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"
```

使用 `remove-layer-version-permission` 可从策略中删除语句。

```
aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org
```

------

## 支持的 API 操作
<a name="permissions-resource-api"></a>

以下 Lambda API 操作支持基于资源的策略：
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [DeleteAlias](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteAlias.html)
+ [DeleteFunction](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunction.html)
+ [DeleteFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionConcurrency.html)
+ [DeleteFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionEventInvokeConfig.html)
+ [DeleteProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteProvisionedConcurrencyConfig.html)
+ [GetAlias](https://docs.aws.amazon.com/lambda/latest/api/API_GetAlias.html)
+ [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html)
+ [GetFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConcurrency.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [GetFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionEventInvokeConfig.html)
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)
+ [GetProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetProvisionedConcurrencyConfig.html)
+ [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)
+ [InvokeFunctionUrl](urls-auth.md)（仅权限）
+ [ListAliases](https://docs.aws.amazon.com/lambda/latest/api/API_ListAliases.html)
+ [ListFunctionEventInvokeConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctionEventInvokeConfigs.html)
+ [ListProvisionedConcurrencyConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListProvisionedConcurrencyConfigs.html)
+ [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)
+ [ListVersionsByFunction](https://docs.aws.amazon.com/lambda/latest/api/API_ListVersionsByFunction.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)
+ [PutFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionConcurrency.html)
+ [PutFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html)
+ [PutProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutProvisionedConcurrencyConfig.html)
+ [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html)
+ [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionEventInvokeConfig.html)

# 授予 Lambda 函数访问 AWS 服务 的权限
<a name="permissions-function-services"></a>

当您[使用 AWS 服务调用您的函数](lambda-services.md)时，可以用基于资源的策略语句授权。您可以将语句应用于整个函数，也可以将语句限制为单个版本或别名。

**注意**  
当您通过 Lambda 控制台向函数添加触发器时，该控制台会更新函数的基于资源的策略以允许服务调用它。要向 Lambda 控制台中不可用的其他账户或服务授予权限，可以使用 AWS CLI。

使用 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令添加一条语句。最简单的基于资源的策略语句是允许一个服务调用某个函数。以下命令授予 Amazon Simple Notification Service 调用名为 `my-function` 的函数的权限。

```
aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id sns \
  --principal sns.amazonaws.com \
  --output text
```

您应看到以下输出：

```
{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}
```

这允许 Amazon SNS 在函数上调用 [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) API 操作，但不会限制触发调用的 Amazon SNS 主题。为确保您的函数只被特定资源调用，请使用 `source-arn` 选项指定资源的 Amazon Resource Name (ARN)。以下命令只允许 Amazon SNS 调用名为 `my-topic` 的主题的订阅函数。

```
aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id sns-my-topic \
  --principal sns.amazonaws.com \
  --source-arn arn:aws:sns:us-east-2:123456789012:my-topic
```

有些服务可以调用其他账户中的函数。如果您指定的一个源 ARN 中包含您的账户 ID，这不是问题。但对于 Amazon S3 来说，源是其 ARN 中不包含账户 ID 的存储桶。有可能是您删除了该存储桶，而另一个账户用同样的名称创建了这样一个存储桶。使用 `source-account` 选项以及您的账户 ID 以确保只有您账户中的资源可以调用该函数。

```
aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id s3-account \
  --principal s3.amazonaws.com \
  --source-arn arn:aws:s3:::amzn-s3-demo-bucket \
  --source-account 123456789012
```

# 向组织授予函数访问权限
<a name="permissions-function-organization"></a>

要向 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 中的组织授予权限，请将组织 ID 指定为 `principal-org-id`。以下 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令向组织 `o-a1b2c3d4e5f` 中的所有用户授予调用访问权限。

```
aws lambda add-permission \
  --function-name example \
  --statement-id PrincipalOrgIDExample \
  --action lambda:InvokeFunction \
  --principal * \
  --principal-org-id o-a1b2c3d4e5f
```

**注意**  
在此命令中，`Principal` 为 `*`。这意味着组织 `o-a1b2c3d4e5f` 中的所有用户都获得了函数调用权限。如果您将某个 AWS 账户 或角色指定为 `Principal`，则只有该主体会获得函数调用权限，但前提是他们也是 `o-a1b2c3d4e5f` 组织的成员。

此命令会创建一个基于资源的策略，如下所示：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "PrincipalOrgIDExample",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-2:123456789012:function:example",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-a1b2c3d4e5f"
                }
            }
        }
    ]
}
```

------

有关更多信息，请参阅《IAM 用户指南》**中的 [aws:PrincipalOrgID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid)。

# 向其他账户授予 Lambda 函数访问权限
<a name="permissions-function-cross-account"></a>

要与其他 AWS 账户 共享函数，请在该函数的[基于资源的策略](access-control-resource-based.md)中添加跨账户权限语句。执行 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令，并将账户 ID 指定为 `principal`。以下示例向账户 `111122223333` 授权以 `my-function` 别名调用 `prod`。

```
aws lambda add-permission \
  --function-name my-function:prod \
  --statement-id xaccount \
  --action lambda:InvokeFunction \
  --principal 111122223333 \
  --output text
```

您应看到以下输出：

```
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-1:123456789012:function:my-function"}
```

基于资源的策略向另一个账户授予访问此函数的权限，但不允许该账户中的用户超出其权限。另一个账户中的用户必须具有相应的[用户权限](access-control-identity-based.md)才能使用 Lambda API。

要限制对另一个账户中用户或角色的访问，请将身份的完整 ARN 指定为主体。例如：`arn:aws:iam::123456789012:user/developer`。

[别名](configuration-aliases.md)限制了其他账户可以调用哪个版本。它要求另一个账户在函数 ARN 中包括该别名。

```
aws lambda invoke \
  --function-name arn:aws:lambda:us-east-2:123456789012:function:my-function:prod out
```

您应看到以下输出：

```
{
    "StatusCode": 200,
    "ExecutedVersion": "1"
}
```

然后，函数所有者可以更新别名以指向新版本，而无需调用者更改他们调用函数的方式。这可以确保另一个账户不需要更改其代码即可使用新版本，并且它只具有调用与别名关联的函数版本的权限。

您可以授予对作用于现有函数的大多数 API 操作的跨账户访问权。例如，您可以授予 `lambda:ListAliases` 权限，以允许一个账户获得别名列表，或授予 `lambda:GetFunction` 权限，以让它们下载您的函数代码。分别添加每个权限，或使用 `lambda:*` 授予有关指定函数的所有操作的权限。

要授予其他账户对多个函数的权限，或不对某个函数执行的操作的权限，请使用 [IAM 角色](access-control-identity-based.md)。

# 向其他账户授予 Lambda 层访问权限
<a name="permissions-layer-cross-account"></a>

要与其他 AWS 账户 共享层，请在该层的[基于资源的策略](access-control-resource-based.md)中添加跨账户权限语句。执行 [add-layer-version-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-layer-version-permission.html) 命令，并将账户 ID 指定为 `principal`。在每个语句中，您可以向 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 中的单个账户、所有账户或组织授予权限。

以下示例向账户 111122223333 授予访问 `bash-runtime` 层版本 2 的权限。

```
aws lambda add-layer-version-permission \
  --layer-name bash-runtime \
  --version-number 2 \  
  --statement-id xaccount \
  --action lambda:GetLayerVersion \
  --principal 111122223333 \
  --output text
```

您应该可以看到类似于如下所示的输出内容：

```
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}
```

权限仅适用于单个层版本。每次创建新的层版本时都需重复此过程。

要向 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 组织中的所有账户授予权限，请使用 `organization-id` 选项。以下示例授予组织 `o-t194hfs8cz` 中的所有账户使用 `my-layer` 版本 3 的权限。

```
aws lambda add-layer-version-permission \
  --layer-name my-layer \
  --version-number 3 \
  --statement-id engineering-org \
  --principal '*' \
  --action lambda:GetLayerVersion \
  --organization-id o-t194hfs8cz \
  --output text
```

您应看到以下输出：

```
{"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"
```

要向多个账户或组织授予权限，您必须添加多个语句。

# 在 Lambda 中使用基于属性的访问控制
<a name="attribute-based-access-control"></a>

借助[基于属性的访问权限控制（ABAC）](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)，您可以使用标签来控制对 Lambda 资源的访问。您可以将标签附加到某些 Lambda 资源，附加到某些 API 请求，或附加到发出请求的 AWS Identity and Access Management（IAM）主体。有关 AWS 如何授予基于属性的访问权限的更多信息，请参阅《*IAM 用户指南*》中的[使用标签控制对 AWS 资源的访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)。

您可以使用 ABAC [授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)，而无需在 IAM policy 中指定 Amazon 资源名称 (ARN) 或 ARN 模式。相反，您可以在 IAM policy 的[条件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中指定一个标签来控制访问。使用 ABAC 可以更轻松地进行扩展，因为您无需在创建新资源时更新 IAM 策略。相反，将标签添加到新资源即可控制访问权限。

在 Lambda 中，标签可用于以下资源：
+ 函数 – 有关标记函数的更多信息，请参阅[在 Lambda 函数上使用标签](configuration-tags.md)。
+ 代码签名配置 – 有关标记代码签名配置的更多信息，请参阅[在代码签名配置上使用标签](tags-csc.md)。
+ 事件源映射 – 有关标记事件源映射的更多信息，请参阅[在事件源映射上使用标签](tags-esm.md)。

层不支持标签。

可以使用以下条件键根据标签编写 IAM 策略规则：
+ [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag)：根据附加到 Lambda 资源的标签控制访问权限。
+ [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)：要求请求中存在标签，例如在创建新函数时。
+ [aws:PrincipalTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag)：根据附加到其 IAM [用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_users.html)或[角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_roles.html)的标签，控制允许 IAM 主体（发出请求的人）执行的操作。
+  [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys)：控制是否可以在请求中使用特定的标签键。

 只能为支持这些条件的操作指定条件。有关各 Lambda 操作支持的条件列表，请参阅《Service Authorization Reference》中的 [Actions, resources, and condition keys for AWS Lambda](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awslambda.html)。有关 **aws:ResourceTag/tag-key** 支持，请参阅该文档中的“Resource types defined by AWS Lambda”。有关 **aws:RequestTag/tag-key** 和 **aws:TagKeys** 支持，同样请参阅该文档中的“Actions defined by AWS Lambda”。

**Topics**
+ [

# 通过标签保护函数
](attribute-based-access-control-example.md)

# 通过标签保护函数
<a name="attribute-based-access-control-example"></a>

以下步骤演示了一种使用 ABAC 设置函数权限的方法。在此示例方案中，您将创建四个 IAM 权限策略。然后，您会将这些策略附加到新的 IAM 角色。最后，您将创建一个 IAM 用户并授予该用户担任新角色的权限。

**Topics**
+ [

## 先决条件
](#abac-prerequisites)
+ [

## 步骤 1：要求新函数具有标签
](#require-tag-on-create)
+ [

## 步骤 2：允许基于附加到 Lambda 函数和 IAM 主体的标签执行操作
](#restrict-actions-function-tags)
+ [

## 步骤 3：授予列表权限
](#abac-list-permissions)
+ [

## 步骤 4：授予 IAM 权限
](#abac-iam-permissions)
+ [

## 步骤 5：创建 IAM 角色
](#abac-create-role)
+ [

## 步骤 6：创建 IAM 用户
](#abac-create-user)
+ [

## 步骤 7：测试权限
](#abac-test)
+ [

## 步骤 8：清理资源
](#abac-clean-up)

## 先决条件
<a name="abac-prerequisites"></a>

确保您具有 [Lambda 执行角色](lambda-intro-execution-role.md)。当您授予 IAM 权限和创建 Lambda 函数时，您将使用此角色。

## 步骤 1：要求新函数具有标签
<a name="require-tag-on-create"></a>

当将 ABAC 与 Lambda 配合使用时，最佳做法是要求所有函数都具有标签。这有助于确保您的 ABAC 权限策略按预期工作。

[创建类似于以下示例的 IAM policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)。此策略使用 [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)、[aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 和 [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) 条件键来要求新函数和创建函数的 IAM 主体都具有 `project` 标签。`ForAllValues` 修饰符确保 `project` 是唯一允许的标签。如果您未包括 `ForAllValues` 修饰符，则用户可以将其他标签添加到函数中，只要它们也传递 `project`。

**Example – 要求新函数具有标签**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:TagResource"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/project": "${aws:PrincipalTag/project}",
          "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": "project"
        }
      }
    }
  }
```

## 步骤 2：允许基于附加到 Lambda 函数和 IAM 主体的标签执行操作
<a name="restrict-actions-function-tags"></a>

使用 [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 条件键创建第二个 IAM policy，以要求主体的标签与附加到函数的标签匹配。以下示例策略允许具有 `project` 标签的委托人调用具有 `project` 标签的函数。如果函数具有任何其他标签，则该操作将被拒绝。

**Example – 要求函数和 IAM 主体的标签匹配**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lambda:InvokeFunction",
          "lambda:GetFunction"
        ],
        "Resource": "arn:aws:lambda:*:*:function:*",
        "Condition": {
          "StringEquals": {
            "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
          }
        }
      }
    ]
  }
```

## 步骤 3：授予列表权限
<a name="abac-list-permissions"></a>

创建允许主体列出 Lambda 函数和 IAM 角色的策略。这样，主体就可以在控制台上以及调用 API 操作时查看所有 Lambda 函数和 IAM 角色。

**Example – 授予 Lambda 和 IAM 列表权限**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "AllResourcesLambdaNoTags",
        "Effect": "Allow",
        "Action": [
          "lambda:GetAccountSettings",
          "lambda:ListFunctions",
          "iam:ListRoles"
        ],
        "Resource": "*"
      }
    ]
  }
```

## 步骤 4：授予 IAM 权限
<a name="abac-iam-permissions"></a>

创建允许 **iam:PassRole** 的策略。当您将执行角色分配给函数时，需要此权限。在以下示例策略中，将示例 ARN 替换为 Lambda 执行角色的 ARN。

**注意**  
不要在策略中将 `ResourceTag` 条件键与 `iam:PassRole` 操作一起使用。您无法在 IAM 角色上使用标签以控制可以传递该角色的用户的访问权限。有关将角色传递给服务所需权限的更多信息，请参阅[授予用户将角色传递给 AWS 服务的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

**Example – 授予传递执行角色的权限**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": "arn:aws:iam::111122223333:role/lambda-ex"
      }
    ]
  }
```

## 步骤 5：创建 IAM 角色
<a name="abac-create-role"></a>

[使用角色委托权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#delegate-using-roles)是最佳实践。[创建名为 `abac-project-role` 的 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)：
+ 在**步骤 1：选择可信实体**中：选择 **AWS 账户**，然后选择**此账户**。
+ 在**步骤 2：添加权限**上：附加您在前面的步骤中创建的四个 IAM policy。
+ 在**步骤 3：命名、查看和创建**上：选择 **Add tag**（添加标签）。对于**键**，输入 `project`。不要输入 **Value**（值）。

## 步骤 6：创建 IAM 用户
<a name="abac-create-user"></a>

[创建名为 `abac-test-user` 的 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。在 **Set permissions**（设置权限）部分中，选择 **Attach existing policies directly**（直接附加现有策略），然后选择 **Create policy**（创建策略）。输入以下策略定义。将 *111122223333* 替换为您的 [AWS 账户 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html#FindingYourAccountIdentifiers)。此策略允许 `abac-test-user` 担任 `abac-project-role`。

**Example – 允许 IAM 用户担任 ABAC 角色**  

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::111122223333:role/abac-project-role"
    }
  }
```

------

## 步骤 7：测试权限
<a name="abac-test"></a>

1. 以 `abac-test-user` 身份登录到 AWS 控制台。有关更多信息，请参阅[作为 IAM 用户登录](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html#user-sign-in-page)。

1. 切换到 `abac-project-role` 角色。有关更多信息，请参阅[切换到角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)。

1. [创建 Lambda 函数](configuration-tags.md#using-tags-with-the-console)：
   + 在 **Permissions**（权限）下，选择 **Change default execution role**（更改默认执行角色），然后对于 **Execution role**（执行角色），选择 **Use an existing role**（使用现有角色）。选择您在 [步骤 4：授予 IAM 权限](#abac-iam-permissions) 中使用的相同执行角色。
   + 在 **Advanced settings**（高级设置）下，选择 **Enable tags**（启用标签），然后选择 **Add new tag**（添加新标签）。对于**键**，输入 `project`。不要输入 **Value**（值）。

1. [测试函数](testing-functions.md)。

1. 创建第二个 Lambda 函数并添加其他标签，例如 `environment`。此操作应会失败，因为您在 [步骤 1：要求新函数具有标签](#require-tag-on-create) 中创建的 ABAC 策略仅允许主体创建具有 `project` 标签的函数。

1. 创建第三个没有标签的函数。此操作应会失败，因为您在 [步骤 1：要求新函数具有标签](#require-tag-on-create) 中创建的 ABAC 策略不允许主体创建没有标签的函数。

此授权策略允许您控制访问权限，而无需为每个新用户创建新的策略。要向新用户授予访问权限，只需授予他们担任与其所分配项目相对应的角色的权限。

## 步骤 8：清理资源
<a name="abac-clean-up"></a>

**要删除 IAM 角色**

1. 打开 IAM 控制台的[角色页面](https://console.aws.amazon.com/iam/home#/roles)。

1. 选择您在[步骤 5](#abac-create-role) 中创建的角色。

1. 选择**删除**。

1. 要确认删除，在文本输入字段中输入角色名称。

1. 选择**删除**。

**删除 IAM 用户**

1. 打开 IAM 控制台的[用户页面](https://console.aws.amazon.com/iam/home#/users)。

1. 选择您在[步骤 6](#abac-create-user) 中创建的 IAM 用户。

1. 选择**删除**。

1. 要确认删除，在文本输入字段中输入用户名。

1. 选择**删除用户**。

**删除 Lambda 函数**

1. 打开 Lamba 控制台的 [Functions（函数）页面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 选择您创建的函数。

1. 依次选择**操作**和**删除**。

1. 在文本输入字段中键入 **confirm**，然后选择 **Delete**（删除）。

# 微调策略的“资源和条件”部分
<a name="lambda-api-permissions-ref"></a>

您可以通过在 AWS Identity and Access Management (IAM) 策略中指定资源和条件来限制用户权限的范围。策略中的每个操作都支持资源和条件类型的组合，这些类型根据操作的行为而有所不同。

每条 IAM 策略语句为对一个资源执行的一个操作授予权限。如果操作不对指定资源执行操作，或者您授予对所有资源执行操作的权限，则策略中资源的值为通配符（`*`）。对于许多操作，可以通过指定资源的 Amazon 资源名称（ARN）或与多个资源匹配的 ARN 模式来限制用户可修改的资源。

按资源类型划分，限制操作范围的一般设计如下：
+ 函数 – 对函数进行的操作可以通过函数、版本或别名 ARN 限制到特定函数上。
+ 事件源映射 – 可以通过 ARN 将操作限制到特定的事件源映射资源上。事件源映射始终与函数相关联，所以也可以使用 `lambda:FunctionArn` 条件来限制关联函数的操作。
+ 层 – 与层使用和权限相关的操作作用于层的版本。
+ 代码签名配置 – 可以通过 ARN 将操作限制到特定的代码签名配置资源上。
+ 标签 – 使用标准标签条件。有关更多信息，请参阅 [在 Lambda 中使用基于属性的访问控制](attribute-based-access-control.md)。

要按资源限制权限，请指定资源的 ARN。

**Lambda 资源 ARN 格式**
+ 函数 – `arn:aws:lambda:us-west-2:123456789012:function:my-function`
+ 函数版本 – `arn:aws:lambda:us-west-2:123456789012:function:my-function:1`
+ 函数别名 – `arn:aws:lambda:us-west-2:123456789012:function:my-function:TEST`
+ 事件源映射 – `arn:aws:lambda:us-west-2:123456789012:event-source-mapping:fa123456-14a1-4fd2-9fec-83de64ad683de6d47`
+ 层 – `arn:aws:lambda:us-west-2:123456789012:layer:my-layer`
+ 层版本 – `arn:aws:lambda:us-west-2:123456789012:layer:my-layer:1`
+ 代码签名配置 – `arn:aws:lambda:us-west-2:123456789012:code-signing-config:my-csc`

例如，以下策略允许 AWS 账户 `123456789012` 中的用户调用美国西部（俄勒冈）AWS 区域中名为 `my-function` 的函数。

**Example 调用函数策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Invoke",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function"
        }
    ]
}
```

这是一种特殊情形，其中，操作标识符 (`lambda:InvokeFunction`) 不同于 API 操作 ([Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html))。对于其他操作，操作标识符为操作名称加上 `lambda:` 前缀。

**Topics**
+ [

## 了解策略中的“条件”部分
](#authorization-conditions)
+ [

## 在策略的“资源”部分中引用函数
](#function-resources)
+ [

## 支持的 IAM 操作及函数行为
](#permissions-resources)

## 了解策略中的“条件”部分
<a name="authorization-conditions"></a>

条件是可选的策略元素，它应用其他逻辑来确定是否允许执行操作。除了所有操作支持的公用[条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)之外，Lambda 定义了一些条件类型，您可以用来限制某些操作的额外参数的值。

例如，`lambda:Principal` 条件允许您限制用户可以根据函数的[基于资源的策略](access-control-resource-based.md)授予调用访问权限的服务或账户。以下策略允许用户授予对 Amazon Simple Notification Service (Amazon SNS) 主题的权限，以调用名为 `test` 的函数。

**Example 管理函数策略权限**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ManageFunctionPolicy",
            "Effect": "Allow",
            "Action": [
                "lambda:AddPermission",
                "lambda:RemovePermission"
            ],
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:test:*",
            "Condition": {
                "StringEquals": {
                    "lambda:Principal": "sns.amazonaws.com"
                }
            }
        }
    ]
}
```

该条件要求委托人是 Amazon SNS 而不是其他服务或账户。资源模式要求函数名称为 `test` 并包含版本号或别名。例如 `test:v1`。

有关 Lambda 和其他 AWS 服务的资源和条件的更多信息，请参阅*服务授权参考*中的 [AWS 服务的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)。

## 在策略的“资源”部分中引用函数
<a name="function-resources"></a>

您可以使用 Amazon Resource Name（ARN）在策略语句中引用 Lambda 函数。函数 ARN 的格式取决于您是要引用整个函数（无限定）、某个函数[版本](configuration-versions.md)，还是[别名](configuration-aliases.md)（限定）。

调用 Lambda API 时，用户可以通过在 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) `FunctionName` 参数中传递版本 ARN 或别名 ARN，或者通过在 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) `Qualifier` 参数中设置值，来指定一个版本或别名。Lambda 通过比较 IAM 策略中的资源元素与在 API 调用中传递的 `FunctionName` 和 `Qualifier` 来做出授权决策。如果不匹配，Lambda 会拒绝该请求。

无论您是允许还是拒绝某个函数操作，都必须在策略声明中使用正确的函数 ARN 类型才能获得预期的结果。例如，假设您的策略引用了非限定 ARN，Lambda 会接受引用非限定 ARN 的请求，但拒绝引用限定 ARN 的请求。

**注意**  
不能使用通配符 (\$1) 匹配账户 ID。有关接受的语法的更多信息，请参阅《*IAM 用户指南*》中的 [IAM JSON 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

**Example 允许调用非限定 ARN**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction"
        }
    ]
}
```

如果您的策略引用了特定的限定 ARN，Lambda 会接受引用该 ARN 的请求，但拒绝引用非限定 ARN 的请求（例如 `myFunction:2`）。

**Example 允许调用特定的限定 ARN**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:1"
        }
    ]
}
```

如果您的策略引用了任何限定 ARN`:*`，Lambda 会接受任何限定 ARN，但拒绝引用非限定 ARN 的请求。

**Example 允许调用任何限定 ARN**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:*"
        }
    ]
}
```

如果您的策略引用了任何使用 `*` 的 ARN，Lambda 会接受任何限定或非限定 ARN。

**Example 允许调用任何限定或非限定 ARN**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction*"
        }
    ]
}
```

## 支持的 IAM 操作及函数行为
<a name="permissions-resources"></a>

 操作定义了可通过 IAM 策略允许的内容。有关 Lambda 中支持的操作列表，请参阅《Service Authorization Reference》中的 [Actions, resources, and condition keys for AWS Lambda](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awslambda.html)。在大多数情况下，如果 IAM 操作允许 Lambda API 操作，则 IAM 操作的名称与 Lambda API 操作的名称相同，但以下情况除外：


| API 操作 | IAM 操作 | 
| --- | --- | 
| [Invoke](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) | lambda:InvokeFunction | 
| [GetLayerVersion](https://docs.aws.amazon.com//lambda/latest/api/API_GetLayerVersion.html) [GetLayerVersionByArn](https://docs.aws.amazon.com//lambda/latest/api/API_GetLayerVersionByArn.html) | lambda:GetLayerVersion | 

除了[《Service Authorization Reference》](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslambda.html)中定义的资源和条件，Lambda 还支持某些操作的以下资源和条件。其中许多资源和条件与策略“资源”部分中的引用函数有关。对函数进行的操作可以通过函数、版本或别名 ARN 限制为特定函数，如下表中所述。


| Action | 资源 | Condition | 
| --- | --- | --- | 
|  [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html) [RemovePermission](https://docs.aws.amazon.com/lambda/latest/api/API_RemovePermission.html) [调用](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)（**权限：**`lambda:InvokeFunction`）  |  函数版本  函数别名  |  不适用  | 
|  [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)  |  不适用  |  `lambda:CodeSigningConfigArn`  | 
|  [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html) [DeleteFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionUrlConfig.html) [GetFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionUrlConfig.html) [UpdateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionUrlConfig.html)  |  函数别名  |  不适用  | 