跨项目为Cloud Storage创建Pub/Sub通知及触发Cloud Function方法咨询
可以实现从项目B为项目A的Cloud Storage存储桶创建Pub/Sub通知,同时将事件传递到项目B的Cloud Function,具体操作如下:
一、配置项目A存储桶向项目B Pub/Sub Topic发送事件
1. 在项目B创建目标Pub/Sub Topic
先在项目B中创建用于接收存储事件的Topic,使用gcloud命令:
gcloud pubsub topics create gcs-object-created-topic --project=PROJECT_B_ID
替换PROJECT_B_ID为你的项目B的ID。
2. 授权项目A的Storage服务账号向项目B Topic发消息
项目A的Cloud Storage服务需要有项目B Topic的发布权限,首先找到项目A的Storage服务账号,格式为service-<PROJECT_A_NUMBER>@gs-project-accounts.iam.gserviceaccount.com(PROJECT_A_NUMBER是项目A的数字ID,可在项目设置中查看)。
执行命令为该账号添加发布权限:
gcloud pubsub topics add-iam-policy-binding gcs-object-created-topic \ --member=serviceAccount:service-<PROJECT_A_NUMBER>@gs-project-accounts.iam.gserviceaccount.com \ --role=roles/pubsub.publisher \ --project=PROJECT_B_ID
3. 在项目A的存储桶上创建通知配置
操作项目A的存储桶,将新增对象事件(OBJECT_FINALIZE)发送到项目B的Topic,使用gcloud命令:
gcloud storage buckets notifications create gs://PROJECT_A_BUCKET_NAME \ --topic=projects/PROJECT_B_ID/topics/gcs-object-created-topic \ --event-types=OBJECT_FINALIZE \ --project=PROJECT_A_ID
替换PROJECT_A_BUCKET_NAME为项目A的存储桶名,PROJECT_A_ID为项目A的ID。
也可以通过Cloud Console操作:进入项目A的Cloud Storage存储桶页面,选择“通知”标签,添加通知时指定项目B的Topic完整路径(projects/PROJECT_B_ID/topics/gcs-object-created-topic)。
二、配置Pub/Sub事件触发项目B的Cloud Function
1. 创建Cloud Function并关联Pub/Sub触发源
在项目B的Cloud Console中创建Cloud Function:
- 触发方式选择Pub/Sub
- 选择之前创建的
gcs-object-created-topic作为触发Topic - 选择运行环境(如Python、Node.js等)
2. 确认权限配置
若使用自动创建的Pub/Sub订阅,Cloud Console会自动为Cloud Function的默认服务账号(projects/PROJECT_B_ID/serviceAccounts/<PROJECT_B_ID>@appspot.gserviceaccount.com)添加roles/pubsub.subscriber权限。若手动创建订阅,需手动为该服务账号添加此权限:
gcloud pubsub subscriptions add-iam-policy-binding <订阅名称> \ --member=serviceAccount:<PROJECT_B_ID>@appspot.gserviceaccount.com \ --role=roles/pubsub.subscriber \ --project=PROJECT_B_ID
3. 编写函数逻辑解析存储事件
以Python为例,函数可解析Pub/Sub消息中的Cloud Storage事件数据:
def process_gcs_event(event, context): import base64 import json if 'data' in event: payload = base64.b64decode(event['data']).decode('utf-8') gcs_event = json.loads(payload) bucket_name = gcs_event['bucket'] object_name = gcs_event['name'] # 此处添加你的业务处理逻辑 print(f"检测到新增对象:{object_name},存储桶:{bucket_name}")
注意事项
- 确保你拥有项目A的
roles/storage.admin权限和项目B的roles/pubsub.admin、roles/cloudfunctions.developer权限 - 事件类型可根据需求调整,如
OBJECT_DELETE对应对象删除事件 - 若遇到权限错误,检查服务账号的权限配置是否正确,以及Topic和存储桶的资源路径是否无误
内容的提问来源于stack exchange,提问作者Pravin Maske

