

# 使用源函数 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` 运算符。