使用Terraform部署LakeFormation权限时遇AccessDeniedException问题求助
解决Terraform部署LakeFormation时非管理员调用者的AccessDeniedException问题
问题背景
用Terraform给Lambda角色配置Lake Formation的DATA_LOCATION_ACCESS权限时,碰到了AccessDeniedException:
- 执行部署的是跨部门共享的服务用户,不是Lake Formation管理员
- 已经确认目标S3桶无异常,试过把Lambda角色设为Lake Formation管理员也无法解决问题
- 仅当给该服务用户本身添加对应权限时,部署才能正常运行,但希望避免提升它的权限等级
解决方案
1. 给调用者配置最小必要IAM策略
给该服务用户附加以下细粒度IAM策略,仅允许它针对特定资源调用Lake Formation的GrantPermissions API:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lakeformation:GrantPermissions", "Resource": [ "arn:aws:lakeformation:*:<你的AWS账号ID>:data-location/s3://<目标S3桶名>/*", "arn:aws:lakeformation:*:<你的AWS账号ID>:principal/IAM_ROLE_ARN=<Lambda角色ARN>" ], "Condition": { "StringEquals": { "lakeformation:Permissions": "DATA_LOCATION_ACCESS", "lakeformation:PrincipalType": "IAM" } } } ] }
将占位符替换为实际的AWS账号ID、目标S3桶名和Lambda角色ARN。
2. 在Lake Formation中给调用者授予数据位置的Grant权限
仅配置IAM策略还不够,需在Lake Formation控制台给该服务用户开通目标数据位置的Grant权限:
- 打开Lake Formation控制台,进入「数据位置」页面
- 找到目标S3桶,点击「编辑权限」
- 添加该服务用户作为主体,勾选
Grant权限后保存
3. 长期方案:使用权限委托角色(可选)
如果该服务用户需要管理多个Lake Formation权限,可创建专门的权限管理角色,让服务用户通过sts:AssumeRole切换至该角色执行部署操作。这种方式无需直接给服务用户加权限,能更好地隔离部署权限范围。
问题根源
出现AccessDeniedException的核心原因是:执行GrantPermissions操作的调用者必须同时满足两个条件:
- IAM层面允许调用该API
- Lake Formation层面拥有对目标资源的
Grant权限(即允许将该资源的权限授予其他主体)
仅将Lambda角色设为管理员无效,因为权限检查针对的是执行部署的调用者,而非被授权的Lambda角色。
内容的提问来源于stack exchange,提问作者DataEnginerd
相关产品推荐
相关产品推荐

