Cloud Composer下Airflow调用BigQuery建表报accessDenied Drive权限错误
问题诱因
- 核心原因是Airflow任务调用BigQuery时,请求的OAuth作用域未包含Google Drive的访问权限。即便你已经为Composer服务账号授予了Google Sheet的编辑权限,BigQuery访问绑定Drive资源的外部表时,要求请求必须携带Drive的访问作用域才能获取合法的访问凭证,否则就会抛出权限不足的报错。
- 相同SQL在BigQuery编辑器中可正常执行,是因为个人账号登录Google Cloud控制台时默认已经授予了BigQuery和Google Drive的访问作用域,无需额外配置即可正常访问绑定Sheet的外部表。
解决方案
- 为Composer环境配置Drive访问作用域:进入Google Cloud控制台的Composer管理页面,修改对应环境的Airflow配置,在oauth_scopes配置项中添加
https://www.googleapis.com/auth/drive,配置修改后需要重启Composer环境生效。 - 在DAG的BigQuery操作算子中显式指定OAuth作用域,以常用的
BigQueryExecuteQueryOperator为例,配置参考如下:
from airflow.providers.google.cloud.operators.bigquery import BigQueryExecuteQueryOperator create_table_task = BigQueryExecuteQueryOperator( task_id="create_anagraphics_final", sql="""CREATE OR REPLACE TABLE `test-prod.REZ_TEST.ANAGRAPHICS_FINAL` AS ( WITH COD_ART_NOT_2021 AS (SELECT * FROM `test-prod.PRZ_TEST.ANAGRAPHICS_2020` WHERE CodArt NOT IN (SELECT CodArt FROM `test-prod.PRZ_TEST.ANAGRAPHICS_2021` WHERE Ricorsivita IS NOT NULL ORDER BY CodArt ASC)) SELECT CodArt, BusinessUnit, AnagraficaERP, AnagraficaCGD, Ricorsivita, ServiceType, EBT, 2021 AS Year FROM `test-prod.PRZ_TEST.ANAGRAPHICS_2021` WHERE Ricorsivita IS NOT NULL UNION ALL SELECT *, 2020 AS Year FROM COD_ART_NOT_2021 );""", use_legacy_sql=False, # 显式指定BigQuery和Drive的访问作用域 oauth_scopes=[ "https://www.googleapis.com/auth/bigquery", "https://www.googleapis.com/auth/drive" ], dag=dag )
- 确认执行任务的服务账号一致性:检查算子是否配置了服务账号模拟参数,确保实际执行BigQuery任务的账号,就是你已经授予Google Sheet编辑权限的Composer Worker服务账号。
内容的提问来源于stack exchange,提问作者Kla1998
相关产品推荐
相关产品推荐

