Compila imágenes de Cloud Functions

Descripción general

Cuando implementas el código fuente de la función en Cloud Functions, 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 Container Registry. Cloud Functions accede a esta imagen cuando necesita ejecutar el contenedor para ejecutar la función.

Todo el proceso de compilación de la imagen es automático y no requiere ninguna entrada de tu parte. Sin embargo, hay una leve diferencia entre el proceso para los entornos de ejecución anteriores de Node.js 8 y Go 1.11, y el proceso actual para todos los demás entornos de ejecución: Java 11, Python 3.7, Python 3.8, Node.js 10 y Go 1.13.

Entornos de ejecución de Node.js 8 y Go 1.11

Para los entornos de ejecución más antiguos, el proceso de compilación no se produce en tu proyecto del usuario, sino en un proyecto relacionado, llamado proyecto de usuario. Ejecutar la compilación en un proyecto de usuario resolvió algunos problemas asociados con esos entornos de ejecución, pero también creó algunos problemas nuevos:

  • Debido a que la compilación no se produce en el proyecto, no tienes acceso a los registros de compilación para ordenar los problemas de compilación que puedas encontrar.

  • Este proceso requiere una cuota diaria de tiempo de compilación interna, que, en ciertas circunstancias bastante comunes, se puede agotar. Esto puede limitar la capacidad para implementar un código fuente nuevo hasta que se reabastezca la cuota.

  • No tienes acceso a Container Registry, en el que se almacena la imagen de contenedor de la función, por lo que no tienes manera de ver las imágenes disponibles.

Entornos de ejecución más nuevos

En los entornos de ejecución más nuevos que no se mencionaron antes, como Java 11, Python 3.7, Node.js 10 y Go 1.13 o versiones posteriores, todos los recursos que se usaron en el proceso de compilación ahora se ejecutan en tu propio proyecto de usuario, no el proyecto de grupo de usuarios. Ahora es el proceso predeterminado.

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 la imagen del contenedor implementada con anterioridad, las cuales se almacenan en Container Registry.

  • Debido a que Cloud Storage se usa directamente en tu proyecto, el directorio del código fuente de las funciones es visible en un bucket llamado gcf-sources-<PROJECT_NUMBER>-<REGION>.

Características del proceso predeterminado

Como resultado de este cambio, todos los entornos de ejecución que usan el proceso predeterminado tienen 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 haz clic en Continuar.

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

Accede a los registros de imágenes de compilación

Un beneficio clave de tener el proceso de imágenes de compilación en tu proyecto de usuario es el acceso a los registros de compilación. Puedes usar la CLI de gcloud o Cloud Console 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.
    

Cloud Console

  1. En la pantalla Funciones, haz clic en el Nombre de la función que te interesa. Se abrirá la página Detalles de la función.

  2. Desplázate hacia abajo hasta que veas la sección Creación de contenedores (Container build). Si tu compilación no tenía errores, verás un vínculo que puedes seguir a fin de visualizar el registro de compilación. Si tu compilación tuvo errores, como se muestra a continuación, en la sección Creación de contenedores aparecerán intercalados. Haz clic en Más información para visualizar directamente el registro de compilación.

    Captura de pantalla en la que se muestra el resultado de la sección Creación de contenedores

  3. Se abrirá la pantalla Visor de registros. Haz clic en la entrada que te interesa.

  4. Se abrirá la entrada de registro de compilación completa y se mostrará el archivo afectado, una descripción del error (en este caso, falta un prefijo en pom.xml), y la línea y la columna del error.

    Captura de pantalla en la que se muestra la entrada de registro de compilación

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
    

    donde FUNCTION_PROJECT_NUMBER es el número del proyecto en el que se ejecuta la función y PRIVATE_POOL_PROJECT_ID es 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

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

    donde FUNCTION_NAME es el nombre de la función, RUNTIME es el entorno de ejecución que usas y PRIVATE_POOL_NAME es 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...]
    

    donde FUNCTION_NAME es el nombre de la función y RUNTIME es el entorno de ejecución que usas.

    Cloud Console

    En la página Create function, en la sección Runtime, build and connections settings, selecciona la pestaña Build y, luego, ingresa PRIVATE_POOL_NAME en el cuadro de texto Build worker pools Selected environment, donde PRIVATE_POOL_NAME es la el nombre de tu grupo.

    Captura de pantalla de Cloud Console