Google Cloud Functions - 如何从另一个项目的 GCP 存储库导入 Python 包(通过 PIP)?

Google Cloud Functions - How to import a Python package (via PIP) from a GCP Repository in another project?

我需要在多个项目中使用 GCP 中的私有 Python 包。我还没有尝试过 Artifact Registry,因为它仍处于 alpha 阶段,所以现在我一直在尝试使用简单的存储库,但我愿意接受其他选择。

我在项目 A 的 GCP 存储库中有一个 Python 包源代码,我在项目 A 的存储库中也有一个云函数。在这个云函数中,我通过添加 git+https://source.developers.google.com/p/project-a/r/my-python package 在我的 requirements.txt 文件中。

如果我在我的终端中通过 gcloud functions 在项目 A 中部署这个云函数,指定 --source=https://source.developers.google.com/projects/project-a/repos/my-cloud-function--project=project-a,它工作正常,并且该函数可以成功导入元素当我调用它时包,但如果我在项目 B 中部署此函数,我会收到以下错误:

Deploying function (may take a while - up to 2 minutes)...failed.                                                                             
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: `pip_download_wheels` had stderr output:
  Running command git clone -q https://source.developers.google.com/p/project-a/r/my-python-package /tmp/pip-req-build-f_bcp4y9
  remote: PERMISSION_DENIED: The caller does not have permission
  remote: [type.googleapis.com/google.rpc.RequestInfo]
  remote: request_id: "abe4(...)"
  fatal: unable to access 'https://source.developers.google.com/p/project-a/r/my-python-package/': The requested URL returned error: 403
ERROR: Command errored out with exit status 128: git clone -q https://source.developers.google.com/p/project-a/r/my-python-package /tmp/pip-req-build-f_bcp4y9 Check the logs for full command output.

这似乎是一个权限问题。但是,如果我从 requirements.txt 中删除包依赖项,它会很好地部署,这意味着项目 B 确实可以访问项目 A 的存储库,所以这似乎是 Pip 内部的一个问题。但是pip部署到A项目没有问题,有点迷茫

非常感谢。

Artifact Registry is GA 并且自去年以来不再 Alpha/Beta。

我复制了你的问题。该错误确实是由于权限引起的,当您删除 requirements.txt 上的行时,它并没有发生在部署中,可能是因为凭据可以访问这两个项目。

为了使部署正确,您必须将存储库的权限添加到可以在 Cloud Functions 上找到的进行部署的服务帐户(即 CF 服务帐户)- (select your Cloud Function) - Details,应该是 project@appspot.gserviceaccount.com

找到服务帐户后,通过单击 Settings - Permissions 将其添加到云存储库,并至少添加 Source Repository Reader 角色