Descripción general del proceso de compilación

En esta guía se muestra una descripción general del proceso de compilación de las funciones que se han desplegado mediante el comando gcloud functions. Para obtener información sobre el proceso de compilación de las funciones desplegadas con el comando gcloud run, consulta lo siguiente:

Cuando despliegas el código fuente de tu función con el comando gcloud functions deploy, se almacena en un segmento de Cloud Storage. A continuación, Cloud Build compila automáticamente tu código en una imagen de contenedor y la envía a un registro de imágenes.

El proceso de creación de la imagen es totalmente automático y no requiere que introduzcas nada directamente. Todos los recursos utilizados en el proceso de compilación se ejecutan en tu propio proyecto de usuario.

Ejecutar el proceso de compilación en tu proyecto significa que:

  • Tienes acceso directo a todos los registros de compilación.

  • No hay ninguna cuota de tiempo de compilación predefinida, aunque Cloud Build sí tiene su propia cuota de simultaneidad predeterminada.

  • Puedes ver la imagen de contenedor actual y las imágenes de contenedor desplegadas anteriormente, que se almacenan en Artifact Registry.

  • Cloud Storage se usa en tu proyecto para almacenar el directorio del código fuente de tus funciones. Ten en cuenta lo siguiente:

    • Si creas una función con la CLI de Google Cloud, se crea un segmento de subida para almacenar tu código fuente. Este segmento de subida se llama gcf-v2-uploads-PROJECT_NUMBER-REGION.cloudfunctions.appspot.com.
    • Una vez que se ha subido el código, se almacena en un segmento de origen independiente:
      • Si usas el cifrado predeterminado, este segmento se llama gcf-v2-sources-PROJECT_NUMBER-REGION.
      • Si proteges tus datos con CMEK, el nombre del segmento es gcf-v2-sources-PROJECT_NUMBER-REGION-CMEK_KEY_HASH.
    • Tanto el segmento de origen como el de subida no tienen ningún periodo de conservación.
.

Características del proceso de compilación

El proceso de compilación tiene las siguientes características:

  • La API Cloud Build debe estar habilitada en tu proyecto.

    Para habilitar la API manualmente, haz clic en el enlace anterior, selecciona tu proyecto en el menú desplegable y sigue las indicaciones para habilitar la interfaz de usuario.

  • Como todo el proceso de compilación se lleva a cabo en el contexto de tu proyecto, este está sujeto a los precios de los recursos incluidos:

    • Para consultar los precios de Cloud Build, visita la página Precios. Este proceso usa el tamaño de instancia predeterminado de Cloud Build, ya que estas instancias se precalientan y están disponibles más rápido. Cloud Build ofrece un nivel gratuito. Consulta el documento de precios para obtener más información.

    • Para consultar los precios de Cloud Storage, visita la página Precios. Cloud Storage ofrece un nivel gratuito. Consulta el documento de precios para obtener más información.

    • Para consultar los precios de Artifact Registry, ve a la página Precios.

  • Como el proceso de compilación está sujeto a facturación, tu proyecto debe tener una cuenta de facturación de Cloud vinculada.

Ver los registros de imágenes de compilación

Una de las principales ventajas de tener el proceso de compilación de imágenes en tu proyecto de usuario es el acceso a los registros de compilación. Puedes usar la CLI de gcloud o la Google Cloud consola para acceder a los registros, que están disponibles a través de Cloud Logging.

gcloud

  1. Despliega tu función con el gcloud functions deploy comando.

  2. La URL de los registros se muestra como parte de la respuesta en la ventana de tu terminal. Por ejemplo:

    Deploying function (may take a while - up to 2 minutes)...⠹
    **For Cloud Build Stackdriver Logs**, visit:
    https://console.cloud.google.com/logs/viewer?project=&advancedFilter=resource.type%
    3Dbuild%0Aresource.labels.build_id%3D38d5b662-2315-45dd-8aa2-
    380d50d4f5e8%0AlogName%3Dprojects%2F%
    2Flogs%2Fcloudbuild
    Deploying function (may take a while - up to 2 minutes)...done.

Google Cloud consola

Para ver los registros de funciones en la página de Cloud Run, sigue estos pasos:

  1. Ir a Cloud Run

  2. Haz clic en la función elegida en la lista que se muestra.

  3. Haz clic en la pestaña REGISTROS para obtener los registros de solicitudes y contenedores de todas las revisiones de esta función. Puedes filtrar por nivel de gravedad del registro.

Registro de imágenes

Artifact Registry se usa para almacenar las imágenes creadas a partir del código fuente de tu función. Las imágenes se almacenan en un repositorio llamado REGION-docker.pkg.dev/PROJECT_ID/gcf-artifacts ubicado en el mismo proyecto en el que se crea la función.

Para especificar un repositorio de Artifact Registry autogestionado, ejecuta el siguiente comando:

gcloud functions deploy FUNCTION_NAME \
   --docker-repository=REPOSITORY \
   [FLAGS...]

Haz los cambios siguientes:

  • FUNCTION_NAME: el nombre de la función.
  • REPOSITORY: el nombre de repositorio de Artifact Registry totalmente cualificado, con el siguiente formato: projects/PROJECT_NAME/locations/LOCATION/repositories/REPOSITORY.

Cuando especifiques un repositorio de Artifact Registry ubicado en otro proyecto u otra región, puede que tengas que tener en cuenta configuraciones adicionales:

Configuraciones de IAM:

  • Configuraciones de gestión de identidades y accesos: asegúrate de que la cuenta de servicio de compilación tenga acceso autorizado para leer y escribir en REPOSITORY.
  • Configuraciones de red: comprueba que se pueda acceder al REPOSITORY de la configuración del proyecto actual.
  • Configuraciones de Controles de Servicio de VPC: asegúrate de que la cuenta de servicio de compilación pueda acceder al REPOSITORY de destino dentro del perímetro de Controles de Servicio de VPC.
  • Restricciones de residencia de datos: si especificas un REPOSITORY en una región distinta a la de tu función, los datos se transferirán entre regiones.

Protege tu compilación con grupos privados

Para permitir que tus funciones usen dependencias (por ejemplo, paquetes npm), Cloud Build tiene acceso a Internet ilimitado de forma predeterminada durante el proceso de compilación. Si has configurado un perímetro de Controles de Servicio de VPC (VPC SC) y quieres limitar el acceso de la compilación solo a las dependencias almacenadas dentro del perímetro, puedes usar la función grupos de trabajadores privados de Cloud Build.

En general, sigue estos pasos para configurar tu grupo privado:

  1. Crea tu grupo de trabajadores privado. Consulta Crear y gestionar grupos privados.
  2. Configura tu perímetro de Controles de Servicio de VPC. Consulta Usar Controles de Servicio de VPC.

  3. Si tu grupo de trabajadores privado está en un proyecto diferente al de tu función, debes conceder el rol cloudbuild.workerPoolUser a la cuenta de servicio del agente de servicio de Cloud Functions (service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) para que el servicio Cloud Build pueda acceder al grupo de trabajadores.

    gcloud projects add-iam-policy-binding PRIVATE_POOL_PROJECT_ID \
        --member serviceAccount:service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
        --role roles/cloudbuild.workerPoolUser

    Sustituye FUNCTION_PROJECT_NUMBER por el número del proyecto en el que se ejecuta la función y PRIVATE_POOL_PROJECT_ID por el ID del proyecto en el que se encuentra el grupo de trabajadores. Consulta más información en el artículo Ejecutar compilaciones en un grupo privado.

  4. Despliega tu función para compilarla con un grupo privado:

    gcloud functions deploy FUNCTION_NAME \
       --runtime RUNTIME \
       --build-worker-pool PRIVATE_POOL_NAME
       [FLAGS...]

    Sustituye FUNCTION_NAME por el nombre de la función, RUNTIME por el tiempo de ejecución que estés usando y PRIVATE_POOL_NAME por el nombre de tu grupo.

Para dejar de usar un grupo privado determinado y usar el grupo predeterminado de Cloud Build, usa la marca --clear-build-worker-pool al volver a desplegar.

gcloud functions deploy FUNCTION_NAME \
   --runtime RUNTIME \
   --clear-build-worker-pool
   [FLAGS...]

Sustituye FUNCTION_NAME por el nombre de la función y RUNTIME por el tiempo de ejecución que estés usando.

Protege tu compilación con una cuenta de servicio personalizada

El código fuente de tu función se envía a Cloud Build para que se cree un contenedor. La función en contenedores se almacena en Artifact Registry y se despliega en Cloud Run como servicio. 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 predeterminada de Cloud Build 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. 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.

