如何向GCP上运行Python的VM发起HTTP请求并传参调用脚本或函数获取返回结果
最简实现方案
要实现外部应用调用VM上的Python代码、传入自定义变量、获取执行结果/函数返回值,不需要搭建复杂的分布式组件,直接在运行Python代码的VM上部署轻量Web服务,通过HTTP请求完成全流程交互即可。
可直接复用的基础示例
VM端前置配置
- 在GCP防火墙规则中放通选定的服务端口(示例默认使用8000端口),规则来源建议限定为自有应用的出口IP段,不要开放0.0.0.0/0的全网访问,降低安全风险。
- 在VM上安装基础依赖:
pip install fastapi uvicorn pydantic
VM端服务代码
将原本要被调用的Python逻辑直接内嵌到服务逻辑中,支持自定义传参、函数调用、执行输出捕获:
from fastapi import FastAPI from pydantic import BaseModel import subprocess app = FastAPI() # 原本需要被外部调用的业务Python函数 def business_logic(input_val: int, rate: float): return round(input_val * rate, 2) # 定义外部请求可传入的自定义参数格式 class InvokeParam(BaseModel): input_val: int rate: float script_path: str | None = None # 暴露给外部应用的统一调用接口 @app.post("/invoke") def handle_request(params: InvokeParam): try: # 场景1:直接调用内部Python函数,捕获返回值 func_result = business_logic(params.input_val, params.rate) # 场景2:调用独立Python脚本时,捕获全量标准输出、错误输出 script_output = None if params.script_path: proc = subprocess.run( ["python3", params.script_path, f"--input={params.input_val}", f"--rate={params.rate}"], capture_output=True, text=True ) script_output = { "stdout": proc.stdout, "stderr": proc.stderr, "exit_code": proc.returncode } # 统一将结果返回给请求方 return { "status": "success", "func_return": func_result, "script_exec_output": script_output } except Exception as e: return { "status": "failed", "error_detail": str(e) } # 服务启动命令:uvicorn main:app --host 0.0.0.0 --port 8000
业务应用端调用逻辑
无论自有应用使用什么语言开发,只要能发送HTTP POST请求即可完成调用,Python端调用示例:
import requests resp = requests.post( url="http://<你的VM连通IP>:8000/invoke", json={ "input_val": 100, "rate": 0.85, "script_path": "/home/user/your_custom_script.py" }, timeout=10 ) # 直接获取VM上Python代码的执行结果 print(resp.json())
落地注意事项
- 不要通过SSH手动触发脚本的方式对接外部应用,这种方式稳定性差,需要额外处理的权限、进程、日志问题极多,投入产出比很低。
- 生产环境使用
systemd配置服务自启动,VM重启后不需要手动登录即可拉起Web服务。 - 网络连通优先走GCP VPC内网通道,让应用和VM在同一VPC网络下通信,无需将服务端口暴露到公网,大幅降低被恶意扫描、调用的风险。
- 对传入的自定义变量做严格格式校验,避免传入不符合预期的参数触发脚本执行异常。
内容的提问来源于stack exchange,提问作者Trey Collier
相关产品推荐
相关产品推荐

