使用源函数 ARN 控制函数访问行为 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用源函数 ARN 控制函数访问行为

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

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

服务 操作 Reason
CloudWatch Logs CreateLogGroup, CreateLogStream, PutLogEvents

将日志存储到 CloudWatch Logs 日志组

X-Ray PutTraceSegments

将跟踪数据发送到 X-Ray

Amazon EFS ClientMount

将函数连接到 Amazon Elastic File System(Amazon EFS)文件系统

使用相同执行角色在执行环境之外代表您进行的其他 Amazon API 调用不包含源函数 ARN。执行环境之外的此类 API 调用示例包括:

  • 调用 Amazon Key Management Service (Amazon KMS) 以自动加密和解密您的环境变量。

  • 调用 Amazon Elastic Compute Cloud(Amazon EC2),为启用 VPC 的函数创建弹性网络接口(ENI)。

  • 调用 Amazon Simple Queue Service(Amazon SQS)等 Amazon 服务,从设置为事件源映射的事件源进行读取。

使用凭证上下文中的源函数 ARN,您可以验证对您的资源的调用是否来自特定 Lambda 函数的代码。要对此进行验证,请在 IAM 基于身份的策略或服务控制策略(SCP)中使用 lambda:SourceFunctionArn 条件键。

注意

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

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

注意

lambda:SourceFunctionArn 条件键与 lambda:FunctionArnaws:SourceArn 条件键不同。lambda:FunctionArn 条件键仅适用于事件源映射,并帮助定义您的事件源可以调用哪些函数。aws:SourceArn 条件键仅适用于以您的 Lambda 函数为目标资源的策略,并帮助定义哪些其他 Amazon 服务和资源可以调用该函数。lambda:SourceFunctionArn 条件键可应用于任何基于身份的策略或 SCP,以定义有权对其他资源进行特定 Amazon API 调用的特定 Lambda 函数。

要在您的策略中使用 lambda:SourceFunctionArn,请将其作为条件包含在任何 ARN 条件运算符中。密钥的值必须是有效的 ARN。

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

例 授予特定 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 对此进行了说明。

例 在特定条件下拒绝访问 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 运算符。