1

我正在使用 Gitlab CI 构建 docker 映像并将它们推送到 GCR。我的脚本是这样的 -

build:
  image: google/cloud-sdk
  services:
    - docker:dind
  stage: build
  cache:
  script:
    - echo "$GCP_SERVICE_KEY" > gcloud-service-key.json # Google Cloud service accounts
    - gcloud auth activate-service-account --key-file gcloud-service-key.json
    - gcloud auth configure-docker --quiet
    - gcloud config set project $GCP_PROJECT_ID
    - echo ${IMAGE_NAME}:${IMAGE_TAG}
    - PYTHONUNBUFFERED=1 gcloud builds submit -t ${IMAGE_NAME}:${IMAGE_TAG} .
  only:
    - master

我收到了这个错误-

ERROR: (gcloud.builds.submit) HTTPError 403: <service account name>@<projectname>.iam.gserviceaccount.com does not have storage.buckets.list access to project <projectid>.

授予服务帐户Cloud Editor权限后,我收到错误 -

ERROR: (gcloud.builds.submit) User [<service account name>@<projectname>.iam.gserviceaccount.com] does not have permission to access b [<bucker_name>] (or it may not exist): <service account name>@<projectname>.iam.gserviceaccount.com does not have storage.buckets.get access to <bucket_name>

我必须向服务帐户授予什么权限才能实现这一目标?

4

1 回答 1

1

从错误:

<service account name>@<projectname>.iam.gserviceaccount.com
does not have storage.buckets.list access to project <projectid>

我怀疑<projectname><projectid>参考了 2 个不同的项目。

拥有服务帐户 ( <projectname>) 的项目很可能拥有storage.[buckets|objects].*权限,但这些权限将适用于由 控制的 GCS 资源<projectname>而不适用于由控制的资源<projectid>

NB是的,看到不同类型的键引用的项目令人困惑,但要确认,将 的ProjectID<projectname>进行比较<projectid>。替换<projectname>为下面的值以检索ProjectID

gcloud projects list --filter="name=<projectname> --format="value(projectId)"

有两种方法可以允许身份访问 GCS 资源。第一个是(如上所述)在项目级别创建这些。第二个是将这些应用到特定的存储桶。

请参阅下面的链接以获取指导。这是针对 Cloud Build 的服务帐户,但原理是一样的。服务帐户(在项目中<projectname>)需要有权访问 GCS 资源<projectid>

https://cloud.google.com/cloud-build/docs/securing-builds/set-service-account-permissions#push_private_images_to_others

于 2019-08-15T19:50:13.317 回答