Especifica dependencias en Python (1ª gen.)

Existen dos formas de especificar las dependencias de las funciones de Cloud Run escritas en Python: usar el archivo requirements.txt del administrador de paquetes pip o empaquetar las dependencias locales junto con tu función.

La especificación de dependencias que usa el estándar Pipfile/Pipfile.lock no es compatible. Tu proyecto no debe incluir estos archivos.

Especifica dependencias con pip

Las dependencias en Python se administran con pip y se expresan en un archivo de metadatos llamado requirements.txt. Este archivo debe estar en el mismo directorio que el archivo main.py que contiene el código de la función.

Cuando implementas o vuelves a implementar la función, Cloud Run Functions usa pip para descargar y, luego, instalar la última versión de tus dependencias como se declara en el archivo requirements.txt. El archivo requirements.txt contiene una línea por paquete. Cada línea contiene el nombre del paquete y, de manera opcional, la versión solicitada. Para obtener más detalles, consulta la referencia de requirements.txt.

Para evitar que la compilación se vea afectada por los cambios en la versión de la dependencia, considera fijar los paquetes de dependencias a una versión específica.

El siguiente es un archivo requirements.txt de ejemplo:

functions-framework
requests==2.20.0
numpy

Functions Framework es una dependencia obligatoria para todas las funciones. Aunque Cloud Run Functions las instala por ti cuando se crea la función, te recomendamos que la incluyas como una dependencia explícita para mayor claridad.

Si la función usa dependencias privadas, te recomendamos que dupliques functions-framework en el registro privado. Incluye el functions-framework duplicado como una dependencia de la función para evitar la instalación del paquete desde el Internet público.

Empaqueta las dependencias locales

Puedes empaquetar y, además, implementar dependencias junto con la función. Este enfoque es útil si la dependencia no está disponible a través del administrador de paquetes pip o si el acceso a Internet del entorno de Cloud Run Functions está restringido.

Por ejemplo, puedes usar una estructura de directorio como la que se muestra a continuación:

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

Luego, puedes importar el código como de costumbre desde localpackage con la sentencia import siguiente.

# Code in main.py
from localpackage import script

Ten en cuenta que este enfoque no ejecutará ningún archivo setup.py. Los paquetes con esos archivos aún se pueden agrupar, pero es posible que no se ejecuten de forma correcta en Cloud Run Functions.

Dependencias del proveedor

Las dependencias del proveedor son aquellas cuyas fuentes se incluyen directamente en tu paquete de código fuente y que vuelven a compilarse junto con tu propio código. Usa la variable de entorno de compilación GOOGLE_VENDOR_PIP_DEPENDENCIES para crear dependencias de pip del proveedor y evitar instalarlas durante la implementación.

Crea dependencias del proveedor

  1. Asegúrate de que python3 esté instalado en tu sistema de desarrollo.

  2. Declara las dependencias de la aplicación en un archivo requirements.txt ubicado en el directorio raíz del árbol de desarrollo.

  3. Declara Functions Framework como requisito incluyendo functions-framework en otra línea del archivo requirements.txt.

  4. Descarga las dependencias de la función en el directorio local. Los pasos para hacerlo dependen de si la dependencia es un archivo wheel de Python (*.whl) o un archivo tar (*.tar.gz).

    1. Si la dependencia es un archivo wheel de Python (*.whl), descárgala en el directorio raíz del árbol de desarrollo con este comando pip:

      python3 -m pip download -r requirements.txt --only-binary=:all: \
         -d DIRECTORY \
         --python-version PYTHON_RUNTIME_VERSION \
         --platform manylinux2014_x86_64 \
         --implementation cp
      

      Reemplaza lo siguiente:

      • DIRECTORY: es el nombre del directorio local en el que se descargará.
      • PYTHON_RUNTIME_VERSION: es la versión de Python que se usa para las verificaciones de compatibilidad. Por ejemplo, 311 para Python 3.11.
        Esta versión debe coincidir con uno de los entornos de ejecución de Python compatibles.

      La estructura del directorio resultante debería tener el aspecto siguiente:

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. Si la dependencia es un archivo tar (*.tar.gz):

      1. Si la dependencia está escrita en Python, usa pip para descargarla:

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. Si una dependencia consiste en código escrito en C o C++, debes descargarla y compilarla por separado.

  5. Implementa la función y sus dependencias de proveedor:

    gcloud functions deploy FUNCTION_NAME \
      --runtime PYTHON_RUNTIME_NAME \
      --set-build-env-vars GOOGLE_VENDOR_PIP_DEPENDENCIES=DIRECTORY
    

    Reemplaza lo siguiente:

    • FUNCTION_NAME: es el nombre de la función de Cloud Run que estás implementando.
    • PYTHON_RUNTIME_NAME: es el nombre de uno de los entornos de ejecución de Python compatibles en los que se ejecutará la función implementada, por ejemplo, python311. Debe ser la misma versión del entorno de ejecución de Python que usaste en tu entorno de desarrollo local.
    • DIRECTORY: es el nombre del directorio que contiene las dependencias de proveedor.

