LakeFormation SDK返回资源权限含ALL但撤销时报错的问题
AWS LakeFormation 权限列表返回ALL但无法删除的问题分析
问题表现
跨SDK调用LakeFormation接口时存在一致的异常表现:
- 无论是通过AWS CLI调用boto3、还是通过Terraform调用Go SDK拉取的资源权限分配列表,返回结果中都会包含
ALL权限 - 尝试执行撤销权限操作时,无论调用CLI还是Terraform的撤销逻辑,都会触发报错:
An error occurred (InvalidInputException) when calling the RevokePermissions operation: No permissions revoked. Grantee does not have:[ALL] - 典型的接口返回结果片段:
"PrincipalResourcePermissions": [ { "Principal": { "DataLakePrincipalIdentifier": "arn:aws:iam::ACCOUNT:role/FooRole" }, "Resource": { "Table": { "CatalogId": "ACCOUNT", "DatabaseName": "lf_test", "Name": "foo" } }, "Permissions": [ "ALL", "DESCRIBE" ], "PermissionsWithGrantOption": [] } ]
问题根本原因
这个问题不是权限配置错误,是LakeFormation接口的固有设计错位导致的:
- 服务端的权限存储层从来不会单独留存
ALL类型的权限条目,ALL本质是查询接口生成的虚拟展示值。当某一主体被授予的细分权限刚好覆盖了当前资源下所有可操作的权限全集时,接口在返回结果时会自动聚合生成ALL条目,同时保留你实际单独授予的细分权限(比如示例中的DESCRIBE)。 - 因为
ALL从来没有被真实写入权限策略,你尝试对这个虚拟值发起撤销请求时,服务端会校验真实存储的权限记录,找不到对应的ALL条目,就会抛出“被授予者不具备[ALL]权限”的报错。 - 这个聚合展示逻辑最早是为了简化控制台的权限视图设计,后续被直接同步到了所有SDK的查询接口中,但对应的撤销接口并没有做匹配的兼容处理,最终形成了“查询接口能查到,但撤销接口删不掉”的异常状态。
可落地的修复方案
不需要通过硬编码的特殊逻辑忽略ALL权限,可通过以下方式从根源解决问题:
- 权限操作匹配真实存储的细分权限
发起撤销请求时,跳过查询结果中虚拟的ALL条目,只针对结果中实际存在的细分权限发起撤销。这些细分权限是真实存储在权限策略中的,操作会正常生效;当所有细分权限都被撤销后,自动聚合生成的ALL展示项也会随之消失。 - 升级Terraform依赖版本
AWS官方Terraform Provider从v5.0版本开始,已经针对这个LakeFormation的返回错位问题做了内置适配,会自动过滤查询结果中的虚拟ALL条目,解决状态校验失败的问题。如果是使用旧版本Provider遇到的该问题,升级到对应版本即可,无需额外写自定义逻辑。 - 控制台辅助清理
遇到SDK/CLI操作权限卡顿时,可以直接打开LakeFormation控制台的对应资源权限页面,选中对应主体的权限条目点击移除,控制台会自动匹配真实存储的权限条目完成删除,不会因为虚拟ALL条目触发校验报错。
内容的提问来源于stack exchange,提问作者wrschneider
相关产品推荐
相关产品推荐

