Descripción general del proceso de compilación

En esta guía, se muestra la descripción general del proceso de compilación de las funciones que se implementaron con el comando gcloud functions. Para obtener información sobre el proceso de compilación de las funciones implementadas con el comando gcloud run, consulta los siguientes recursos:

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

Todo el proceso de compilación de la imagen es automático y no requiere ninguna entrada de tu parte. Todos los recursos usados en el proceso de compilación se ejecutan en tu propio proyecto de usuario.

Ejecutar el proceso de compilación dentro de tu proyecto implica lo siguiente:

  • Tienes acceso directo a todos los registros de compilaciones.

  • No existe una cuota de tiempo de compilación predeterminada, aunque Cloud Build tiene su propia cuota de simultaneidad predeterminada.

  • Puedes visualizar la imagen del contenedor actual y las imágenes de contenedores implementadas con anterioridad, las cuales se almacenan en Container 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 Google Cloud CLI, se crea un bucket de carga para almacenar tu código fuente. Este bucket de carga se llama gcf-v2-uploads-PROJECT_NUMBER-REGION.cloudfunctions.appspot.com.
    • Después de subir el código, el código de la función se almacena en un bucket de fuente independiente:
      • Si usas la encriptación predeterminada, este bucket se llama gcf-v2-sources-PROJECT_NUMBER-REGION.
      • Si proteges tus datos con CMEK, el bucket se llama gcf-v2-sources-PROJECT_NUMBER-REGION-CMEK_KEY_HASH.
    • Los buckets de origen y de carga no tienen período de retención.

Características del proceso de compilación

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

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

    Para habilitar la API de forma manual, haz clic en el vínculo anterior, selecciona tu proyecto en el menú desplegable y sigue las indicaciones para habilitar la IU.

  • Debido a que todo el proceso de compilación se produce dentro del contexto de tu proyecto, este está sujeto a los precios de los recursos incluidos:

    • Para obtener los precios de Cloud Build, consulta la página Precios. Este proceso usa el tamaño de instancia predeterminado de Cloud Build, ya que estas instancias se preparan de forma previa y están disponibles más rápido. Cloud Build proporciona un nivel gratuito: revisa el documento de precios para obtener más detalles.

    • Para obtener los precios de Cloud Storage, consulta la página Precios. Cloud Storage proporciona un nivel gratuito: revisa el documento de precios para obtener más información.

    • Para obtener los precios de Artifact Registry, consulta la página Precios.

  • Debido a que el proceso de compilación está sujeto a facturación, tu proyecto debe tener una cuenta de Facturación de Cloud adjunta.

Visualiza los registros de imágenes de compilación

Un beneficio clave de tener el proceso de imagen de compilación en tu proyecto de usuario es acceso a los registros de compilación. Puedes usar gcloud CLI o la consola de Google Cloud para acceder a los registros, que están disponibles a través de Cloud Logging.

gcloud

  1. Implementa la función mediante el comando gcloud functions deploy.

  2. La URL de los registros se muestra como parte de la respuesta en la ventana de la 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 console

Para ver los registros de las funciones en la página de Cloud Run, haz lo siguiente:

  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 solicitud y contenedor 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 compiladas 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 que se encuentra en el mismo proyecto en el que se crea tu función.

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

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

Reemplaza lo siguiente:

  • FUNCTION_NAME: Es el nombre de la función.
  • REPOSITORY: El nombre del repositorio de Artifact Registry completamente calificado, en el siguiente formato: projects/PROJECT_NAME/locations/LOCATION/repositories/REPOSITORY.

Cuando especifiques un repositorio de Artifact Registry ubicado en un proyecto o una región diferente, es posible que debas considerar configuraciones adicionales:

Configuraciones de IAM:

  • Parámetros de configuración de IAM: Asegúrate de que la cuenta de servicio de compilación tenga permiso autorizado para leer y escribir en REPOSITORY.
  • Parámetros de configuración de red: Asegúrate de que se pueda acceder al REPOSITORY de destino desde la configuración del proyecto actual.
  • Parámetros de configuración de los Controles del servicio de VPC: Asegúrate de que la cuenta de servicio de compilación pueda llegar al REPOSITORY de destino dentro del perímetro de VPC-SC.
  • Restricciones de residencia de datos: Especificar un REPOSITORY en una región diferente de la región en la que se encuentra tu función provocará la transferencia de datos entre regiones.

Protege tu compilación con grupos privados

Para permitir que las funciones usen dependencias (por ejemplo, paquetes de Administración de socios de red), Cloud Build tiene acceso ilimitado a Internet de forma predeterminada durante el proceso de compilación. Si configuraste un perímetro de los Controles del servicio de VPC (VPC SC) y deseas limitar el acceso de la compilación solo a las dependencias almacenadas dentro del perímetro, puedes usar la función de los Grupos de trabajadores privados de Cloud Build.

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

  1. Crea tu grupo de trabajadores privados. Consulta Crea y administra grupos privados.
  2. Configura el perímetro de los Controles del servicio de VPC. Consulta Usa los Controles del servicio de VPC.

  3. Si tu grupo de trabajadores privados está en un proyecto diferente al de tu función, debes otorgar a la cuenta de servicio (service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) del agente de servicio de Cloud Functions la función cloudbuild.workerPoolUser para que el servicio de 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

    Reemplaza 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 Ejecuta compilaciones en un grupo privado para obtener más información.

  4. Implementa la función para compilar con un grupo privado:

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

    Reemplaza FUNCTION_NAME por el nombre de la función, RUNTIME por el entorno de ejecución que usas y PRIVATE_POOL_NAME por el nombre de tu grupo.

Para dejar de usar un grupo privado determinado y, en su lugar, usar el grupo predeterminado de Cloud Build, usa la marca --clear-build-worker-pool cuando vuelvas a implementar.

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

Reemplaza FUNCTION_NAME por el nombre de la función y RUNTIME por el entorno de ejecución que usas.

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 almacene en contenedores. La función alojada en contenedores se almacena en Artifact Registry y se implementa en Cloud Run como un servicio. Cloud Run Functions aprovecha Cloud Build cuando se compila y se implementa la función de Cloud Run. De forma predeterminada, Cloud Run Functions usa la cuenta de servicio predeterminada de Cloud Build como la principal para realizar tu compilación. A partir de julio de 2024, Cloud Build cambió el comportamiento predeterminado de la forma en que Cloud Build usa cuentas de servicio en proyectos nuevos. Como resultado de este cambio, es posible que los proyectos nuevos que implementan funciones por primera vez usen una cuenta de servicio predeterminada de Cloud Build con permisos insuficientes para compilar una función.

En el caso de los Google Cloud proyectos creados antes de julio de 2024, Cloud Build usa la cuenta de servicio heredada de Cloud Build. Esta cuenta de servicio se diseñó para ayudar a los usuarios a ejecutar una amplia variedad de casos de uso que pueden ser demasiado permisivos para las necesidades de tu proyecto. Si deseas trasladar tus proyectos existentes de esta cuenta de servicio, puedes seguir estos pasos para proteger aún más tu entorno de compilación de funciones:

Evita que se use la cuenta de servicio heredada de Cloud Build para la compilación

Para verificar que tu proyecto use la cuenta de servicio de Cloud Build heredada, inspecciona 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.

Para inhabilitar de forma forzosa el uso de esta cuenta de servicio, configura la restricción cloudbuild.useBuildServiceAccount de la política de la organización como Not Enforced. Como alternativa, quitar todos sus otorgamientos de roles limitará su capacidad para acceder a los recursos de Google Cloud.

Evita que se use la cuenta de servicio de procesamiento predeterminada para la compilación

La cuenta de servicio de procesamiento predeterminada tiene el formato PROJECT_NUMBER-compute@developer.gserviceaccount.com. Para inhabilitar que sea el valor predeterminado que se usa para la compilación, configura la política de la organización cloudbuild.useComputeServiceAccount como Not Enforced. Como alternativa, inhabilitar esta cuenta de servicio evita que se use para acceder a los recursos de Google Cloud .

