Especificar dependencias en Python (1.ª gen.)

Hay dos formas de especificar las dependencias de las funciones de Cloud Run escritas en Python: mediante el archivo requirements.txt del gestor de paquetes pip o empaquetando las dependencias locales junto con la función.

No se admite la especificación de dependencias mediante el estándar Pipfile/Pipfile.lock. Tu proyecto no debe incluir estos archivos.

Especificar dependencias con pip

Las dependencias de Python se gestionan 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 despliegues o vuelvas a desplegar tu función, Cloud Run Functions usará pip para descargar e instalar la versión más reciente de tus dependencias, tal 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, opcionalmente, la versión solicitada. Para obtener más información, consulta la referencia de requirements.txt.

Para evitar que la compilación se vea afectada por los cambios en la versión de las dependencias, te recomendamos que fijes los paquetes de dependencias a una versión específica.

A continuación, se muestra un ejemplo de archivo requirements.txt:

functions-framework
requests==2.20.0
numpy

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

Si tu función depende de dependencias privadas, te recomendamos que hagas una réplica de functions-framework en tu registro privado. Incluye functions-framework como dependencia de tu función para evitar instalar el paquete desde Internet.

Empaquetar dependencias locales

También puedes empaquetar e implementar dependencias junto con tu función. Este método es útil si tu dependencia no está disponible a través del gestor de paquetes pip o si el acceso a Internet del entorno de tus funciones de Cloud Run está restringido.

Por ejemplo, puedes usar una estructura de directorios como la siguiente:

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

A continuación, puedes importar el código como de costumbre desde localpackage con la siguiente instrucción import.

# Code in main.py
from localpackage import script

Ten en cuenta que con este método no se ejecutarán archivos setup.py. Los paquetes con esos archivos se pueden seguir empaquetando, pero es posible que no se ejecuten correctamente en las funciones de Cloud Run.

Dependencias de proveedores

Las dependencias de proveedores son dependencias cuyo origen se incluye directamente en tu paquete de código fuente y se recompilan junto con tu propio código. Usa la variable de entorno de compilación GOOGLE_VENDOR_PIP_DEPENDENCIES para crear dependencias de pip de proveedores y evitar instalarlas durante el despliegue.

Crear dependencias de proveedores

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

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

  3. Declara Functions Framework como requisito incluyendo functions-framework en una línea independiente de tu archivo requirements.txt.

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

    1. Si la dependencia es un wheel de Python (*.whl), descárgala en el directorio raíz de tu á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
      

      Sustituye:

      • DIRECTORY: el nombre del directorio local en el que se descargará el archivo
      • PYTHON_RUNTIME_VERSION: la versión de Python que se va a usar para las comprobaciones de compatibilidad. Por ejemplo, 311 para Python 3.11.
        Esta versión debe coincidir con uno de los runtimes de Python compatibles.

      La estructura de directorios resultante debería ser similar a esta:

      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 consta de código escrito en C o C++, debes descargarla y compilarla por separado.

  5. Despliega tu 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
    

    Sustituye:

    • FUNCTION_NAME: el nombre de la función de Cloud Run Functions que vas a desplegar
    • PYTHON_RUNTIME_NAME: el nombre de uno de los runtimes de Python admitidos para ejecutar la función implementada. Por ejemplo, python311. Debe ser la misma versión del tiempo de ejecución de Python que hayas usado en tu entorno de desarrollo local.
    • DIRECTORY:el nombre del directorio que contiene tus dependencias de proveedores

Para obtener más información sobre cómo usar paquetes de compilación, consulta Compilar una función con paquetes de compilación.

Usar dependencias privadas

Dependencias privadas de Artifact Registry

Un repositorio de Python de Artifact Registry puede alojar dependencias privadas de tu función de Python. Al desplegar funciones en Cloud Run, el proceso de compilación generará automáticamente credenciales de Artifact Registry para la cuenta de servicio de Cloud Build. Solo tiene que incluir la URL de Artifact Registry en su requirements.txt sin generar credenciales adicionales. Por ejemplo:

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

Si tu compilación necesita varios repositorios, usa un repositorio virtual de Artifact Registry para controlar de forma segura el orden en el que pip busca en tus 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 alojados en repositorios que requieran autenticación basada en SSH deben incluirse y subirse junto con el código de tu proyecto, tal como se describe en la sección anterior.

Puedes usar el comando pip install con la marca -t DIRECTORY para copiar las dependencias privadas en un directorio local antes de implementar tu aplicación, como se indica a continuación:

  1. Copia la dependencia en un directorio local:

    pip install -t DIRECTORY DEPENDENCY
  2. Añade 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 tu función, te recomendamos que incluyas las siguientes versiones en tu 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
starlette==0.44.0
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 tiempo de ejecución de Python incluye varios paquetes del sistema en el entorno de ejecución. Si tu función usa una dependencia que requiere un paquete del sistema que no aparece en la lista, puedes solicitar un paquete.