Cuenta de servicio personalizada para Cloud Build (1.ª gen.)

Cloud Run Functions aprovecha Cloud Build al compilar y desplegar tu función de Cloud Run. De forma predeterminada, las funciones de Cloud Run usan la cuenta de servicio de Cloud Build predeterminada como principal al realizar la compilación. Desde julio del 2024, Cloud Build ha cambiado el comportamiento predeterminado de cómo usa las cuentas de servicio en los proyectos nuevos. Este cambio se describe en el artículo Cambio en la cuenta de servicio de Cloud Build. Como resultado de este cambio, es posible que los proyectos nuevos que desplieguen funciones por primera vez usen una cuenta de servicio de Cloud Build predeterminada con permisos insuficientes para compilar una función. Si te afecta este cambio, puedes hacer lo siguiente:

  • Consulta las directrices de Cloud Build sobre los cambios en la cuenta de servicio predeterminada y rechaza estos cambios.

  • Añade el rol de cuenta de Cloud Build (roles/cloudbuild.builds.builder) a la cuenta de servicio predeterminada de Compute Engine.

  • Crea una cuenta de servicio de Cloud Build personalizada para las implementaciones de funciones.

En este documento se describe cómo introducir una cuenta de servicio creada por el usuario para que la use Cloud Build al desplegar tu función.

Puedes desplegar funciones con cuentas de servicio personalizadas mediante la CLI de Google Cloud, laGoogle Cloud consola o la API de funciones de Cloud Run.

A continuación, se indican algunos casos en los que puede que quieras proporcionar una cuenta de servicio diferente para que Cloud Build la use al compilar tu función:

  • Quieres tener más control sobre las cuentas de servicio que se añaden a tu perímetro de VPC-SC.

  • Quieres que Cloud Build se ejecute con permisos diferentes a los que tiene la cuenta de servicio predeterminada sin tener que revocar cada permiso individualmente.

  • Quieres definir permisos de Cloud Build granulares específicamente para tus funciones, no compartir una cuenta de servicio de Cloud Build optimizada para otros fines.

  • Tu organización ha inhabilitado el uso de la cuenta de servicio predeterminada.

Habilitar APIs

Para usar esta función, la API IAM debe estar habilitada.

Usa la CLI de Google Cloud para habilitar las APIs necesarias para desplegar una función de Cloud Run o usa la Google Cloud consola:

gcloud services enable iam.googleapis.com

Configurar cuenta de servicio

En este documento se describe cómo crear una cuenta de servicio y conceder los permisos necesarios. Si quieres usar una cuenta de servicio que ya tengas, necesitas la dirección de correo de la cuenta que quieras usar. Consulta más información sobre cómo configurar cuentas de servicio especificadas por los usuarios.

Puedes ver tus cuentas de servicio de la siguiente manera o usar la consola:Google Cloud

gcloud iam service-accounts list

Crear cuenta de servicio

Usa la CLI de Google Cloud para crear tu cuenta de servicio o usa la consola: Google Cloud

gcloud iam service-accounts create SA_EMAIL

Sustituye SA_EMAIL por la dirección de correo de tu cuenta de servicio.

Conceder permisos

La cuenta de servicio que utilices deberá tener los siguientes roles:

  • roles/logging.logWriter: se requiere para almacenar registros de compilación en Cloud Logging.
  • roles/artifactregistry.writer— Obligatorio para almacenar imágenes de compilación en Artifact Registry. Para que se aplique el comportamiento predeterminado, la cuenta de servicio debe tener acceso a los repositorios "gcf-artifacts" y "cloud-run-source-deploy". El acceso a los repositorios se puede definir en la política de gestión de identidades y accesos del repositorio. También puede proporcionar su propio repositorio de artefactos a través del campo dockerRepository.
  • roles/storage.objectViewer— Obligatorio para obtener el origen de la función del segmento de Cloud Storage y para almacenar imágenes de compilación en Container Registry. Para que se aplique el comportamiento predeterminado, la cuenta de servicio debe tener acceso a los contenedores llamados "gcf-sources-*". Para ello, puedes añadir una condición de gestión de identidades y accesos a la concesión de roles, como la siguiente: (resource.type == "storage.googleapis.com/Object" && (resource.name.startsWith("gcf-sources-")))

  • roles/storage.objectAdmin: obligatorio para el registro de contenedores (ahora obsoleto). Necesita acceso a los contenedores llamados *.artifacts.PROJECT_ID.appspot.com para acceder al registro de contenedores.

Concede los siguientes roles con Google Cloud CLI o con la consolaGoogle Cloud .

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
    --role=roles/logging.logWriter

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/artifactregistry.writer

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/storage.objectViewer

gcloud projects add-iam-policy-binding PROJECT_ID \
--member=serviceAccount:SA_EMAIL \
--role=roles/storage.objectAdmin

Haz los cambios siguientes:

Consideraciones sobre los Controles de Servicio de VPC

Si tienes un perímetro de Controles de Servicio de VPC que protege tanto tu proyecto como la API de funciones de Cloud Run, y usas la cuenta de servicio predeterminada de Compute Engine como el rol Cuenta de servicio de Cloud Build para las funciones de Cloud Run, debes crear las siguientes reglas de entrada:

  • Permite que la cuenta de servicio predeterminada de Compute Engine acceda a todos los métodos de las APIs Cloud Storage y Cloud Logging.
  • Permite el acceso service-[PROJECT_NUMBER]@gcf-admin-robot.iam.gserviceaccount.com de la cuenta de servicio a todos los métodos de las APIs Cloud Storage y Cloud Logging.

Implementar una función con una cuenta de servicio personalizada

Puedes usar la CLI de Google Cloud para desplegar una función que use una cuenta de servicio personalizada para Cloud Build:

  • La marca --build-service-account especifica una cuenta de servicio de IAM cuyas credenciales se usarán en el paso de compilación. Si no se proporciona una cuenta de servicio personalizada, la función usa la cuenta de servicio predeterminada del proyecto para Cloud Build.
  • También puede usar un grupo privado, que se especifica con la marca --build-worker-pool.

gcloud functions deploy FUNCTION_NAME \
   --no-gen2 \
   --region=REGION \
   --project=PROJECT_ID \
   --runtime=RUNTIME \
   --entry-point=CODE_ENTRYPOINT \
   --build-service-account=projects/PROJECT_ID/serviceAccounts/SA_EMAIL \
   --memory=256Mi \
   --trigger-http \
   --source=.

Haz los cambios siguientes: