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:
- Compila Cloud Run en contenedores
- Cómo configurar la cuenta de servicio de compilación
- Cómo configurar grupos de trabajadores de compilación
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
.
- Si usas la encriptación predeterminada, este bucket se llama
- Los buckets de origen y de carga no tienen período de retención.
- 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
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
Implementa la función mediante el comando
gcloud functions deploy
.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:
Haz clic en la función elegida en la lista que se muestra.
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:
- Crea tu grupo de trabajadores privados. Consulta Crea y administra grupos privados.
Configura el perímetro de los Controles del servicio de VPC. Consulta Usa los Controles del servicio de VPC.
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óncloudbuild.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.
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
- Evita que se use la cuenta de servicio de Compute predeterminada para la compilación
- Configura una cuenta de servicio nueva con permisos de alcance adecuados para usar en la compilación
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 campodockerRepository
.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:
- PROJECT_ID: El Google Cloud ID de tu proyecto.
- SA_EMAIL: Es la dirección de correo electrónico de tu cuenta de servicio.
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:
- FUNCTION_NAME: El nombre con el que implementaste la función.
- REGION: Es el nombre de la regiónGoogle Cloud en la que deseas implementar tu función
(por ejemplo,
us-west1
). - PROJECT_ID: El Google Cloud ID de tu proyecto.
- RUNTIME: El ID del entorno de ejecución de una
versión de entorno de ejecución compatible para ejecutar
tu función, por ejemplo,
nodejs18
. - CODE_ENTRYPOINT: el punto de entrada a tu función en tu código fuente. Este es el código que se ejecutará cuando se ejecute tu función.
- SA_EMAIL: Es la dirección de correo electrónico de tu cuenta de servicio.
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:
Usa la página de IAM en la consola de Google Cloud para encontrar la cuenta de servicio de Cloud Build.
Asegúrate de que se muestre el proyecto correcto en el menú desplegable del proyecto.
Busca
cloudbuild.gserviceaccount.com
. La dirección de correo electrónico con el formatoPROJECT_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.