我正在尝试将Google Artifacts中的python包安装到我们的Google Composer环境中。
我遵循了以下步骤:
https://towardsdatascience.com/if-you-are-using-python-and-google-cloud-platform-this-will-simplify-life-for-you-part-2-bef56354fd4c
https://cloud.google.com/composer/docs/how-to/using/installing-python-dependencies#console
gcloud composer environments update test --update-pypi-package testpackage==0.34 --location europe-west2
我从云构建日志中得到了一个非常模糊的错误:
Step 7/11 : RUN bash installer.sh $COMPOSER_PYTHON_VERSION fail
+ COMPOSER_PYTHON_VERSION=3
+ FAIL_ON_CONFLICT=fail
+ '[' 3 == 3 ']'
+ PYTHON=python3
+ echo 'Installing Python3 Requirements.'
Installing Python3 Requirements.
+ python3 -m pip install -r requirements.txt
Looking in indexes: https://pypi.org/simple, https://europe-west1-python.pkg.dev/gcp-project-name/repo-name/simple/
ERROR: Could not find a version that satisfies the requirement testpackage==0.34 (from -r requirements.txt (line 1)) (from versions: none)
ERROR: No matching distribution found for testpackage==0.34 (from -r requirements.txt (line 1))
The command '/bin/sh -c bash installer.sh $COMPOSER_PYTHON_VERSION fail' returned a non-zero code: 1
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/docker" failed: step exited with non-zero status: 1
你可以看到它正在增加额外的索引(https://europe-west1-python.pkg.dev/gcp-project-name/repo-name/simple/)从我按照步骤创建的pip.conf文件中,但看起来它甚至没有尝试?因为那样的话,我会得到一个不同的错误。
如果我只在机器上本地测试安装,它可以使用相同的pip.conf设置。我检查了云日志中的所有日志,实际上什么都没有。我看到的只有:
Critical error.
Failed to install pypi packages.
有没有什么地方可以让我找到一个更具描述性的错误呢?
您是否已授予Composer Service Agent服务帐户的权限?这是GCP将用于在您的项目中为Cloud Composer创建资源的服务帐户。
如果此服务帐户无权查看存储库中的工件并从中获取工件,则当您尝试将工件从存储库安装到Cloud Composer环境中时,更新环境将失败。
默认情况下,它具有Cloud Composer API Service Agent
角色,其中包括:
artifactregistry.repositories.create
artifactregistry.repositories.delete
artifactregistry.repositories.get
artifactregistry.repositories.list
artifactregistry.repositories.update
请尝试在项目中授予此服务帐户roles/artifactregistry.reader
角色。
Composer服务帐户的文档在这里,您可以在这里查看它附带的角色的权限。
工件注册表的角色和权限在这里。
我最终发现了我遇到的真正问题(在评论Daniel的回答中提到(。这是一个问题,因为(a(需要跨项目访问,以及(b(Composer使用的隐藏服务帐户。
跨项目工件注册表访问
我们需要将IAM成员资格的配置连接器编辑为以下内容:
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
name: composer-x-prj-dev-artifactregistry-reader
spec:
member: serviceAccount:composer@my-project.iam.gserviceaccount.com
role: roles/artifactregistry.reader
resourceRef:
kind: Project
external: projects/other-project
我认为这会解决问题,因为这是我与Cloud Composer关联的服务帐户。
隐藏的服务帐户
但是,当Cloud Composer正在构建自己时,它不会通过您与其关联的服务帐户来执行此操作。相反,它使用构建代理的服务帐户,而您别无选择,只能使用此构建代理服务帐户。
因此,我们需要给予构建代理进一步的访问权限。所以我不得不用正确的服务帐户修复上面的舵图:
apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
name: composer-x-prj-dev-artifactregistry-reader
spec:
member: serviceAccount:<my-project-NUMBER>@cloudbuild.gserviceaccount.com
role: roles/artifactregistry.reader
resourceRef:
kind: Project
external: projects/other-project
除了列出的成员之外,这与前面的相同。请注意,您不会在IAM控制台或gcloud
CLI中的任何位置找到该服务帐户。这是一个隐藏帐户,对于GCP中的任何项目都始终存在,并且该帐户始终为<your_project_NUMBER>@cloudbuild.gserviceaccount.com
。