如何用Python函数从嵌套JSON日志提取指定IAM角色成员?
解决方案
完整Python函数代码
import base64 import json def extract_editor_members(event, context): # 解码Pub/Sub消息并转为JSON对象 pubsub_message = base64.b64decode(event['data']).decode('utf-8') msg = json.loads(pubsub_message) # 获取项目ID proj_id = msg['resource']['labels']['project_id'] # 安全获取bindings列表(避免层级缺失导致KeyError) bindings = msg.get('protoPayload', {}).get('request', {}).get('policy', {}).get('bindings', []) # 遍历收集roles/editor对应的所有成员 editor_members = [] for binding in bindings: if binding.get('role') == 'roles/editor': editor_members.extend(binding.get('members', [])) # 按指定格式输出结果 print(f"项目ID: {proj_id}") print(f"Role: roles/editor") print("Members:") for member in editor_members: print(member) # 返回结构化结果(可选,用于Cloud Function响应) return { "project_id": proj_id, "role": "roles/editor", "members": editor_members }
关键实现说明
- 安全层级访问:使用
dict.get()替代直接索引(如msg['protoPayload']),当日志结构中某一层级不存在时,会返回预设的默认值(空字典或空列表),避免抛出KeyError。 - 动态遍历匹配:遍历
bindings列表时,不依赖固定索引,完全基于role字段的值进行匹配,适配日志结构的动态变化。 - 多条目收集:如果存在多个
role为roles/editor的binding条目,extend()会将所有成员合并到一个列表中,确保无遗漏。
输出示例
假设日志中包含多个roles/editor的绑定条目,输出将如下:
项目ID: my-gcp-project Role: roles/editor Members: sa-1@gcloud.com sa2@gcloud.com sa-3@gcloud.com
内容的提问来源于stack exchange,提问作者Jman
相关产品推荐
相关产品推荐

