Instalar dependencias de Python

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

Esta página describe cómo instalar paquetes de Python para su entorno de Cloud Composer.

Acerca de los paquetes en Cloud Composer

Esta sección explica cómo funcionan los paquetes PyPI en Cloud Composer.

Paquetes de PyPI preinstalados y personalizados en imágenes de Cloud Composer

Las imágenes de Cloud Composer contienen paquetes de PyPI preinstalados y personalizados.

  • Los paquetes de PyPI preinstalados se incluyen en la imagen de Cloud Composer de su entorno. Cada imagen de Cloud Composer contiene paquetes de PyPI específicos para su versión de Cloud Composer y Airflow.

  • Los paquetes de PyPI personalizados son paquetes que puede instalar en su entorno además de los paquetes preinstalados.

Opciones para administrar paquetes de PyPI para entornos de Cloud Composer

Opción Úselo si
Instalar desde PyPI La forma predeterminada de instalar paquetes en su entorno
Instalar desde un repositorio con una dirección IP pública El paquete está alojado en un repositorio de paquetes distinto de PyPI. Este repositorio tiene una dirección IP pública.
Instalar desde un repositorio de Artifact Registry El paquete está alojado en un repositorio de Artifact Registry
Instalar desde un repositorio en la red de su proyecto Su entorno no tiene acceso a internet público. El paquete está alojado en un repositorio de paquetes en la red de su proyecto.
Instalar como una biblioteca local de Python El paquete no se puede encontrar en PyPI y la biblioteca no tiene ninguna dependencia externa, como dist-packages .
Instalar un complemento El paquete proporciona funcionalidad específica del complemento, como modificar la interfaz web de Airflow.
Operador virtual Python No desea que el paquete se instale para todos los trabajadores de Airflow, ya que la dependencia entra en conflicto con los paquetes preinstalados. El paquete se encuentra en PyPI y no tiene dependencias externas.
KubernetesPodOperator y operadores de GKE Necesita dependencias externas que no se pueden instalar desde pip , como dist-packages , o que están en un servidor pip interno. Esta opción requiere más configuración y mantenimiento. Considérela solo si las otras opciones no funcionan.

Antes de empezar

  • Debe tener un rol que pueda activar operaciones de actualización del entorno. Además, la cuenta de servicio del entorno debe tener un rol con permisos suficientes para realizar operaciones de actualización.

  • Si su entorno está protegido por un perímetro de controles de servicio de VPC, antes de instalar las dependencias de PyPI debe otorgar identidades de usuario adicionales con acceso a los servicios que protege el perímetro de servicio y habilitar el soporte para un repositorio privado de PyPI.

  • Los requisitos deben seguir el formato especificado en PEP-508, donde cada requisito se especifica en minúsculas y consta del nombre del paquete con extras opcionales y especificadores de versión.

  • Las actualizaciones de dependencia de PyPI generan imágenes de Docker en Artifact Registry .

  • Si un conflicto de dependencias provoca un error en la actualización, su entorno continúa ejecutándose con sus dependencias existentes. Si la operación se realiza correctamente, puede empezar a usar las dependencias de Python recién instaladas en sus DAG.

  • PythonVirtualenvOperator no utiliza la configuración del archivo pip.conf de su entorno. Si desea usar dependencias específicas, incluyendo su instalación desde un índice personalizado, pase los requisitos en el parámetro requirements como una lista de cadenas. Para obtener más información sobre el formato, consulte "Formato del archivo de requisitos" en la documentación de pip.

Ver la lista de paquetes de PyPI

Puede obtener la lista de paquetes para su entorno en varios formatos.

Ver paquetes preinstalados

Para ver la lista de paquetes preinstalados para su entorno, consulte la lista de paquetes de la imagen de Cloud Composer de su entorno .

Ver todos los paquetes

Para ver todos los paquetes (tanto preinstalados como personalizados) en su entorno:

nube g

El siguiente comando CLI de gcloud devuelve el resultado del comando python -m pip list para un trabajador de Airflow en su entorno. Puede usar el argumento --tree para obtener el resultado del comando python -m pipdeptree --warn .