Para obtener más detalles sobre cómo se usan los buildpacks, consulta Compila una función con buildpacks.

Usa dependencias privadas

Dependencias privadas de Artifact Registry

Un repositorio de Python para Artifact Registry puede alojar dependencias privadas para la función de Python. Cuando haces una implementación en funciones de Cloud Run, el proceso de compilación generará automáticamente las credenciales de Artifact Registry para la cuenta de servicio de Cloud Build. Solo debes incluir la URL de Artifact Registry en el archivo requirements.txt sin generar credenciales adicionales. Por ejemplo:

--index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage

Si la compilación necesita varios repositorios, usa un repositorio virtual de Artifact Registry para controlar de forma segura el orden en que pip busca los repositorios.

Dependencias privadas de otros repositorios

Las dependencias se instalan en un entorno de Cloud Build que no proporciona acceso a las claves SSH. Los paquetes que se alojan en repositorios que requieren una autenticación basada en SSH se deben copiar y subir junto con el código del proyecto, como se describe en la sección anterior.

Puedes usar el comando pip install con el marcador -t DIRECTORY para copiar las dependencias privadas en un directorio local antes de implementar tu aplicación, de la siguiente manera:

  1. Copia tu dependencia en un directorio local:

    pip install -t DIRECTORY DEPENDENCY
  2. Agrega un archivo __init__.py vacío al directorio DIRECTORY para convertirlo en un módulo.

  3. Importa desde este módulo para usar tu dependencia:

    import DIRECTORY.DEPENDENCY

Paquetes preinstalados

Los siguientes paquetes de Python se instalan automáticamente junto con tu función durante la implementación. Si usas alguno de estos paquetes en el código de la función, te recomendamos que incluyas las versiones siguientes en el archivo requirements.txt:

Python 3.7

aiohttp==3.8.1
aiosignal==1.2.0
async-timeout==4.0.2
attrs==21.4.0
cachetools==4.2.4
certifi==2021.10.8
chardet==4.0.0
charset-normalizer==2.0.10
click==8.0.3
Flask==2.0.2
frozenlist==1.2.0
google-api-core==2.3.2
google-api-python-client==2.34.0
google-auth==2.3.3
google-auth-httplib2==0.1.0
google-cloud-core==2.2.1
google-cloud-trace==1.5.1
googleapis-common-protos==1.54.0
grpcio==1.43.0
grpcio-status==1.43.0
httplib2==0.20.2
idna==3.3
itsdangerous==2.0.1
Jinja2==3.1.6
MarkupSafe==2.0.1
multidict==5.2.0
opencensus==0.8.0
opencensus-context==0.1.2
packaging==21.3
proto-plus==1.19.8
protobuf==3.19.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pyparsing==3.0.6
pytz==2021.3
PyYAML==6.0
requests==2.27.1
rsa==4.8
setuptools==60.3.1
six==1.16.0
uritemplate==4.1.1
urllib3==1.26.7
Werkzeug==2.0.2
wrapt==1.13.3
yarl==1.7.2

Python 3.8 y versiones posteriores

anyio==4.5.2
blinker==1.8.2
click==8.1.8
cloudevents==1.11.0
deprecation==2.1.0
exceptiongroup==1.3.0
Flask==3.0.3
functions-framework==3.9.1
gunicorn==23.0.0
h11==0.16.0
idna==3.10
importlib_metadata==8.5.0
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==2.1.5
packaging==25.0
sniffio==1.3.1
# Install starlette 0.44.0 for Python 3.8
starlette==0.44.0; python_version == '3.8'
# Install starlette 0.49.1 for Python versions greater than 3.8
starlette==0.49.1; python_version > '3.8'
typing_extensions==4.13.2
uvicorn==0.33.0
uvicorn-worker==0.2.0
watchdog==4.0.2
Werkzeug==3.0.6
zipp==3.20.2

* `pip` (latest version)
* `setuptools` (latest version)
* `wheel` (determined by product requirements)

Además, el entorno de ejecución de Python incluye una serie de paquetes de sistema en el entorno de ejecución. Si la función usa una dependencia que requiere un paquete de sistema que no figura en la lista, puedes solicitar un paquete.