You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:41:43