gcloud beta composer environments list-packages \
    ENVIRONMENT_NAME \
    --location LOCATION

Reemplazar:

  • ENVIRONMENT_NAME con el nombre del entorno.
  • LOCATION con la región donde se ubica el entorno.

Ver paquetes personalizados de PyPI

Consola

  1. En Google Cloud consola, vaya a la página Entornos .

    Ir a Entornos

  2. En la lista de entornos, haga clic en el nombre del suyo. Se abrirá la página de detalles del entorno .

  3. Vaya a la pestaña Paquetes de PyPI .

nube g

gcloud composer environments describe ENVIRONMENT_NAME \
  --location LOCATION \
  --format="value(config.softwareConfig.pypiPackages)"

Reemplazar:

  • ENVIRONMENT_NAME con el nombre del entorno.
  • LOCATION con la región donde se ubica el entorno.

Instalar paquetes personalizados en un entorno de Cloud Composer

Esta sección describe diferentes métodos para instalar paquetes personalizados en su entorno.

Instalar paquetes desde PyPI

Se puede instalar un paquete desde el índice de paquetes de Python si no tiene dependencias externas ni conflictos con paquetes preinstalados.

Para agregar, actualizar o eliminar las dependencias de Python para su entorno:

Consola

  1. En Google Cloud consola, vaya a la página Entornos .

    Ir a Entornos

  2. En la lista de entornos, haga clic en el nombre del suyo. Se abrirá la página de detalles del entorno .

  3. Vaya a la pestaña de paquetes de PyPI .

  4. Haga clic en Editar

  5. Haga clic en Agregar paquete .

  6. En la sección de paquetes de PyPI , especifique los nombres de los paquetes, con especificadores de versión y extras opcionales.

    Por ejemplo:

    • scikit-learn
    • scipy , >=0.13.3
    • nltk , [machine_learning]
  7. Haga clic en Guardar .

nube g

gcloud CLI tiene varios argumentos para trabajar con paquetes PyPI personalizados:

  • --update-pypi-packages-from-file reemplaza todos los paquetes personalizados de PyPI existentes con los paquetes especificados. Los paquetes que no especifique se eliminarán.
  • --update-pypi-package actualiza o instala un paquete.
  • --remove-pypi-packages elimina los paquetes especificados.
  • --clear-pypi-packages elimina todos los paquetes.

Requisitos de instalación desde un archivo

El archivo requirements.txt debe tener cada especificador de requisito en una línea separada.

Por ejemplo:

scipy>=0.13.3
scikit-learn
nltk[machine_learning]

Actualice su entorno y especifique el archivo requirements.txt en el argumento --update-pypi-packages-from-file .

gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --update-pypi-packages-from-file requirements.txt

Reemplazar:

  • ENVIRONMENT_NAME con el nombre del entorno.
  • LOCATION con la región donde se ubica el entorno.

Instalación de un paquete

Actualice su entorno y especifique el paquete, la versión y los extras en el argumento --update-pypi-package .

gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --update-pypi-package PACKAGE_NAMEEXTRAS_AND_VERSION

Reemplazar:

  • ENVIRONMENT_NAME con el nombre del entorno.
  • LOCATION con la región donde se ubica el entorno.
  • PACKAGE_NAME con el nombre del paquete.
  • EXTRAS_AND_VERSION con el especificador opcional de versión y extras. Para omitir versiones y extras, especifique un valor vacío.

Ejemplo:

gcloud composer environments update example-environment \
    --location us-central1 \
    --update-pypi-package "scipy>=0.13.3"

Eliminando paquetes

Actualice su entorno y especifique los paquetes que desea eliminar en el argumento --remove-pypi-packages :

gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --remove-pypi-packages PACKAGE_NAMES

Reemplazar:

  • ENVIRONMENT_NAME con el nombre del entorno.
  • LOCATION con la región donde se ubica el entorno.
  • PACKAGE_NAMES con una lista de paquetes separados por comas.

Ejemplo:

