

# 微调策略的“资源和条件”部分
<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)  |  函数别名  |  不适用  | 