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相关的输出。你需要找这几个关键信息:- 有没有出现
Looking in indexes: https://pypi.org/simple, https://us-central1-python.pkg.dev/dev-di-dashboards-data/ddsgbq/simple/(确认pip是否识别到你的私有仓库地址) - 有没有显示“Collecting ddsgcloud”(假设你的自定义包名是ddsgcloud)的记录,以及是否有成功下载安装的日志
- 有没有出现权限报错或者找不到包的提示
- 有没有出现
- 在函数中添加调试代码:
在你的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最顶部添加一行,指定私有仓库的索引地址:
这样pip才会同时从PyPI和你的私有仓库拉取包--extra-index-url https://us-central1-python.pkg.dev/dev-di-dashboards-data/ddsgbq/simple/ ###### core dependencies click google-api-core # ... 其他依赖 - 确认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来控制构建过程,比如:
构建镜像并推送到Artifact Registry,然后在Terraform中配置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"]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.txtfunctions-framework --target=your_function_name测试,如果本地也出现同样的错误,说明是requirements.txt或者自定义包本身的问题(比如自定义包的setup.py没有正确声明依赖)
另外还要提醒你检查Terraform配置:你的google_cloudfunctions2_function资源里没有指定代码来源(比如storage_source或者source_upload_url),要确保Terraform正确打包并上传了包含requirements.txt和自定义包引用的代码,否则构建过程根本找不到你的依赖配置。
备注:内容来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