gcloud composer environments update example-environment \
    --location us-central1 \
    --remove-pypi-packages scipy,scikit-learn

API

Construya una solicitud API environments.patch .

En esta solicitud:

  1. En el parámetro updateMask , especifique la máscara:

    • Use la máscara config.softwareConfig.pypiPackages para reemplazar todos los paquetes existentes con los especificados. Los paquetes que no especifique se eliminarán.
    • Utilice config.softwareConfig.envVariables.PACKAGE_NAME para agregar o actualizar un paquete específico. Para agregar o actualizar varios paquetes, especifique varias máscaras con comas.
  2. En el cuerpo de la solicitud, especifique los paquetes y valores para las versiones y los extras:

    {
      "config": {
        "softwareConfig": {
          "pypiPackages": {
            "PACKAGE_NAME": "EXTRAS_AND_VERSION"
          }
        }
      }
    }
    

    Reemplazar:

    • PACKAGE_NAME con el nombre del paquete.
    • EXTRAS_AND_VERSION con el especificador opcional de versión y extras. Para omitir versiones y extras, especifique un valor vacío.
    • Para agregar más de un paquete, agregue entradas adicionales para paquetes a pypiPackages .

Ejemplo:

// PATCH https://composer.googleapis.com/v1/projects/example-project/
// locations/us-central1/environments/example-environment?updateMask=
// config.softwareConfig.pypiPackages.EXAMPLE_PACKAGE,
// config.softwareConfig.pypiPackages.ANOTHER_PACKAGE
{
  "config": {
    "softwareConfig": {
      "pypiPackages": {
        "EXAMPLE_PACKAGE": "",
        "ANOTHER_PACKAGE": ">=1.10.3"
      }
    }
  }
}

Terraformar

El bloque pypi_packages en el bloque software_config especifica paquetes.

resource "google_composer_environment" "example" {
  name = "ENVIRONMENT_NAME"
  region = "LOCATION"

  config {

    software_config {

      pypi_packages = {
          PACKAGE_NAME = "EXTRAS_AND_VERSION"
      }

    }
  }
}

Reemplazar:

  • ENVIRONMENT_NAME con el nombre del entorno.
  • LOCATION con la región donde se ubica el entorno.
  • PACKAGE_NAME con el nombre del paquete.
  • EXTRAS_AND_VERSION con el especificador opcional de versión y extras. Para omitir versiones y extras, especifique un valor vacío.
  • Para agregar más de un paquete, agregue entradas adicionales para paquetes a pypi_packages .

Ejemplo:

resource "google_composer_environment" "example" {
  name = "example-environment"
  region = "us-central1"

  config {

    software_config {
      pypi_packages = {
          scipy = ">=1.10.3"
          scikit-learn = ""
          nltk = "[machine_learning]"
      }
    }
  }
}

Instalar paquetes desde un repositorio público

Puede instalar paquetes alojados en otros repositorios que tengan una dirección IP pública.

Los paquetes deben estar configurados correctamente para que la herramienta pip predeterminada pueda instalarlos.

Para instalar desde un repositorio de paquetes que tenga una dirección pública:

  1. Cree un archivo pip.conf e incluya la siguiente información en el archivo, si corresponde:

    • URL del repositorio (en el parámetro index-url )
    • Credenciales de acceso al repositorio
    • Opciones de instalación pip no predeterminadas

    Ejemplo:

    [global]
    index-url=https://example.com/
    
  2. (Opcional) En algunos casos, es posible que desee obtener paquetes de varios repositorios, como cuando el repositorio público contiene algunos paquetes específicos que desea instalar y desea instalar todos los demás paquetes desde PyPI:

    1. Configurar un repositorio virtual de Artifact Registry .
    2. Agregue la configuración para múltiples repositorios (incluido PyPI, si es necesario) y defina el orden en que pip busca en los repositorios.
    3. Especifique la URL del repositorio virtual en el parámetro index-url .
  3. Determinar la URI del bucket de su entorno .

  4. Sube el archivo pip.conf a la carpeta /config/pip/ en el depósito de tu entorno.

  5. Instale paquetes utilizando uno de los métodos disponibles .

