View a markdown version of this page

在 Lambda 中使用基于资源的策略 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

在 Lambda 中使用基于资源的策略

借助基于资源的权限策略,您可以向其他 Amazon Web Services 账户、用户、组织及 Amazon Web Services 服务授予访问您 Lambda 函数的权限。基于资源的策略是包含一条或多条语句的 JSON 文档。每条语句皆定义如下内容:

  • Principal:待授予权限的实体(其他 Amazon Web Services 服务、IAM 角色或用户,或其他 Amazon Web Services 账户)

  • Action:针对指定主体,允许或拒绝的 API 操作列表

  • Effect:是否允许或拒绝主体执行选定的 API 操作

  • Resource:该语句作用的 Lambda 函数、版本或别名(也可使用通配符,指定该函数全部版本与别名)

您还可使用可选元素,例如 Sid(语句标识符)和 Condition(用于细粒度访问控制的逻辑条件)。如需受支持策略元素的完整列表,请参阅《Amazon Identity and Access Management 用户指南》内的 IAM JSON 策略元素参考。

为 Lambda 函数添加基于资源的权限

您可通过两种方式为 Lambda 函数添加基于资源的权限:

  • 完整 JSON 策略:使用 Lambda 控制台、Amazon CLI 或 PutResourcePolicy API 操作添加完整 JSON 策略文档。使用完整 JSON 策略时,可使用全部 IAM 全局条件键,添加包含多个主体的多条语句,并创建显式 Deny 语句。基于资源的 JSON 策略最大为 20 KB。

  • 单独权限:使用控制台或 AddPermission API 操作添加单条 Allow 语句。单独权限仅支持有限的条件键(aws:SourceArn、aws:SourceAccount、aws:PrincipalOrgID)。

建议编写完整 JSON 策略,为函数添加基于资源的权限。创建完整 JSON 策略,可让您更灵活地对权限执行细粒度控制。

重要

使用 put-resource-policy 将替换该资源上所有现有的基于资源的策略。若资源已通过 add-permission 定义了权限,则 put-resource-policy 会覆盖这些权限。进行修改前,请使用 get-resource-policy 获取现有策略。

所需的权限

若要使用 PutResourcePolicy、GetResourcePolicy、DeleteResourcePolicy API 操作,您需要以下 IAM 权限:

API 操作 所需的权限
PutResourcePolicy lambda:PutResourcePolicy、lambda:AddPermission 和 lambda:RemovePermission
GetResourcePolicy lambda:GetResourcePolicy和lambda:GetPolicy
DeleteResourcePolicy lambda:DeleteResourcePolicy和lambda:RemovePermission
Console
创建基于资源的完整 JSON 策略
  1. 打开 Lamba 控制台的函数页面。

  2. 选择需授予访问权限的函数,再切换至配置选项卡。

  3. 选择权限。

  4. 在基于资源的策略语句窗格中,选择编辑。该操作会打开 JSON 策略编辑器。

  5. 向函数策略添加语句。您可选择 API 操作、添加不同类型的主体(服务、账户、IAM 角色),并添加条件键以控制访问权限。

  6. 选择保存。

您也可直接在策略窗格中,编辑函数的基于资源的策略。

Amazon CLI
添加基于资源的完整 JSON 策略

如需为函数添加完整 JSON 策略,请使用 put-resource-policyAmazon CLI 命令。

以下示例命令可读取本地计算机上 policy.json 文件内定义的策略,为函数添加基于资源的策略。在该文件所在目录执行此命令。resource-arn 可指定函数版本或别名;也可使用非限定函数 ARN,将策略作用于整个函数。

aws lambda put-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function \ --policy file://policy.json
Lambda APIs

如需为函数添加完整 JSON 权限策略,请使用 PutResourcePolicy API 操作。您还可通过 DeleteResourcePolicy 操作删除函数策略,或通过 GetResourcePolicy 操作获取当前附加到函数的策略。

如需为函数策略添加单独权限,请使用 AddPermission API 操作。

查看函数基于资源的策略

Console
查看函数的基于资源的策略
  1. 打开 Lamba 控制台的函数页面。

  2. 选择函数。

  3. 选择 Configuration (配置),然后选择 Permissions (权限)。

  4. 向下滚动至基于资源的策略语句,即可查看策略。

