Airflow GoogleDriveToGCSOperator访问共享团队盘报错问题
问题根因
这个KeyError: 'id'报错和服务账号的权限配置无关,本质是GoogleDriveToGCSOperator默认调用Google Drive API时未开启共享盘(Team/Shared Drive)支持:默认的文件查询请求只会遍历个人「My Drive」范围,不会返回共享盘内的文件元数据,最终拿到的file_metadata为空,取id字段时直接触发键错误。
解决方法
根据你安装的apache-airflow-providers-google包版本选择对应方案:
- 版本 >= 8.3.0(原生支持共享盘参数)
新版本Operator已经暴露了共享盘相关的配置项,实例化任务时补上对应参数即可:
注意upload_gdrive_to_gcs = GoogleDriveToGCSOperator( task_id="upload_gdrive_object_to_gcs", folder_id="my-folder-id-here", # 替换为共享盘内目标文件夹的ID file_name="abc.txt", bucket_name="gdrive-testbucket", object_name="testfile.txt", gcp_conn_id='google_cloud_default', # 以下为访问共享盘必须补充的参数 drive_id="your-shared-drive-id", # 替换为目标文件夹所属共享盘的根ID corpora="drive", # 指定查询范围为目标共享盘,而非默认的个人盘 supports_all_drives=True, )drive_id是共享盘本身的ID,不是子文件夹ID:打开共享盘根目录时,URL中folders/后的第一段字符串就是共享盘ID。 - 版本 < 8.3.0(无原生共享盘支持)
老版本Operator没有暴露上述共享盘配置参数,优先选择升级provider包到最新稳定版解决,避免自定义代码带来的后续维护成本。如果暂时不能升级,可以自定义类继承原生GoogleDriveToGCSOperator,重写文件查询逻辑,在调用get_file_id、download_file方法时手动传入supports_all_drives=True、corpora='drive'、drive_id=<你的共享盘ID>三个参数,把查询范围覆盖到共享盘即可。
额外校验项
如果补完参数仍报错,逐一检查以下配置:
- 服务账号已经被添加为目标共享盘的成员,下载场景下授予「查看者」及以上权限即可
- 如果GCP连接中配置了服务账号模拟链,需要确认被模拟的账号同样拥有目标共享盘的对应访问权限
内容的提问来源于stack exchange,提问作者phenderbender
相关产品推荐
相关产品推荐

