如何使用Python在GCP特定区域列出所有计算实例?
按区域筛选GCP Compute Engine实例的Python实现
GCP的区域包含多个可用区,要按区域筛选实例,核心思路是:先获取目标区域下的所有可用区,再逐个拉取每个可用区的实例列表,最后合并结果。以下提供两种实现方式:
方法一:使用Google Cloud官方客户端库(推荐)
官方客户端库封装了认证、API调用等细节,更简洁可靠。
步骤:
- 安装依赖库:
pip install google-cloud-compute
- 完成身份认证:
- 本地开发可执行
gcloud auth application-default login - 生产环境建议使用服务账号密钥,设置环境变量
GOOGLE_APPLICATION_CREDENTIALS指向密钥文件路径
- 本地开发可执行
代码实现:
from google.cloud import compute_v1 def list_instances_by_region(project_id: str, region: str) -> list: # 初始化Compute Engine客户端 compute_client = compute_v1.InstancesClient() zone_client = compute_v1.ZonesClient() # 筛选目标区域下的所有可用区 zones = zone_client.list(project=project_id, filter=f"region:*{region}") instances = [] # 遍历可用区,拉取实例数据 for zone in zones: zone_name = zone.name try: zone_instances = compute_client.list(project=project_id, zone=zone_name) instances.extend(zone_instances) except Exception as e: print(f"获取可用区 {zone_name} 实例失败: {str(e)}") return instances # 使用示例 if __name__ == "__main__": PROJECT_ID = "你的GCP项目ID" TARGET_REGION = "us-central1" # 替换为你需要筛选的区域 result = list_instances_by_region(PROJECT_ID, TARGET_REGION) print(f"区域 {TARGET_REGION} 下的实例总数: {len(result)}") for instance in result: print(f"实例名称: {instance.name}, 所属可用区: {instance.zone.split('/')[-1]}")
方法二:直接调用REST API
如果不想依赖官方客户端库,可直接通过requests库调用GCP REST API。
步骤:
- 安装依赖库:
pip install requests
- 确保本地已安装并配置
gcloud工具,完成身份认证(执行gcloud auth login)
代码实现:
import requests import subprocess def get_gcp_access_token() -> str: # 调用gcloud获取临时访问令牌 result = subprocess.run(["gcloud", "auth", "print-access-token"], capture_output=True, text=True) return result.stdout.strip() def list_instances_by_region_rest(project_id: str, region: str) -> list: access_token = get_gcp_access_token() headers = {"Authorization": f"Bearer {access_token}"} # 获取目标区域下的所有可用区 zones_url = f"https://compute.googleapis.com/compute/v1/projects/{project_id}/regions/{region}/zones" zones_response = requests.get(zones_url, headers=headers) zones_response.raise_for_status() zones = zones_response.json().get("items", []) instances = [] # 遍历可用区拉取实例数据 for zone in zones: zone_name = zone["name"] instances_url = f"https://compute.googleapis.com/compute/v1/projects/{project_id}/zones/{zone_name}/instances" try: instances_response = requests.get(instances_url, headers=headers) instances_response.raise_for_status() instances.extend(instances_response.json().get("items", [])) except Exception as e: print(f"获取可用区 {zone_name} 实例失败: {str(e)}") return instances # 使用示例 if __name__ == "__main__": PROJECT_ID = "你的GCP项目ID" TARGET_REGION = "us-central1" result = list_instances_by_region_rest(PROJECT_ID, TARGET_REGION) print(f"区域 {TARGET_REGION} 下的实例总数: {len(result)}") for instance in result: print(f"实例名称: {instance['name']}, 所属可用区: {instance['zone'].split('/')[-1]}")
注意事项:
- 确保账号拥有
compute.instances.list和compute.zones.list权限 - 生产环境中建议使用服务账号密钥认证,避免依赖本地
gcloud工具
内容的提问来源于stack exchange,提问作者Roua Khenissi
相关产品推荐
相关产品推荐

