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

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

您的 Lambda 函数代码通常会向其他 Amazon Web Services 服务 发出 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 Web Services 服务,从设置为事件源映射的事件源进行读取。

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

注意

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

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

注意

lambda:SourceFunctionArn 条件键与 lambda:FunctionArnaws:SourceArn 条件键不同。lambda:FunctionArn 条件键仅适用于事件源映射,并帮助定义您的事件源可以调用哪些函数。aws:SourceArn 条件键仅适用于以您的 Lambda 函数为目标资源的策略,并帮助定义哪些其他 Amazon Web Services 服务 和资源可以调用该函数。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 运算符。