Instalar paquetes desde un repositorio de Artifact Registry

Puede almacenar paquetes en un repositorio de Artifact Registry en su proyecto y configurar su entorno para instalar desde allí.

Configurar roles y permisos:

  1. Asegúrese de que la cuenta de servicio Cloud Build tenga permisos para leer desde su repositorio Artifact Registry .

  2. Otorgue permisos adicionales para instalar paquetes desde los repositorios de Artifact Registry en la cuenta de servicio de su entorno, como se describe en Control de acceso .

  3. Si su entorno tiene acceso restringido a otros servicios en su proyecto, por ejemplo, si usa controles de servicio de VPC:

    1. Asigne permisos para acceder a su repositorio de Artifact Registry a la cuenta de servicio del entorno en lugar de a la cuenta de servicio de Cloud Build.

    2. Asegúrese de que la conectividad con el repositorio Artifact Registry esté configurada en su proyecto.

Para instalar paquetes de PyPI personalizados desde un repositorio de Artifact Registry:

  1. Cree un archivo pip.conf e incluya la siguiente información en el archivo, si corresponde:

    • URL del repositorio de Artifact Registry (en el parámetro index-url )
    • Credenciales de acceso al repositorio
    • Opciones de instalación pip no predeterminadas

    Para un repositorio de Artifact Registry, agregue /simple/ a la URL del repositorio:

    [global]
    index-url = https://us-central1-python.pkg.dev/example-project/example-repository/simple/
    
  2. (Opcional) En algunos casos, es posible que desee obtener paquetes de varios repositorios, como cuando su repositorio de Artifact Registry contiene algunos paquetes específicos que desea instalar y desea instalar todos los demás paquetes desde PyPI:

    1. Configurar un repositorio virtual de Artifact Registry .
    2. Agregue la configuración para múltiples repositorios (incluido PyPI, si es necesario) y defina el orden en que pip busca en los repositorios.
    3. Especifique la URL del repositorio virtual en el parámetro index-url .
  3. Sube este archivo pip.conf a la carpeta /config/pip/ del bucket de tu entorno. Por ejemplo: gs://us-central1-example-bucket/config/pip/pip.conf .

  4. Instale paquetes utilizando uno de los métodos disponibles .

Instalar paquetes desde un repositorio privado

Puedes alojar un repositorio privado en la red de tu proyecto y configurar tu entorno para instalar paquetes de Python desde él.

Configurar roles y permisos:

  1. Si instala paquetes de PyPI personalizados desde un repositorio en la red de su proyecto y este repositorio no tiene una dirección IP pública:

    1. Asignar permisos para acceder a este repositorio a la cuenta de servicio del entorno.

    2. Asegúrese de que la conectividad a este repositorio esté configurada en su proyecto.

  2. Otorgue permisos adicionales para instalar paquetes desde repositorios privados a la cuenta de servicio de su entorno, como se describe en Control de acceso .

Para instalar paquetes desde un repositorio privado alojado en la red de su proyecto:

  1. Cree un archivo pip.conf e incluya la siguiente información en el archivo, si corresponde:

    • Dirección IP del repositorio en la red de su proyecto
    • Credenciales de acceso al repositorio
    • Opciones de instalación pip no predeterminadas

    Ejemplo:

    [global]
    index-url=https://192.0.2.10/
    
  2. (Opcional) En algunos casos, es posible que desee obtener paquetes de varios repositorios, como cuando el repositorio privado contiene algunos paquetes específicos que desea instalar y desea instalar todos los demás paquetes desde PyPI:

    1. Configurar un repositorio virtual de Artifact Registry .
    2. Agregue la configuración para múltiples repositorios (incluido PyPI, si es necesario) y defina el orden en que pip busca en los repositorios.
    3. Especifique la URL del repositorio virtual en el parámetro index-url .
  3. Sube el archivo pip.conf a la carpeta /config/pip/ del bucket de tu entorno. Por ejemplo: gs://us-central1-example-bucket/config/pip/pip.conf .

  4. Instale paquetes utilizando uno de los métodos disponibles .

