通过CDK授予LakeFormation数据湖位置权限出错的排查问询
我用AWS CDK注册S3数据湖位置的代码执行正常,代码如下:
lakeformation.CfnResource(scope, "S3BucketRegistrationResource", resource_arn="arn:aws:s3:::my-s3-bucket-here/my_db_folder_here/", use_service_linked_role=True )
但执行授予主体权限的代码时失败,授权代码:
data_location = lakeformation.CfnPrincipalPermissions.DataLocationResourceProperty( catalog_id=Aws.ACCOUNT_ID, resource_arn="arn:aws:s3:::my-s3-bucket-here/my_db_folder_here/" ) cfn_principal_permissions = lakeformation.CfnPrincipalPermissions(scope, "DatalakePrincipalPermissions", permissions=["DATA_LOCATION_ACCESS"], permissions_with_grant_option=["DATA_LOCATION_ACCESS"], principal=lakeformation.CfnPrincipalPermissions.DataLakePrincipalProperty( data_lake_principal_identifier=f"arn:aws:iam::my_acct_id_here:user/my_user_here" ), resource=lakeformation.CfnPrincipalPermissions.ResourceProperty( data_location=data_location ), catalog=Aws.ACCOUNT_ID )
部署时数据湖位置注册成功,但授权环节报错:
CREATE_FAILED | AWS::LakeFormation::PrincipalPermissions | DatalakePrincipalPermissions
6:27:34 PM | CREATE_FAILED | AWS::LakeFormation::PrincipalPermissions | DatalakePrincipalPermissions
Resource handler returned message: "Resource does not exist or requester is not authorized to access requested permissions. (Service: LakeFormation, Status Code: 400, Request ID: b29f926b-5ab2-49ec-8bee-42bc8fbc12d8)" (RequestToken: 6cc21ec7-c67a-d4c1-c3f0-3af6b0a7451d, HandlerErrorCode: AccessDenied)
at FullCloudFormationDeployment.monitorDeployment (/usr/lib/node_modules/aws-cdk/lib/index.js:380:10236)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async deployStack2 (/usr/lib/node_modules/aws-cdk/lib/index.js:383:145775)
at async /usr/lib/node_modules/aws-cdk/lib/index.js:383:128776
at async run (/usr/lib/node_modules/aws-cdk/lib/index.js:383:126782)
我用同一IAM用户在AWS控制台手动执行相同授权操作无权限问题,请问为何CDK操作时出现权限问题,该如何排查?
排查步骤与解决方案
检查CDK部署执行角色的权限
控制台操作用的是你的IAM用户,但CDK部署默认依赖CloudFormation执行角色(比如cdk-hnb659fds-deploy-role-<账号>-<区域>),这个角色可能缺少LakeFormation相关权限。需要给该角色添加:lakeformation:GrantPermissions权限- 对目标S3位置的
lakeformation:DescribeResource权限
另外可补充iam:ListRoles权限,辅助验证服务关联角色的存在。
强制资源创建顺序
CloudFormation可能在数据湖位置注册完成前就尝试创建权限资源,导致识别不到目标对象。给权限资源添加依赖,确保它在注册资源之后执行:# 方法1:通过add_dependency绑定 cfn_principal_permissions.add_dependency(scope.node.find_child("S3BucketRegistrationResource")) # 方法2:定义时指定depends_on参数 cfn_principal_permissions = lakeformation.CfnPrincipalPermissions(scope, "DatalakePrincipalPermissions", # 保留原有参数 depends_on=["S3BucketRegistrationResource"] )校验资源ARN的一致性
检查注册和授权代码中的S3 ARN是否完全一致,包括末尾的斜杠。LakeFormation对ARN的匹配是严格的,格式差异会导致资源找不到。确认LakeFormation数据湖管理员身份
检查CDK执行角色是否被列为LakeFormation的数据湖管理员。如果没有,即使IAM权限齐全,LakeFormation也会拒绝授权操作。可在LakeFormation控制台的「Administrators」页面添加该角色。检查服务关联角色的权限
注册时启用了use_service_linked_role=True,需确保对应的服务关联角色(AWSServiceRoleForLakeFormationDataAccess)拥有目标S3桶的读写权限,否则LakeFormation无法确认资源有效性,间接导致授权失败。
内容的提问来源于stack exchange,提问作者onsubject

