Google Cloud Workflows中解码Firestore事件的Protobuf负载
解码Google Cloud Workflow中Firestore事件的Protobuf消息
问题背景
我使用YAML定义Google Cloud Workflow,通过EventArc监听Firestore文档保存事件,触发器运行正常,但无法解码收到的Protobuf消息,也找不到相关文档。以下是收到的示例消息和当前Workflow YAML代码,请求指导如何解码给定消息中的Protobuf。
示例消息
{ "data": "CrUECpYECjoKFhIUZX5maXJlY21zLWRlbW8tMjcxNTASIAoIcHJvZHVjdHMaFDByTzUzNnFxR3dzRzdVSEtTUnNjGgwKBmltYWdlcxICSgAaEwoKanNvbl9maWVsZBIFMgCYAQEaRgoKbWFpbl9pbWFnZRI4igEyaW1hZ2VzL3A3c3RwX3Bob3RvLTE1MzE3NDYwMjA3OTgtZTY5NTNjNmU4ZTA0LmF2aWaYAQEaEgoJYXZhaWxhYmxlEgUIAJgBARoUCgtkZXNjcmlwdGlvbhIFWACYAQEaGwoOdXBwZXJjYXNlX25hbWUSCYoBA0NDQ5gBARohChFhdmFpbGFibGVfbG9jYWxlcxIMSgoKCIoBAmVzmAEBGhYKEHJlbGF0ZWRfcHJvZHVjdHMSAkoAGgoKBHRhZ3MSAkoAGg8KBnB1YmxpYxIFCACYAQEaFAoLYW1hem9uX2xpbmsSBVgAmAEBGg4KBXByaWNlEgVYAJgBARoRCgRuYW1lEgmKAQNjY2OYAQEaNwoJcHVibGlzaGVyEioyJRoNCgRuYW1lEgVYAJgBARoUCgtleHRlcm5hbF9pZBIFWACYAQGYAQEaFQoIY3VycmVuY3kSCYoBA0RPTJgBARoRCghjYXRlZ29yeRIFWACYAQEaEwoFYnJhbmQSCooBBHZydnKYAQEaHQoIYWRkZWRfb24SEVIMCOufsrAGEIDqgIcDmAEBKgwI65+ysAYQmNqamwMyDAjrn7KwBhCY2pqbAw==", "database": "(default)", "datacontenttype": "application/protobuf", "dataschema": "https://github.com/googleapis/google-cloudevents/blob/main/proto/google/events/cloud/datastore/v1/data.proto", "entity": "products/0rO536qqGwsG7UHKSRsc", "id": "8da5a03c-3779-4d46-be20-546841cbaa8c", "location": "europe-west1", "namespace": "(default)", "project": "firecms-demo-27150", "source": "//firestore.googleapis.com/projects/firecms-demo-27150/databases/(default)", "specversion": "1.0", "subject": "documents/products/0rO536qqGwsG7UHKSRsc", "time": "2024-04-02T23:08:27.862367Z", "type": "google.cloud.datastore.entity.v1.created" }
当前Workflow YAML代码
main: params: [event] steps: - extract_data: assign: - data: # How do I decode a protobuf from the given message?? - create_document: call: googleapis.firestore.v1.projects.databases.documents.patch args: name: ${name} body: fields: test_new_field: stringValue: abc
解决方案
Google Cloud Workflow内置了googleapis.events.decode函数,专门用于解码Google Cloud Events的Protobuf数据。你只需要在步骤中调用该函数,传入base64编码的event.data和对应的Protobuf消息类型即可。
修改后的完整YAML代码
main: params: [event] steps: - extract_data: assign: # 解码Protobuf数据,指定对应的消息类型 - decoded_data: ${googleapis.events.decode(event.data, "google.events.cloud.datastore.v1.EntityEventData")} # 提取Firestore实体的字段内容 - entity_fields: ${decoded_data.value.fields} # 从event的subject字段获取文档的完整路径 - document_name: ${event.subject} - create_document: call: googleapis.firestore.v1.projects.databases.documents.patch args: name: ${document_name} body: fields: test_new_field: stringValue: abc
关键说明
googleapis.events.decode函数接收两个参数:- 第一个参数是事件中的
data字段(base64编码的Protobuf内容) - 第二个参数是Protobuf消息类型的全称,这里对应Firestore实体事件的类型是
google.events.cloud.datastore.v1.EntityEventData
- 第一个参数是事件中的
- 解码后,
decoded_data.value就是触发事件的Firestore实体对象,其fields属性包含了该文档的所有字段数据 - 文档的完整路径可以直接从事件的
subject字段获取,无需额外拼接
内容的提问来源于stack exchange,提问作者gatti
相关产品推荐
相关产品推荐

