Crear funciones en contenedores

Cloud Run permite desplegar funciones directamente, pero también puedes compilar tu función en una imagen de contenedor con los paquetes de compilación de Google Cloud y, a continuación, desplegar esta imagen de contenedor en Cloud Run.

Estos son algunos casos prácticos habituales para crear funciones en un contenedor:

  • Integración y entrega continuas: los desarrolladores crean y envían código de función a un repositorio de origen. Un sistema de CI/CD compila automáticamente la función en un contenedor, ejecuta pruebas y la despliega automáticamente en un entorno de staging.
  • Infraestructura como código: los recursos de Cloud Run que se gestionan con YAML o Terraform hacen referencia a una URL de imagen de contenedor. El código de función escrito por los desarrolladores debe compilarse en una imagen de contenedor.

En esta página se explica cómo puedes replicar el proceso de compilación exacto de las funciones de Cloud Run de dos formas:

  • Usar la CLI de pack
  • Usar Cloud Build como sistema de compilación remoto

Punto de entrada de la función

Para compilar funciones con paquetes de compilación, sigue estos pasos:

  • Incluye la biblioteca Functions Framework.

  • Define la variable de entorno GOOGLE_FUNCTION_TARGET con el nombre de la función que uses como punto de entrada. Para ello, incluye un project.toml en la misma carpeta que el código fuente. El archivo project.toml debe tener la siguiente configuración:

[[build.env]]
    name = "GOOGLE_FUNCTION_TARGET"
    value =  "ENTRY_POINT"

Sustituye ENTRY_POINT por el método de la función.

Para obtener información sobre cómo usar variables de entorno con funciones de Cloud Run, consulta Configurar servicios de funciones de Cloud Run.

Constructores

Las funciones de Cloud Run se basan en imágenes base que se mantienen y publican en los buildpacks de Google Cloud.

Los compiladores son imágenes que constan de paquetes de compilación y paquetes de sistemas operativos (también conocidos como pilas). Los compiladores se usan para convertir el código fuente de tu función en un contenedor en ejecución.

Puedes elegir entre la lista de compiladores de paquetes de compilación de Google Cloud compatibles.

Desarrollar con pack

Pack es una herramienta de CLI que mantiene el proyecto CNB para admitir el uso de paquetes de compilación. Usa la CLI de pack para compilar tus funciones de forma local en una imagen de contenedor.

Antes de empezar

  1. Instala Docker Community Edition (CE) en tu estación de trabajo. pack usa Docker como compilador de imágenes OCI.
  2. Instala Pack CLI.
  3. Instala la herramienta de control de versiones de Git para obtener la aplicación de ejemplo de GitHub.

Crear una función de forma local

Usa el comando pack build y especifica el compilador predeterminado --builder=gcr.io/buildpacks/builder para compilar tus imágenes de contenedor de forma local.

pack build --builder=gcr.io/buildpacks/builder IMAGE_NAME

Sustituye IMAGE_NAME por el nombre de tu imagen de contenedor.

También puedes personalizar tu imagen de contenedor ampliando las imágenes de compilación y ejecución.

Compilar una función de ejemplo de forma local

En los siguientes ejemplos se muestra cómo compilar un ejemplo de forma local.

  1. Clona el repositorio de ejemplo en tu máquina local:
    git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
  2. Cambia al directorio que contiene el código de ejemplo de la aplicación:

    Go

    cd buildpack-samples/sample-functions-framework-go

    Java

    cd buildpack-samples/sample-functions-framework-java-mvn

    Node.js

    cd buildpack-samples/sample-functions-framework-node

    Python

    cd buildpack-samples/sample-functions-framework-python

    Ruby

    cd buildpack-samples/sample-functions-framework-ruby
  3. Usa pack para crear la función de ejemplo:

    Go

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-go

    Java

    pack build --builder gcr.io/buildpacks/builder:v1 sample-functions-java-mvn

    Node.js

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-node

    Python

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-python

    Ruby

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-ruby
  4. Ejecuta la imagen con docker:

    Go

    docker run -p8080:8080 sample-functions-framework-go

    Java

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-java-mvn

    Node.js

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-node

    Python

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-python

    Ruby

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-ruby
  5. Visita la función en ejecución accediendo a localhost:8080.

Compilación con un sistema de compilación remoto

Usa Cloud Build para compilar tu función en una imagen de contenedor y Artifact Registry como repositorio de contenedores para almacenar y desplegar cada imagen.

Antes de empezar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build and Artifact Registry APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Cloud Build and Artifact Registry APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  13. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  14. Asegúrate de que tu proyecto Google Cloud tiene acceso a un repositorio de imágenes de contenedor.

    Para configurar el acceso a un repositorio de Docker en Artifact Registry, sigue estos pasos:

    1. Crea un repositorio de Docker en la misma ubicación que tu Google Cloud proyecto.
      gcloud artifacts repositories create REPO_NAME \
      --repository-format=docker \
      --location=REGION --description="DESCRIPTION"
      Reemplazar:
      • REPO_NAME por el nombre que elijas para tu repositorio de Docker.
      • REGION con la ubicación del proyecto o la más cercana. Google Cloud
      • DESCRIPTION con la descripción que quieras.

      Por ejemplo, para crear un repositorio docker en us-west2 con la descripción "Repositorio de Docker", ejecuta el siguiente comando:

      gcloud artifacts repositories create buildpacks-docker-repo --repository-format=docker \
      --location=us-west2 --description="Docker repository"
    2. Verifica que se ha creado el repositorio:
      gcloud artifacts repositories list

      Debería ver el nombre que elija para su repositorio de Docker en la lista.

  15. Crear una función de forma remota

    Usa el comando gcloud builds submit para compilar y subir tu imagen de contenedor al repositorio.

    Puedes especificar la imagen del contenedor en el propio comando o usar un archivo de configuración.

    Crear con comandos

    Para compilar sin un archivo de configuración, especifica la marca image:

    gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME

    Sustituye:

    • LOCATION por el nombre de la región de tu repositorio de contenedor (por ejemplo, us-west2).
    • PROJECT_ID por el ID de tu Google Cloud proyecto.
    • REPO_NAME con el nombre de tu repositorio de Docker.
    • IMAGE_NAME con el nombre de tu imagen de contenedor.

    Ejemplo:

    gcloud builds submit --pack image=us-west2-docker.pkg.dev/my-project-id/my-buildpacks-docker-repo

    Compilar con archivos de configuración

    Puedes usar un archivo de configuración para definir los detalles de configuración de tu repositorio de imágenes y simplificar el comando de compilación. El archivo de configuración usa el formato de archivo YAML y debe incluir un paso de compilación que utilice la CLI de pack.

    1. Crea un archivo YAML llamado cloudbuild.yaml que incluya el URI de tu repositorio de imágenes de contenedor.
      options:
        logging: CLOUD_LOGGING_ONLY
        pool: {}
      projectId: PROJECT_ID
      steps:
      - name: gcr.io/k8s-skaffold/pack
        entrypoint: pack
        args:
        - build
        - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
        - --builder
        - gcr.io/buildpacks/builder:latest
        - --network
        - cloudbuild
      images:
      - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME

    Sustituye:

    • LOCATION con el nombre de la región de tu repositorio de contenedores (por ejemplo, us-west2).
    • PROJECT_ID por el ID de tu Google Cloud proyecto.
    • REPO_NAME con el nombre de tu repositorio de Docker.
    • IMAGE_NAME con el nombre de tu imagen de contenedor.
    1. Compila la aplicación.

      Si has llamado cloudbuild.yaml al archivo de configuración, puedes ejecutar el siguiente comando:

      gcloud builds submit .
      

    Ejemplo: crear una función de muestra de forma remota

    En los siguientes ejemplos se muestra cómo compilar una muestra de forma remota y verificar que la imagen de contenedor se ha enviado a tu repositorio en Artifact Registry.

    1. Clona el repositorio de ejemplo en tu máquina local:
      git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
    2. Cambia al directorio que contiene el código de ejemplo de la aplicación:

      Go

      cd buildpack-samples/sample-functions-framework-go

      Java

      cd buildpack-samples/sample-functions-framework-java-mvn

      Node.js

      cd buildpack-samples/sample-functions-framework-node

      Python

      cd buildpack-samples/sample-functions-framework-python

      Ruby

      cd buildpack-samples/sample-functions-framework-ruby
    3. Usa gcloud para enviar el código fuente de la aplicación a Cloud Build:

      Go

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-go

      Java

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-gradle

      Node.js

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-node

      Python

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-python

      Ruby

      gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-ruby

      Sustituye:

      • LOCATION con el nombre de la región de tu repositorio de contenedores. Ejemplo: us-west2-docker.pkg.dev
      • PROJECT_ID por el ID de tu Google Cloud proyecto.
      • REPO_NAME con el nombre de tu repositorio de Docker.

    4. Comprueba que la función de ejemplo se haya publicado correctamente en REPO_NAME:
      gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME

      Sustituye:

      • LOCATION con el nombre de la región de tu repositorio de contenedores (por ejemplo, us-west2).
      • PROJECT_ID por el ID de tu Google Cloud proyecto.
      • REPO_NAME con el nombre de tu repositorio de Docker.

    Crear una función para actualizar automáticamente la imagen base

    Los contenedores de funciones también se pueden compilar en scratch, lo que permite usarlos en combinación con las actualizaciones de seguridad automáticas de Cloud Run.

    Dockerfile

    Puedes usar tu cadena de herramientas de compilación para crear una imagen de contenedor de funciones que sea compatible con las actualizaciones automáticas de la imagen base. Consulta las instrucciones sobre cómo crear un contenedor desde cero.

    pack CLI

    pack build IMAGE_NAME \
      --builder LOCATION-docker.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest
      --run-image LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest
    

    Sustituye:

    • LOCATION con el nombre de la región de tu repositorio de contenedores (por ejemplo, us-west2).
    • IMAGE_NAME con el nombre de tu imagen de contenedor.
    • LANGUAGE con el idioma de tu función, por ejemplo, nodejs.
    • RUNTIME_ID con el ID de tiempo de ejecución, por ejemplo, nodejs22.

    Cloud Build

    options:
      logging: CLOUD_LOGGING_ONLY
      pool: {}
    projectId: PROJECT_ID
    steps:
    - name: gcr.io/k8s-skaffold/pack
      entrypoint: pack
      args:
      - build
      - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
      - --builder
      - LOCATION-docker.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest
      - --run-image
      - LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest
      - --network
      - cloudbuild
    images:
    - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
    

    Sustituye:

    • LOCATION con el nombre de la región de tu repositorio de contenedores (por ejemplo, us-west2).
    • PROJECT_ID por el ID de tu Google Cloud proyecto.
    • REPO_NAME con el nombre de tu repositorio de Docker.
    • IMAGE_NAME con el nombre de tu imagen de contenedor.
    • LANGUAGE con el idioma de tu función, por ejemplo, nodejs.
    • RUNTIME_ID con el ID de tiempo de ejecución, por ejemplo, nodejs22.

    Siguientes pasos