En los Google Cloud proyectos creados antes de julio del 2024, Cloud Build usa la cuenta de servicio de Cloud Build antigua. Esta cuenta de servicio se ha diseñado para ayudar a los usuarios a ejecutar una amplia gama de casos prácticos que pueden ser demasiado permisivos para las necesidades de tu proyecto. Si quieres mover tus proyectos de esta cuenta de servicio, puedes seguir estos pasos para proteger aún más tu entorno de compilación de funciones:

Evitar que se use la cuenta de servicio antigua de Cloud Build para las compilaciones

Para comprobar si tu proyecto usa la cuenta de servicio de Cloud Build antigua, consulta los detalles de la compilación de tu función. La cuenta de servicio de compilación predeterminada tiene el siguiente formato:

PROJECT_NUMBER@cloudbuild.gserviceaccount.com.

Puedes inhabilitar el uso de esta cuenta de servicio de forma obligatoria configurando la restricción de la política de la organización cloudbuild.useBuildServiceAccount en Not Enforced. También puedes limitar su capacidad para acceder a los recursos de Google Cloudsi le quitas todos los permisos de rol.

Evitar que se use la cuenta de servicio predeterminada de Compute para la compilación

La cuenta de servicio predeterminada de Compute tiene el formato PROJECT_NUMBER-compute@developer.gserviceaccount.com. Para inhabilitar esta opción como predeterminada para la compilación, define la política de organización cloudbuild.useComputeServiceAccount como Not Enforced. También puedes inhabilitar esta cuenta de servicio para que no se pueda usar para acceder a los recursos de Google Cloud .

Proporcionar una cuenta de servicio para compilar funciones

Como parte de la configuración de una función, puedes especificar una cuenta de servicio de compilación al desplegar la función. Si no se pueden usar la cuenta de servicio de Cloud Build antigua ni la cuenta de servicio predeterminada de Compute para compilar, debes especificar una cuenta de servicio de compilación para desplegar una función, tal como se describe en esta sección.

Si te afectan los cambios descritos en Cambio en la cuenta de servicio de Cloud Build, puedes hacer una de las siguientes acciones:

  • 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.

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.

En las siguientes secciones se muestra cómo crear una cuenta de servicio de Cloud Build personalizada para las implementaciones de funciones.

Crear una cuenta de servicio

Crea una cuenta de servicio como se describe en el artículo Crear cuentas 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 "run-sources-*", "gcf-v2-sources-*" y "gcf-v2-uploads-*". Para ello, puedes añadir una condición de gestión de identidades y accesos a la concesión de roles, como (resource.type == "storage.googleapis.com/Object" && (resource.name.startsWith("projects/_/buckets/gcf-v2-sources-") || resource.name.startsWith("projects/_/buckets/gcf-v2-uploads-") || resource.name.startsWith("projects/_/buckets/run-sources-")))

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

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

Para transferir una cuenta de servicio creada por el usuario que Cloud Build usará al desplegar tu función, ejecuta el siguiente comando gcloud:

  • 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 \
   --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:

Conceder acceso a la cuenta de servicio de Cloud Build al perímetro de Controles de Servicio de VPC

Las funciones de Cloud Run usan Cloud Build para compilar el código fuente en un contenedor ejecutable. Para usar funciones de Cloud Run con Controles de Servicio de VPC, debes configurar tu cuenta de servicio de Cloud Build (ya sea la predeterminada o una personalizada) para que tenga acceso a tu perímetro de servicio.

Buscar el nombre de la cuenta de servicio

Si usas la cuenta de servicio predeterminada de Cloud Build, puedes encontrar su nombre de la siguiente manera:

  1. Usa la página IAM de la Google Cloud consola para encontrar la cuenta de servicio de Cloud Build.

    Abrir IAM

  2. Asegúrese de que el proyecto correcto se muestre en el menú desplegable de proyectos.

  3. Buscar cloudbuild.gserviceaccount.com. La dirección de correo del formulario PROJECT_NUMBER@cloudbuild.gserviceaccount.com es el nombre de la cuenta de servicio.

Si tienes una cuenta de servicio de Cloud Build personalizada, usa ese nombre.

Concede a la cuenta de servicio acceso al perímetro de servicio

Una vez que tengas el nombre de la cuenta de servicio, sigue la guía Limitar el acceso por usuario o cuenta de servicio para crear un nivel de acceso para la cuenta de servicio. A continuación, sigue los pasos de la sección Añadir un nivel de acceso a un perímetro ya creado para añadir el nivel de acceso al perímetro de servicio.