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

Terraform部署Cloud Run函数时无法从Artifact Registry导入自定义Python包且依赖缺失

Terraform部署Cloud Run函数时无法从Artifact Registry导入自定义Python包且依赖缺失

看起来你遇到的问题是Cloud Functions v2(你提到的Cloud Run应该是笔误?不过核心问题一致)部署时,自定义包的依赖没有正确安装,导致触发了ModuleNotFoundError。我来一步步帮你排查和解决这些问题:


一、如何验证自定义包是否在部署时被安装?

要确认包是否被安装,你可以从这几个方向入手:

  • 查看Cloud Build完整构建日志:
    登录Google Cloud控制台,找到对应的Cloud Build构建记录,跳转到“日志”标签,搜索pip install相关的输出。你需要找这几个关键信息:
    1. 有没有出现Looking in indexes: https://pypi.org/simple, https://us-central1-python.pkg.dev/dev-di-dashboards-data/ddsgbq/simple/(确认pip是否识别到你的私有仓库地址)
    2. 有没有显示“Collecting ddsgcloud”(假设你的自定义包名是ddsgcloud)的记录,以及是否有成功下载安装的日志
    3. 有没有出现权限报错或者找不到包的提示
  • 在函数中添加调试代码:
    在你的main.py开头加入这段代码,部署后触发函数,查看函数日志:
    import pkg_resources
    print("Installed packages:")
    for pkg in pkg_resources.working_set:
        print(f"- {pkg.key}=={pkg.version}")
    
    日志里如果没有google-cloud-logging和你的自定义包,说明依赖确实没装;如果有google-cloud-logging,那可能是导入路径或者版本兼容的问题
  • 本地模拟构建:
    使用cloud-build-local工具在本地模拟Cloud Build的构建过程,命令如下:
    cloud-build-local --config=cloudbuild.yaml --dryrun=false .
    
    这样你可以在本地看到完整的依赖安装过程,更容易排查问题

二、如何确保Cloud Functions有权限从Artifact Registry拉取私有包?

这里有个容易踩的坑:构建过程使用的是Cloud Build服务账号,而不是函数运行时的服务账号,你需要重点检查这几点:

  • 给Cloud Build服务账号添加权限:
    找到你的项目的Cloud Build服务账号(格式是[你的项目编号]@cloudbuild.gserviceaccount.com),给它授予Artifact Registry Reader角色。你之前可能只给了函数的服务账号(dss-ops-1@dev-di-dashboards-data.iam.gserviceaccount.com)权限,但构建时是Cloud Build在拉取依赖,这个账号才是关键
  • 正确配置requirements.txt的私有仓库地址:
    在你的requirements.txt最顶部添加一行,指定私有仓库的索引地址:
    --extra-index-url https://us-central1-python.pkg.dev/dev-di-dashboards-data/ddsgbq/simple/
    ###### core dependencies
    click 
    google-api-core
    # ... 其他依赖
    
    这样pip才会同时从PyPI和你的私有仓库拉取包
  • 确认keyring配置生效:
    你的requirements.txt里已经包含了keyrings.google-artifactregistry-auth,这个包会自动处理Artifact Registry的认证,但要确保构建环境中没有禁用keyring。如果还是有问题,可以在构建时显式设置环境变量:PIP_EXTRA_INDEX_URL=https://us-central1-python.pkg.dev/dev-di-dashboards-data/ddsgbq/simple/

三、如何调试Cloud Functions内依赖缺失的问题?

除了上面的方法,你还可以用这些方式深入排查:

  • 查看函数运行时日志:
    触发函数后,在Google Cloud控制台的“日志资源管理器”里搜索函数的日志,除了ModuleNotFoundError,看看有没有其他警告信息,比如pip安装失败的残留日志
  • 使用自定义容器镜像部署:
    Cloud Functions v2支持自定义容器镜像,你可以自己编写Dockerfile来控制构建过程,比如:
    FROM gcr.io/google.com/cloudsdktool/cloud-sdk:latest as builder
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install --user -r requirements.txt
    
    FROM python:3.9-slim
    WORKDIR /app
    COPY --from=builder /root/.local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
    COPY . .
    ENV FUNCTION_TARGET=your_function_name
    ENTRYPOINT ["functions-framework"]
    
    构建镜像并推送到Artifact Registry,然后在Terraform中配置image字段来使用这个镜像,这样你可以在构建时加入RUN pip list等命令,提前确认依赖是否安装成功
  • 本地环境复现:
    本地创建Python 3.9的虚拟环境,配置pip使用私有仓库:
    pip install --extra-index-url https://us-central1-python.pkg.dev/dev-di-dashboards-data/ddsgbq/simple/ -r requirements.txt
    
    然后运行functions-framework --target=your_function_name测试,如果本地也出现同样的错误,说明是requirements.txt或者自定义包本身的问题(比如自定义包的setup.py没有正确声明依赖)

另外还要提醒你检查Terraform配置:你的google_cloudfunctions2_function资源里没有指定代码来源(比如storage_source或者source_upload_url),要确保Terraform正确打包并上传了包含requirements.txt和自定义包引用的代码,否则构建过程根本找不到你的依赖配置。

备注:内容来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:59:32