Amazon CLI

要查看函数的基于资源的策略,请使用 get-resource-policy 命令。您可以使用函数的非限定 ARN,也可指定版本或别名。

aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

您还可以使用 get-policy 命令:

aws lambda get-policy \ --function-name my-function \ --output text
Lambda APIs

如需获取函数的基于资源的策略,请使用 GetResourcePolicy API 操作。您可以使用函数的非限定 ARN,也可指定版本或别名 ARN。

您还可以使用 GetPolicy API 操作。

删除函数基于资源的策略

Console
删除函数基于资源的策略
  1. 打开 Lamba 控制台的函数页面。

  2. 选择需要删除权限策略的函数。

  3. 选择配置选项卡,再选择权限。

  4. 在基于资源的策略语句窗格中,选择删除。

Amazon CLI

如需删除函数策略,请使用 delete-resource-policy 命令,并指定待删除策略所在函数、版本或别名的 ARN。

aws lambda delete-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

如需删除单条语句,请使用 remove-permission。

aws lambda remove-permission \ --function-name example \ --statement-id sns
Lambda APIs

如需删除附加在函数、函数版本或函数别名上的基于资源的策略,请使用 DeleteResourcePolicy API 操作。

如需从策略中删除单条语句,请使用 RemovePermission API 操作。

更新现有策略

更新函数现有的基于资源的权限时,具体行为取决于所用方法:

  • put-resource-policy/PutResourcePolicy:替换全部现有策略。此前添加的所有单独权限均会被覆盖。

  • add-permission/AddPermission:向现有策略添加语句,不会覆盖原有内容。若在 put-resource-policy 之后调用 add-permission,新语句将附加至现有 JSON 策略。

使用 put-resource-policy 时,为防止意外覆盖现有权限,请先获取函数的现有策略。get-resource-policy 的输出包含 RevisionId 字段。

aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

附加新策略时,请通过 --revision-id 参数传入 RevisionId 值,确保更新的是最新版本。若传入旧修订版 ID,Lambda 不会更新该函数策略。

aws lambda put-resource-policy \ --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function \ --policy file://policy.json \ --revision-id a1b2c3d4-5678-90ab-cdef-EXAMPLE11111
注意

通过 AddPermission 创建的现有基于资源的策略,无需修改可持续生效。使用全新 PutResourcePolicy API,无需修改函数代码。

安全最佳实践

借助 JSON 基于资源的策略,即可遵循最低权限访问原则。您还可满足显式拒绝相关的合规监管要求。使用完整 JSON 策略,您可执行以下操作:

  • 创建显式 Deny 语句,用于阻止指定主体或条件。

  • 可使用组织条件(aws:PrincipalOrgID、aws:PrincipalOrgPaths)限制对 Organizations 的访问,无需逐个枚举账户。

  • 可使用全部 IAM 全局条件键,将权限限定至指定来源账户或 ARN。

基于资源的策略示例

例通过拒绝语句向 Amazon S3 授予权限

以下策略为账户内全部 Amazon S3 存储桶授予调用函数权限,但对其中一个存储桶显式拒绝访问。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-s3", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" } } }, { "Sid": "deny-s3-bucket", "Effect": "Deny", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-2:111122223333:function:my-function", "arn:aws:lambda:us-east-2:111122223333:function:my-function:*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket" } } } ] }
例向组织内账户授予权限

以下策略为组织内全部 Amazon Web Services 账户授予调用访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "org-access", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } } } ] }
例在附带条件的情况下向多个 IAM 角色授予权限

以下策略为两个 IAM 角色授予权限,允许其从指定 IP 地址执行 CreateAlias 操作。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-roles", "Effect": "Allow", "Action": "lambda:CreateAlias", "Principal": { "AWS": [ "arn:aws:iam::444455556666:role/role-name", "arn:aws:iam::444455556666:role/role-name2" ] }, "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "IpAddress": { "aws:SourceIp": "192.0.2.0" } } } ] }
例除非调用方属于指定组织,否则拒绝访问
{ "Version": "2012-10-17", "Statement": [ { "Sid": "deny-access", "Effect": "Deny", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" ] } } }, { "Sid": "allow-access", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "ForAnyValue:StringLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" ] } } } ] }

支持的 API 操作

以下 Lambda API 操作支持基于资源的策略: