es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

GCP Cloud Run no puede descargar la imagen de Artifact Registry en otro proyecto.

Tengo un proyecto padre que tiene un registro de artefactos configurado para Docker.

Un proyecto hijo tiene un servicio de Cloud Run que necesita obtener su imagen del padre.

El proyecto hijo también tiene una cuenta de servicio que está autorizada para acceder al repositorio a través de un rol de IAM roles/artifactregistry.writer.

Cuando intento iniciar mi servicio, obtengo un mensaje de error:

El Agente de Servicio de Google Cloud Run debe tener permisos para leer la imagen,
europe-west1-docker.pkg.dev/test-parent-project/docker-webank-private/node:custom-1.
Asegúrese de que la URL de la imagen del contenedor proporcionada sea correcta y de que la
cuenta mencionada tenga permisos para acceder a la imagen. Si acaba de habilitar
la API de Cloud Run, los permisos podrían tardar unos minutos en propagarse. Tenga en cuenta que la imagen es del proyecto [test-parent-project], que
no es el mismo que este proyecto [test-child-project]. Se debe otorgar permiso al
Agente de Servicio de Google Cloud Run desde este proyecto.

He probado a conectar manualmente con docker login y utilizando la clave privada de la cuenta de servicio y el comando docker pull funciona perfectamente desde mi PC.


cat $GOOGLE_APPLICATION_CREDENTIALS | docker login -u _json_key --password-stdin https://europe-west1-docker.pkg.dev

Inicio de sesión exitoso
docker pull europe-west1-docker.pkg.dev/bfb-cicd-inno0/docker-webank-private/node:custom-1
OK

La cuenta de servicio también está asociada al servicio de Cloud Run:

enter image description here

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver el mensaje de error y permitir que el servicio Cloud Run del proyecto hijo extraiga la imagen del registro de artefactos del proyecto padre a través de la cuenta de servicio, se deben seguir los siguientes pasos:

    1. Otorgar el rol IAM roles/storage.objectViewer al Agente de Servicio de Google Cloud Run en el bucket de almacenamiento del proyecto padre que contiene la imagen Docker.
      gsutil iam ch serviceAccount:service-[PROJECT-NUMBER]@serverless-robot-prod.iam.gserviceaccount.com:roles/storage.objectViewer gs://[BUCKET-NAME]
      

      Reemplazar [PROJECT-NUMBER] con el número de proyecto del proyecto padre y [BUCKET-NAME] con el nombre del bucket de almacenamiento que contiene la imagen Docker.

    2. Otorgar el rol IAM roles/artifactregistry.reader al Agente de Servicio de Google Cloud Run en el Registro de Artefactos del proyecto padre.

      gcloud projects add-iam-policy-binding [PARENT-PROJECT-ID] --member=serviceAccount:service-[PROJECT-NUMBER]@serverless-robot-prod.iam.gserviceaccount.com --role=roles/artifactregistry.reader
      

      Reemplazar [PARENT-PROJECT-ID] con el ID de proyecto del proyecto padre y [PROJECT-NUMBER] con el número de proyecto del proyecto hijo.

    3. Utilizar el nombre de imagen completamente calificado al implementar el servicio Cloud Run en el proyecto hijo.

      gcloud run deploy [SERVICE-NAME] --image=europe-west1-docker.pkg.dev/[PARENT-PROJECT-ID]/[IMAGE-NAME]:[TAG] --platform=managed --allow-unauthenticated
      

      Reemplazar [SERVICE-NAME] con el nombre del servicio Cloud Run, [PARENT-PROJECT-ID] con el ID de proyecto del proyecto padre, [IMAGE-NAME] con el nombre de la imagen Docker (sin la etiqueta) y [TAG] con la etiqueta de la imagen Docker.

Comments are closed.