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

如何通过Google Cloud Python API创建GCE VM临时SSH隧道?

问题与解答

问题

我可通过终端命令gcloud compute ssh tunnel --zone=us-central1-a -- -NL 5000:localhost:5000创建临时SSH隧道连接GCE VM。现想确认能否使用google.cloud.compute_v1.VpnTunnelsClient通过Google Cloud Python API实现该功能,意图让Python脚本按需创建隧道与VM端程序通信后自动关闭。目前尝试的代码返回“缺失resource字段”错误,询问该需求是否可行,或是否有相关文档指引。

尝试代码

from google.cloud import compute_v1

client = compute_v1.VpnTunnelsClient()
tunnel = compute_v1.VpnTunnel()

config = {"project": <my_project_name>, "region": "us-central1"}
client.insert(vpn_tunnel_resource=tunnel, **config)

报错信息

Traceback (most recent call last):
  File "/home/username/Desktop/Atom/TradierApp2/cloud_compute.py", line 11, in <module>
    client.insert(vpn_tunnel_resource=tunnel, **config)
  File "/home/username/.local/lib/python3.10/site-packages/google/cloud/compute_v1/services/vpn_tunnels/client.py", line 1002, in insert
    response = rpc(
  File "/home/username/.local/lib/python3.10/site-packages/google/api_core/gapic_v1/method.py", line 154, in __call__
    return wrapped_func(*args, **kwargs)
  File "/home/username/.local/lib/python3.10/site-packages/google/api_core/grpc_helpers.py", line 72, in error_remapped_callable
    return callable_(*args, **kwargs)
  File "/home/username/.local/lib/python3.10/site-packages/google/cloud/compute_v1/services/vpn_tunnels/transports/rest.py", line 726, in __call__
    raise core_exceptions.from_http_response(response)
google.api_core.exceptions.BadRequest: 400 POST https://compute.googleapis.com/compute/v1/projects/projectname/regions/us-central1/vpnTunnels: Required field 'resource' not specified

解答

首先明确:google.cloud.compute_v1.VpnTunnelsClient是用于创建站点到站点VPN隧道的工具,和你终端中gcloud compute ssh创建的本地端口转发SSH隧道完全不是同一类功能,用这个API实现你的需求从方向上就错了。

要实现Python脚本按需创建临时SSH隧道并自动关闭的需求,有两个实用方案:

1. 直接调用gcloud命令(最简方案)

通过Python的subprocess模块直接执行gcloud命令,逻辑和手动终端操作一致,无需额外学习新API:

import subprocess
import time

# 启动SSH隧道,替换INSTANCE_NAME为你的VM实例名
tunnel_proc = subprocess.Popen([
    "gcloud", "compute", "ssh", "INSTANCE_NAME",
    "--zone", "us-central1-a",
    "--", "-NL", "5000:localhost:5000"
])

# 此处编写与VM端程序通信的代码,例如访问localhost:5000
time.sleep(10)  # 示例等待,实际替换为业务逻辑

# 通信完成后关闭隧道
tunnel_proc.terminate()
tunnel_proc.wait()

2. 使用纯SSH库实现(无需依赖gcloud)

如果不想依赖gcloud工具,可以用paramiko这类SSH库直接创建端口转发隧道,实现完全的Python原生控制:

import paramiko
import time

# 初始化SSH客户端
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接GCE VM,替换为你的实例公网IP、用户名和SSH密钥路径
ssh_client.connect(
    hostname="INSTANCE_EXTERNAL_IP",
    username="YOUR_USERNAME",
    key_filename="/path/to/your/ssh/private/key"
)

# 创建本地端口转发:将本地5000端口转发到VM的5000端口
transport = ssh_client.get_transport()
transport.request_port_forward("localhost", 5000, "localhost", 5000)

# 执行与VM的通信逻辑
time.sleep(10)

# 关闭连接,自动终止隧道
ssh_client.close()

关于你遇到的错误说明

你创建的VpnTunnel对象是空的,而站点到站点VPN需要配置目标VPN网关、预共享密钥、路由规则等大量必填参数,因此API返回“缺失resource字段”错误。但这个方向本身不符合你的需求,无需继续尝试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:21:00