Lambda配置S3全权限调用PutPublicAccessBlock报AccessDenied
问题描述
尝试对自身账号内的S3存储桶执行PutPublicAccessBlock操作,代码示例如下:
s3Client.put_public_access_block( Bucket= name, PublicAccessBlockConfiguration={ 'BlockPublicAcls': True, 'IgnorePublicAcls': True, 'BlockPublicPolicy': True, 'RestrictPublicBuckets': True })
执行操作的Lambda已附加AmazonS3FullAccess权限策略,调用时返回Access Denied错误,无法成功执行上述操作。
故障原因
IAM权限评估遵循「显式拒绝优先级最高、最终权限取所有关联策略交集」的逻辑,即使绑定了AmazonS3FullAccess全权限策略,出现AccessDenied通常是以下原因导致:
- 存在显式拒绝规则:目标存储桶的桶策略、Lambda执行角色绑定的权限边界、账号所属AWS Organizations配置的服务控制策略(SCP)中,只要存在任意一条显式拒绝当前角色执行
s3:PutBucketPublicAccessBlock操作的语句,就会直接拦截请求,不受身份策略的允许规则影响。 - 组织级强制管控拦截:如果账号归属AWS Organizations,管理员在组织/组织单元(OU)层级开启了强制S3公共访问阻止配置,且禁止成员账号自行修改公共访问块参数,那么账号内所有身份(包括根用户)都无法调整桶级/账号级公共访问块配置,调用接口直接返回权限拒绝。
- 存储桶归属校验失败:如果目标存储桶实际属于其他AWS账号,或是调用时指定的区域错误匹配到其他账号的同名桶,即使自身账号给了S3全权限,在未获得跨账号授权的情况下也会被拒绝。
- 权限策略生效延迟:如果是刚给Lambda角色附加AmazonS3FullAccess策略就立刻触发调用,IAM权限可能存在数秒到数十秒的生效延迟,延迟窗口期内调用也可能返回权限错误。
内容的提问来源于stack exchange,提问作者shane
相关产品推荐
相关产品推荐

