

# 向其他 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)  |  函数别名  |  不适用  | 