如何用Python过滤GCP中带goog-前缀标签的实例,仅获取原生GCE实例
GCE实例过滤方案说明
核心限制说明
GCP Compute API的过滤语法和Cloud Logging的过滤语法是两套独立规则,前者本身不支持通配符前缀/正则匹配,你当前写的filter="labels != goog-*"属于无效语法,无法生效。
可行实现方案
方案1:全量拉取后本地过滤(最稳妥,覆盖所有goog-前缀标签)
无需依赖API侧的过滤能力,拉取所有实例后在本地做规则匹配即可,完整代码如下:
from googleapiclient.discovery import build service = build('compute', 'v1', credentials=credentials) request = service.instances().aggregatedList(project="my-project") response = request.execute() native_gce_instances = [] # 遍历所有区域的实例 for zone, zone_resource in response.get('items', {}).items(): # 跳过无实例的区域 if 'instances' not in zone_resource: continue for instance in zone_resource['instances']: labels = instance.get('labels', {}) # 排除任意标签键以goog-开头的实例 if not any(key.startswith('goog-') for key in labels.keys()): native_gce_instances.append(instance)
方案2:API侧预过滤(减少拉取数据量,需要维护已知标签列表)
Compute API支持用labels.标签名:*语法判断某个标签是否存在,这里的*是专属的存在性判定符,不是通用通配符,你可以把常见的谷歌服务自动生成的goog-前缀标签显式列入排除规则,示例如下:
from googleapiclient.discovery import build service = build('compute', 'v1', credentials=credentials) # 显式排除已知的谷歌服务自动创建实例的标签 filter_rule = """ NOT labels.goog-gke-node:* AND NOT labels.goog-dataproc-worker:* AND NOT labels.goog-compute-image-tools:* AND NOT labels.goog-cloud-run-worker:* """ request = service.instances().aggregatedList(project="my-project", filter=filter_rule)
该方案的缺点是如果GCP新增了其他goog-前缀的服务标签,需要同步更新过滤规则。
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

