跨项目权限问题:Project B的Cloud Functions无法访问Project A的Cloud Firestore,403权限不足
问题分析与解决方案
环境信息
- Project A 部署 Cloud Firestore
- Project B 部署 Cloud Functions
问题现象
通过 Project B 的 Cloud Shell 可正常访问 Project A 的 Cloud Firestore,但 Project B 的 Cloud Functions 访问时触发 403 Missing or insufficient permissions 错误。
代码片段
from google.cloud import firestore import firebase_admin from firebase_admin import credentials def function_a(request): cred = credentials.ApplicationDefault() firebase_admin.initialize_app(cred, { 'projectId': 'project-a', }) db = firestore.client() try: doc_ref=db.collection('COLLECTION_SAMPLE').document('documentA').set({"foo":"bar"}) except Exception as e: print("error::", e) return "success"
当前权限配置
Project B 的 Cloud Functions 使用服务账号 project-b@appspot.gserviceaccount.com:
- 在 Project B 拥有
Cloud Datastore User、Cloud Functions Developer、Editor角色 - 在 Project A 拥有
Cloud Datastore Import Export Admin角色
问题核心原因
Cloud Datastore Import Export Admin 角色仅提供数据导入导出权限,不具备读写Firestore文档的权限,这是触发403错误的直接原因。而Cloud Shell默认使用个人账号(通常拥有较高权限),因此能正常访问。
解决方案
1. 分配正确的Firestore权限
在 Project A 中,为 project-b@appspot.gserviceaccount.com 分配以下任一合适角色:
- Cloud Datastore User:允许读写所有Firestore文档,适合常规业务场景
- Cloud Firestore Editor:拥有Firestore数据的编辑权限,覆盖读写操作
- 自定义角色:若需精细化权限控制,可创建仅包含
datastore.documents.create、datastore.documents.update等所需权限的自定义角色
2. 优化代码(可选)
避免函数每次调用时重复初始化Firebase Admin SDK,将初始化逻辑放在函数外部:
from google.cloud import firestore import firebase_admin from firebase_admin import credentials # 全局初始化,仅在函数冷启动时执行一次 cred = credentials.ApplicationDefault() firebase_admin.initialize_app(cred, { 'projectId': 'project-a', }) db = firestore.client() def function_a(request): try: doc_ref=db.collection('COLLECTION_SAMPLE').document('documentA').set({"foo":"bar"}) except Exception as e: print("error::", e) return "success"
3. 验证权限生效
权限变更通常需要几分钟时间同步,等待后重新触发Cloud Functions,检查是否仍存在403错误。
内容的提问来源于stack exchange,提问作者Sridhar Srinivasan
相关产品推荐
相关产品推荐