Proporciona 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 cuando la implementes. Cuando se impide que se usen la cuenta de servicio heredada de Cloud Build y la cuenta de servicio de procesamiento predeterminada para la compilación, debes especificar una cuenta de servicio de compilación para implementar una función, como se describe en esta sección.

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

  • Revisar la guía de Cloud Build sobre los cambios en la cuenta de servicio predeterminada y, también, inhabilitar estos cambios.

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

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

Estas son algunas situaciones en las que tal vez quieras proporcionar una cuenta de servicio diferente para que se use cuando Cloud Build compile tu función:

  • Quieres tener más control sobre las cuentas de servicio que se agregarán al perímetro de VPC--SC.

  • Deseas que Cloud Build se ejecute con permisos diferentes de los que tiene la cuenta de servicio predeterminada sin tener que revocar cada permiso de forma individual.

  • Deseas configurar permisos detallados de Cloud Build específicamente para tus funciones, no compartir una cuenta de servicio de Cloud Build que esté optimizada para otros fines.

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

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

Crea una cuenta de servicio

Crea una cuenta de servicio nueva como se describe en Crea una cuenta de servicio.

Otorgar permisos

La cuenta de servicio que uses necesitará los siguientes roles:

  • roles/logging.logWriter: Obligatorio para almacenar registros de compilación en Cloud Logging.
  • roles/artifactregistry.writer: Obligatorio para almacenar imágenes de compilación en Artifact Registry. Para el comportamiento predeterminado, la cuenta de servicio necesita acceso a los repositorios denominados "gcf-artifacts" y "cloud-run-source-deploy". El acceso a los repositorios se puede configurar en la política de IAM del repositorio. Como alternativa, puedes proporcionar tu propio repositorio de artefactos a través del campo dockerRepository.
  • roles/storage.objectViewer: Obligatorio para recuperar la fuente de función del bucket de Cloud Storage y almacenar imágenes de compilación en Container Registry. Para el comportamiento predeterminado, la cuenta de servicio necesita acceso a los buckets denominados "run-sources-*", "gcf-v2-sources-*" y "gcf-v2-uploads-*". Para lograrlo, agrega una condición de IAM 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-")))

Otorga los siguientes roles con Google Cloud CLI o usa la consola deGoogle 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

Reemplaza lo siguiente:

Consideraciones sobre los Controles del servicio de VPC

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

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

Implementa una función con una cuenta de servicio personalizada

Para pasar una cuenta de servicio creada por el usuario que usará Cloud Build cuando implementes 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 para 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.
  • De manera opcional, puedes usar un grupo privado, que especificas 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=.

Reemplaza lo siguiente:

Otorga acceso a la cuenta de servicio de Cloud Build al perímetro de los Controles del servicio de VPC

Cloud Run Functions usa Cloud Build para compilar tu código fuente en un contenedor ejecutable. Para usar Cloud Run Functions con los Controles del servicio de VPC, debes configurar la cuenta de servicio de Cloud Build (ya sea predeterminada o personalizada) para que tenga acceso al perímetro de servicio.

Busca 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 de IAM en la consola de Google Cloud para encontrar la cuenta de servicio de Cloud Build.

    Abrir IAM

  2. Asegúrate de que se muestre el proyecto correcto en el menú desplegable del proyecto.

  3. Busca cloudbuild.gserviceaccount.com. La dirección de correo electrónico con el formato PROJECT_NUMBER@cloudbuild.gserviceaccount.com es el nombre de la cuenta de servicio.

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

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

Una vez que tengas el nombre de la cuenta de servicio, sigue la guía en Limita el acceso por usuario o cuenta de servicio a fin de crear un nivel de acceso para la cuenta de servicio. Luego, para agregar el nivel de acceso a tu perímetro de servicio, consulta Agrega un nivel de acceso a un perímetro existente.