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

Google Cloud Function返回200却未创建Machine Image,如何修复?

修复Cloud Function创建Jenkins机器镜像备份的问题

核心问题分析与修复步骤

  • 添加API身份验证
    调用GCP Compute API必须通过身份验证,Cloud Function默认使用的服务账号需要具备创建机器镜像的权限。同时请求中要带上认证凭据,可通过google-auth库自动获取服务账号令牌,无需手动管理密钥。

  • 修正请求数据格式
    GCP API要求POST请求内容为JSON格式,原代码用data参数传递字典会以表单形式发送数据,不符合API要求。需改用json参数直接传递字典,或设置Content-Type: application/json请求头并传递JSON字符串。

  • 添加响应检查与错误处理
    原代码无论API请求成功与否都返回OK,无法排查问题。必须检查响应状态码,若状态码不在2xx范围内,要抛出异常或返回错误状态码,同时打印响应内容便于调试。

  • 修正实例资源路径
    GCP实例属于特定区域(Zone)资源,而非全局(Global)资源,原代码中实例URL的global路径错误,需替换为实例所在的具体区域,比如us-central1-a。

  • 确保服务账号权限正确
    给Cloud Function的服务账号添加以下核心权限:

    • compute.machineImages.create:创建机器镜像
    • compute.instances.get:读取源实例信息
    • compute.disks.createSnapshot:创建镜像时需给磁盘生成快照(间接依赖)
      可直接赋予Compute Instance Admin (v1)角色,或创建包含上述权限的自定义角色。

修改后的完整代码

import requests
from datetime import date
import functions_framework
import google.auth
from google.auth.transport.requests import Request

# 定义API所需权限
SCOPES = ['https://www.googleapis.com/auth/compute']

@functions_framework.http
def create_backup(request):
    try: 
        # 格式化日期为YYYYMMDD,避免特殊字符,符合GCP资源命名规范
        today = date.today().strftime("%Y%m%d")
        # 获取服务账号凭据并刷新令牌
        credentials, project_id = google.auth.default(scopes=SCOPES)
        credentials.refresh(Request())
        
        # 构建请求头,携带认证令牌与JSON格式声明
        headers = {
            'Authorization': f'Bearer {credentials.token}',
            'Content-Type': 'application/json'
        }
        
        # 构建请求体,修正实例的区域路径
        payload = {
            "name": f"jenkins-backup-{today}",
            "sourceInstance": 'https://www.googleapis.com/compute/v1/projects/project-1/zones/[你的实例区域]/instances/jenkins'
        }
        
        # 发送符合要求的POST请求
        r = requests.post(
            'https://compute.googleapis.com/compute/v1/projects/project-1/global/machineImages',
            json=payload,
            headers=headers
        )
        
        # 检查响应状态,非2xx则抛出异常
        r.raise_for_status()
        print(f"镜像创建成功:{r.json()}")
        return 'OK', 200
    except requests.exceptions.HTTPError as e:
        print(f"API请求错误:{e},响应内容:{r.text}")
        return "ERROR", 400
    except Exception as e:
        print(f"未知错误:{e}")
        return "ERROR", 500

额外配置说明

  • 依赖安装:需在requirements.txt中添加以下依赖,确保Cloud Function能正常安装运行:
    functions-framework==3.*
    requests==2.*
    google-auth==2.*
    
  • 日期格式化:将日期转为YYYYMMDD格式,避免资源名中出现特殊字符,同时便于按时间排序备份镜像。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:05:37