S3桶策略限制Lambda访问失效,两个Lambda均可访问问题咨询
问题原因与解决方法
问题原因
- 存储桶策略资源匹配错误:你的存储桶实际名称是
x-temp-images,但策略中Resource字段写的是arn:aws:s3:::x-temp-images-bucket/*,桶名不匹配导致这条Deny规则完全不会作用在目标存储桶上。 - Principal主体设置错误:你把Principal设为
lambda.amazonaws.com(Lambda服务),但Lambda调用S3时,实际发起请求的身份是Lambda的执行角色ARN,而非Lambda服务本身。这条规则根本匹配不到真实的请求主体,自然无法生效。 - 权限优先级逻辑:你给两个Lambda的执行角色都配置了全S3访问权限(Allow规则),而无效的Deny规则无法覆盖Allow,所以两个Lambda都能正常访问存储桶。
解决方法
修正存储桶策略,针对正确的存储桶和请求主体配置生效的Deny规则:
修正后的策略示例
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyNonAllowedLambdaAccess", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::x-temp-images/*", "Condition": { "StringNotEquals": { "aws:SourceArn": "<允许访问的Lambda函数ARN>" }, "StringEquals": { "aws:PrincipalService": "lambda.amazonaws.com" } } } ] }
关键修正点说明
- 修正
Resource中的桶名,确保和实际存储桶x-temp-images一致; - 使用
Principal: "*"匹配所有请求主体,再通过Condition筛选出Lambda服务发起的请求(aws:PrincipalService); - 通过
aws:SourceArn指定唯一允许访问的Lambda函数ARN,这样除了该Lambda之外,其他Lambda发起的GetObject请求都会被Deny; - AWS权限体系中Deny规则优先级高于Allow,所以即使Lambda角色有全S3权限,这条Deny规则也会生效,阻止未授权的Lambda访问。
内容的提问来源于stack exchange,提问作者Nodrex
相关产品推荐
相关产品推荐

