GCP - Cloud Function 在同一项目中无法从 Artifact Registry 中找到 Python 包

afs*_*s35 6 python google-cloud-platform google-cloud-functions google-artifact-registry

我一直在尝试 GCP 的 ArtifactRegistry,它目前处于 Python 包的 alpha 版本。

我通过密钥环和我的服务帐户进行身份验证,如文档中所述。

我可以使用 Twine 成功上传包,并且可以通过安装以下内容成功将其下载到本地 Python 项目requirements.txt

--extra-index-url https://my-region-pypi.pkg.dev/my-project/my-python-repo/simple/
my-package
Run Code Online (Sandbox Code Playgroud)

但是,当我将最小的云功能部署到与 Artifact Registry 相同的项目时(如上requirements.txt所示),部署失败并显示以下输出:

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: `pip_download_wheels` had stderr output:
ERROR: Could not find a version that satisfies the requirement my-package (from -r requirements.txt (line 2)) (from versions: none)
ERROR: No matching distribution found for my-package (from -r requirements.txt (line 2))
Run Code Online (Sandbox Code Playgroud)

我尝试了两者--extra-index-url,只是简单--index-url,没有区别。我还尝试使用以下命令安装密钥环依赖项requirements.txt

--extra-index-url https://my-region-pypi.pkg.dev/my-project/my-python-repo/simple/
keyring
keyrings.google-artifactregistry-auth
my-module
Run Code Online (Sandbox Code Playgroud)

但我得到了同样的错误。

我检查了我的项目的默认 App Engine 服务帐户的权限,该帐户也用于 Cloud Functions,并且我可以确认它具有 Artifact Registry Reader 角色,因此这似乎不是权限问题。

我还尝试部署最小的 App Engine 服务而不是云功能,但出现了相同的错误。

非常感谢您的帮助。

Edo*_*kse 6

我花了一段时间,但我设法从一个项目获取 CF,以便从另一个项目下载包。

涉及几个步骤,其中一个步骤目前尚未记录。进行一些测试并查看日志帮助我缩小了实际行为的范围。

1:将包放在一个项目中。我将称该项目为repo-project
请注意,我上传的包是一个简单的包,42当调用其中的唯一函数时才会返回。任何 helloworld 包都应该足够了。

2:为云功能创建另一个项目。我将称该项目为cf-project

3:在一项目中创建服务帐户,并在repo-project. 我就这样称呼artifact-sa

4 这是未记录步骤:在. 该帐户名称的格式为cf-projectrepo-project<PROJECT-NUMBER>@cloudbuild.gserviceaccount.com

5:不确定是否需要这个,但我就是这样做的。我运行了下面的命令,指向下载的 JSON 版本artfact-sa
gcloud artifacts print-settings python --json-key="artifact-sa.json" --repository=REPO --location=LOCATION
这将打印出要--extra-index放入 a的值requirements.txt,其中包含 JSON 密钥。我认为使用 OP 提到的密钥环方法也可以在这里使用。
(请注意,我做了一些不需要的额外步骤,请参见下文,以确保密钥不会上传到附加到 CF 代码的任何 github 存储库)

6:按照您喜欢的方式部署代码。


概括

因此,总而言之,对存储库的第一次身份验证是使用您使用的任何 SA 完成的(例如,在密钥环中,或使用我上面描述的方法)。愚蠢的是,下载本身是通过您将云功能部署到的项目中的内置云构建 SA 完成的 ( cf-project)。恕我直言,这应该由与第一个相同的 SA 完成。

至于我如何发现 Cloud Build 的 SA 是问题所在,当我只添加到 时artifact-sarepo-project它在部署 CF 时确实找到了确切的文件并具有正确的版本号(检查日志中的错误)。它尝试下载该软件包,但得到了上述下载。 我遇到过其他场景,其中 Google 方面的 SA 内部使用有点不稳定,而 Cloud Build 绝对是一个惯犯。.whlcf-project403


额外的安全措施

我创建了一个辅助需求文件并将其添加到我的.gitignore文件中,以确保它不会上传到我的存储库,因为上传密钥是一个坏主意

要求.txt

-r privatereq.txt
mypythonpackage
Run Code Online (Sandbox Code Playgroud)

私人.req.txt

--extra-index-url https://_json_key_base64:[BASE64_KEY_SNIPPED]@[LOCATION]-python.pkg.dev/[REPO-PROJECT]/python-repo/simple/
Run Code Online (Sandbox Code Playgroud)

.gitignore

*/privatereq.txt
Run Code Online (Sandbox Code Playgroud)


小智 0

将要求指向:

--extra-index-url https://<location>-python.pkg.dev/<project>/<repository>/simple
<package>
Run Code Online (Sandbox Code Playgroud)

和主要进口:

from <package> import <module>
Run Code Online (Sandbox Code Playgroud)

对我有用。请记住在requirements.txt中重复您的包所需的模块(打包中的setup.cfg仅在构建过程中起作用)