Instalar una biblioteca local de Python

Para instalar una biblioteca de Python interna o local:

  1. Coloque las dependencias en un subdirectorio de la carpeta dags/ del contenedor de su entorno. Para importar un módulo desde un subdirectorio, cada subdirectorio en la ruta del módulo debe contener un archivo de marcador de paquete __init__.py .

    En el siguiente ejemplo, la dependencia es coin_module.py :

    dags/
      use_local_deps.py  # A DAG file.
      dependencies/
        __init__.py
        coin_module.py
    
  2. Importe la dependencia del archivo de definición DAG.

    Por ejemplo:

from dependencies import coin_module

Utilice paquetes que dependan de bibliotecas de objetos compartidos

Algunos paquetes de PyPI dependen de bibliotecas de sistema. Aunque Cloud Composer no es compatible con las bibliotecas de sistema, puede usar las siguientes opciones:

  • Use KubernetesPodOperator . Configure la imagen del operador como una imagen de compilación personalizada. Si experimenta errores en los paquetes durante la instalación debido a una dependencia del sistema no satisfecha, use esta opción.

  • Sube las bibliotecas de objetos compartidos al contenedor de tu entorno. Si tus paquetes de PyPI se instalaron correctamente, pero fallan durante la ejecución, usa esta opción.

    1. Busque manualmente las bibliotecas de objetos compartidos para la dependencia de PyPI (un archivo .so).
    2. Cargue las bibliotecas de objetos compartidos en la carpeta /plugins en el depósito de su entorno.
    3. Establezca la siguiente variable de entorno : LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/airflow/gcs/plugins

Instalar paquetes en entornos de IP privada

Dependiendo de cómo configure su proyecto, es posible que su entorno no tenga acceso a Internet público.

Entorno de IP privada con acceso público a Internet

Si su entorno de IP privada puede acceder a Internet público, puede instalar paquetes utilizando las opciones para entornos de IP pública:

Entorno de IP privada sin acceso a Internet

Si su entorno de IP privada no tiene acceso a Internet público, puede instalar paquetes utilizando una de las siguientes maneras:

  • Utilice un repositorio privado de PyPI alojado en la red de su proyecto.
  • Use una máquina virtual de servidor proxy en la red de su proyecto para conectarse a un repositorio de PyPI en la red pública de internet. Especifique la dirección del proxy en el archivo /config/pip/pip.conf del bucket de su entorno.
  • Utilice un repositorio del Registro de Artefactos como única fuente de paquetes. Para ello, redefina el parámetro index-url , como se describe.
  • Si su política de seguridad permite el acceso a direcciones IP externas desde su red VPC, puede habilitar la instalación de paquetes desde repositorios en Internet público configurando Cloud NAT .
  • Coloque las dependencias de Python en la carpeta /dags del contenedor de su entorno para instalarlas como bibliotecas locales . Esto podría no ser recomendable si el árbol de dependencias es grande.

Instalar en un entorno de IP privada con restricciones de ubicación de recursos

Mantener su proyecto en línea con los requisitos de Restricción de Ubicación de Recursos prohíbe el uso de algunas herramientas. En particular, Cloud Build no puede usarse para la instalación de paquetes, lo que impide el acceso directo a repositorios en la red pública de internet.

Para instalar dependencias de Python en dicho entorno, siga las instrucciones para entornos de IP privada sin acceso a Internet .

Instalar una dependencia de Python en un entorno de IP privada en un perímetro de controles de servicio de VPC

Proteger su proyecto con un perímetro de Controles de Servicio de VPC implica restricciones de seguridad adicionales. En particular, Cloud Build no puede utilizarse para la instalación de paquetes, lo que impide el acceso directo a los repositorios en la red pública de internet.

Para instalar dependencias de Python para un entorno de IP privada dentro de un perímetro, siga las instrucciones para entornos de IP privada sin acceso a Internet .

¿Qué sigue?