Lambda 操作的资源和条件 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Lambda 操作的资源和条件

您可以通过在 IAM 策略中指定资源和条件来限制用户权限的范围。每个 API 操作都支持资源和条件类型的组合,这些类型根据操作的行为而有所不同。

每条 IAM 策略语句为对一个资源执行的一个操作授予权限。如果操作不对指定资源执行操作,或者您授予对所有资源执行操作的权限,则策略中资源的值为通配符 (*)。对于许多 API 操作,可以通过指定资源的 Amazon 资源名称 (ARN) 或与多个资源匹配的 ARN 模式来限制用户可修改的资源。

要按资源限制权限,请指定资源的 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

例如,以下策略允许 123456789012 账户中的用户调用 美国西部(俄勒冈) 区域中名为 my-function 的函数。

例 调用函数策略

{ "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)。对于其他操作,操作标识符为操作名称加上 lambda: 前缀。

条件是可选的策略元素,它应用其他逻辑来确定是否允许执行操作。除了所有操作支持的公用条件之外,Lambda 定义了一些条件类型,您可以用来限制某些操作的额外参数的值。

例如,lambda:Principal 条件允许您限制用户可以在函数的基于资源的策略上为其授予调用权限的服务或账户。以下策略允许用户授予对 SNS 主题的权限,以调用名为 test 的函数。

例 管理函数策略权限

{ "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 服务的资源和条件的更多信息,请参阅 IAM 用户指南 中的操作、资源和条件键

函数资源名称

您可以使用 Amazon 资源名称 (ARN) 在策略语句中引用 Lambda 函数。函数 ARN 的格式取决于您是要引用整个函数、函数版本,还是别名

调用 Lambda API 时,用户可以通过在 FunctionName 参数中传递版本 ARN 或别名 ARN 或在 Qualifier 参数中设置值来指定版本或别名。Lambda 通过将 IAM 策略中的资源元素与 API 调用中传递的 FunctionName 进行比较来做出授权决策。

您必须在策略中使用正确的函数 ARN 类型才能获得预期的结果,尤其是在拒绝访问的策略中。我们建议您遵循对函数使用 Deny 语句的最佳实践。

对函数使用 Deny 语句的最佳实践

下表汇总了要在“Deny”效果中使用的资源。在资源列中,MyFunction 是函数的名称,:1 表示函数的版本 1,MyAlias 是函数别名的名称。

资源最佳实践
策略目标 资源

拒绝访问函数的所有版本

MyFunction*

拒绝访问特定别名

MyFunction:MyAliasMyFunction

拒绝访问函数的特定版本

MyFunction:1MyFunction

以下几节将提供每个策略目标的示例策略语句。

注意

您只能使用基于身份的策略来拒绝特定的函数资源。目前,Lambda 在基于资源的策略中不支持 Deny 效果。

对于策略语句中的操作列表,您可以添加由 Lambda 定义的对函数资源执行的任何操作。

拒绝访问所有函数版本

以下基于身份的策略语句会拒绝访问 my-function 函数的所有版本的 lambda:GetFunctionConfiguration 操作。函数 ARN 末尾的通配符可确保此策略应用于所有版本和别名 ARN。

例 基于身份的策略示例

{ "Version": "2020-07-20", "Statement": [ { "Effect": "Deny", "Action": [ "lambda:GetFunctionConfiguration" ], "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function*" } ] }

拒绝访问特定函数别名

要拒绝访问特定别名,必须在策略中同时指定别名 ARN 和非限定函数 ARN。这样可以防止用户通过传递非限定 ARN 作为 FunctionName、传递别名作为 Qualifier 来访问特定的别名。

注意

如果您创建此类型的策略,API 调用需要通过在 FunctionName 参数中指定带有 $REST 后缀的限定 ARN 来引用函数的未发布版本。

以下基于身份的策略语句会拒绝访问 my-function 函数的 my-alias 别名中的 lambda:InvokeFunction 操作。

例 基于身份的策略示例

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenySpecificAlias", "Effect": "Deny", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-west-2:123456789012:function:my-function:my-alias", "arn:aws:lambda:us-west-2:123456789012:function:my-function" ] } ] }

拒绝访问特定函数版本

要拒绝访问特定版本,必须在策略中同时指定限定 ARN 和非限定 ARN。这样可以防止用户通过传递非限定 ARN 作为 FunctionName、传递版本作为 Qualifier 来访问特定的版本。

注意

如果您创建此类型的策略,API 调用需要通过在 FunctionName 参数中指定带有 $REST 后缀的限定 ARN 来引用函数的未发布版本。

以下基于身份的策略语句会拒绝访问 my-function 函数的版本 1 中的调用操作。

例 基于身份的策略示例

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenySpecificFunctionVersion", "Effect": "Deny", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:us-west-2:123456789012:function:my-function:1", "arn:aws:lambda:us-west-2:123456789012:function:my-function" ] } ] }

函数

对函数进行的操作可以通过函数、版本或别名 ARN 限制为特定函数,如下表中所述。只能为所有资源 (*) 授予不支持资源限制的操作。

函数
操作 资源 Condition

AddPermission

RemovePermission

Function

函数版本

函数别名

lambda:Principal

Invoke

权限:lambda:InvokeFunction

函数

函数版本

函数别名

CreateFunction

UpdateFunctionConfiguration

函数

lambda:Layer

lambda:VpcIds

lambda:SubnetIds

lambda:SecurityGroupIds

CreateAlias

DeleteAlias

DeleteFunction

DeleteFunctionConcurrency

GetAlias

GetFunction

GetFunctionConfiguration

GetPolicy

ListAliases

ListVersionsByFunction

PublishVersion

PutFunctionConcurrency

UpdateAlias

UpdateFunctionCode

Function

GetAccountSettings

ListFunctions

ListTags

TagResource

UntagResource

*

事件源映射

对于事件源映射,可以将删除和更新权限限制为特定事件源。lambda:FunctionArn 条件允许您限制用户可配置事件源以调用的函数。

对于这些操作,资源是事件源映射,因此 Lambda 提供了一个条件,允许您根据事件源映射调用的函数来限制权限。

事件源映射
操作 资源 Condition

DeleteEventSourceMapping

UpdateEventSourceMapping

事件源映射

lambda:FunctionArn

CreateEventSourceMapping

*

lambda:FunctionArn

GetEventSourceMapping

ListEventSourceMappings

*

通过层操作,您可以限制用户可通过函数管理或使用的层。与层使用和权限相关的操作作用于层的版本,而 PublishLayerVersion 作用于层名称。两者都可以与通配符一起使用,以通过名称限制用户可以使用的层。

注意

注意:GetLayerVersion 操作还涵盖 GetLayerVersionByArn。Lambda 不支持 GetLayerVersionByArn 作为 IAM 操作。