使用服务账号创建BigQuery定时查询报403 PermissionDenied权限错误
BigQuery Data Transfer API创建定时查询403权限错误排查方案
排查步骤
- 第一步:验证当前调用身份是否正确
先添加调试代码确认客户端读取的服务账号和你配置权限的账号一致,避免读取到其他默认身份:
确认打印的邮箱和你授予权限的服务账号完全一致。from google.auth import default credentials, project_id = default() print(credentials.service_account_email) - 第二步:校验
parent参数格式parent参数必须严格遵循projects/[项目ID]/locations/[区域]格式,注意项目ID不要写成项目显示名,区域要和你使用的BigQuery资源区域匹配。 - 第三步:检查服务账号模拟权限
如果你在请求中传入了service_account_name参数,代表你要求Transfer服务模拟该服务账号执行任务,此时需要额外配置两个权限:- 你当前调用API的服务账号,需要拥有目标模拟服务账号的
Service Account Token Creator权限(需在模拟目标服务账号的权限页单独配置,不是项目级配置) - BigQuery Data Transfer官方服务账号
service-[你的项目编号]@gcp-sa-bigquerydatatransfer.iam.gserviceaccount.com,需要拥有BigQuery Data Transfer Service Agent角色
- 你当前调用API的服务账号,需要拥有目标模拟服务账号的
- 第四步:校验资源级权限
如果你操作的数据集是跨项目共享的,或者配置了数据集级权限覆盖,需要单独给服务账号授予目标数据集的BigQuery Data Editor、BigQuery Job User权限。 - 第五步:排除基础设施限制
- 检查项目/组织是否开启了VPC服务控制,确认BigQuery Transfer API已加入允许的服务列表,且服务账号在允许的身份范围内
- 检查是否有组织策略禁止服务账号模拟操作
- 第六步:用gcloud命令排除代码问题
使用同一服务账号密钥执行gcloud命令验证权限配置是否正确:
如果gcloud执行成功,说明你的代码中存在认证配置覆盖的问题,检查是否在初始化# 激活服务账号 gcloud auth activate-service-account --key-file=你的服务账号密钥文件路径 # 测试创建定时查询 gcloud bq transfer-config create \ --schedule="every 24 hours" \ --target-dataset=你的测试数据集名 \ --display-name=test-schedule-query \ --query-string="SELECT 1 as test_col" \ --project=你的项目ID \ --location=你的资源区域transfer_client时手动传入了其他credentials参数,覆盖了环境变量的配置。 - 额外注意:IAM权限配置后最长需要5分钟生效,配置完成后建议等待几分钟再进行测试。
内容的提问来源于stack exchange,提问作者iamabhaykmr
相关产品推荐
相关产品推荐

