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

如何用Python指定Google Cloud实例模板的存储区域?

解决Google Cloud区域性实例模板创建问题

要把Compute Engine实例模板创建到指定区域(比如europe-north1),核心是改用区域性实例模板客户端,而非默认的全局客户端,同时在请求中明确指定目标区域。以下是具体修改方案:

核心修改思路

默认的实例模板是全局资源,要创建区域性模板,必须使用GCP提供的区域性实例模板专属客户端和请求对象,不能复用全局模板的创建逻辑。

修改后的代码示例

from google.cloud import compute_v1
import time

def create_template(
    project_id: str,
    template_name: str,
    instance_template_region: str,
    machine_type: str = "n1-standard-1",
    source_image: str = "projects/debian-cloud/global/images/family/debian-11"
):
    # 初始化区域性实例模板客户端(关键:替换全局客户端)
    region_template_client = compute_v1.RegionInstanceTemplatesClient()

    # 定义实例的基础属性(和全局模板逻辑一致,无需改动)
    instance_properties = compute_v1.InstanceProperties()
    instance_properties.machine_type = machine_type

    # 配置启动磁盘
    disk = compute_v1.AttachedDisk()
    initialize_params = compute_v1.AttachedDiskInitializeParams()
    initialize_params.source_image = source_image
    initialize_params.disk_size_gb = 10
    disk.initialize_params = initialize_params
    disk.boot = True
    instance_properties.disks = [disk]

    # 配置网络接口(默认使用项目默认VPC)
    network_interface = compute_v1.NetworkInterface()
    network_interface.name = "global/networks/default"
    instance_properties.network_interfaces = [network_interface]

    # 构建区域性实例模板对象
    template = compute_v1.RegionInstanceTemplate()
    template.name = template_name
    template.properties = instance_properties

    # 构建区域性模板创建请求(必须指定目标区域)
    request = compute_v1.InsertRegionInstanceTemplateRequest()
    request.project = project_id
    request.region = instance_template_region
    request.region_instance_template_resource = template

    # 发送请求并等待操作完成
    operation = region_template_client.insert(request=request)
    wait_for_extended_operation(operation, "区域性实例模板创建")

def wait_for_extended_operation(operation, verbose_name="operation", timeout=300):
    # 原等待函数无需大幅修改,只需确保能处理区域性操作的状态刷新
    start_time = time.time()
    while not operation.done():
        operation.refresh()
        if operation.metadata and "progress" in operation.metadata:
            print(f"{verbose_name} 进度: {operation.metadata['progress']}%")
        elapsed_time = time.time() - start_time
        if elapsed_time >= timeout:
            raise TimeoutError(f"{verbose_name} 超时未完成")
        time.sleep(5)

    if operation.error:
        raise RuntimeError(f"{verbose_name} 创建失败: {operation.error}")
    return operation.result()

关键修改点说明

  • 客户端切换:用RegionInstanceTemplatesClient()替代全局的InstanceTemplatesClient(),这是创建区域性模板的核心前提。
  • 请求参数:InsertRegionInstanceTemplateRequest必须传入region参数,也就是你指定的目标区域(比如europe-north1)。
  • 资源对象:使用RegionInstanceTemplate而非全局的InstanceTemplate来定义模板属性,确保和区域性客户端匹配。

验证方式

创建完成后,可以通过GCP命令行工具确认模板所在区域:

gcloud compute instance-templates list --region=europe-north1

内容的提问来源于stack exchange,提问作者Europa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:33:13