Installer des dépendances Python pour Cloud Composer

Cloud Composer 1 | Cloud Composer 2

Cette page explique comment installer des packages Python pour votre environnement Cloud Composer.

À propos des packages PyPI préinstallés et personnalisés dans les images Cloud Composer

Les images Cloud Composer contiennent des packages PyPI préinstallés et personnalisés.

  • Les packages PyPI préinstallés sont des packages inclus dans l'image Cloud Composer de votre environnement. Chaque image Cloud Composer contient des packages PyPI spécifiques à votre version de Cloud Composer et d'Airflow.

  • Les packages PyPI personnalisés sont des packages que vous pouvez installer dans votre environnement en plus des packages préinstallés.

Options de gestion des packages PyPI pour les environnements Cloud Composer

Option Utiliser si
Installer depuis PyPI La méthode par défaut pour installer des packages dans votre environnement
Installer à partir d'un dépôt avec une adresse IP publique Le package est hébergé dans un dépôt de packages autre que PyPI. Ce dépôt possède une adresse IP publique
Installer à partir d'un dépôt Artifact Registry Le package est hébergé dans un dépôt Artifact Registry
Installer à partir d'un dépôt du réseau de votre projet Votre environnement n'a pas accès à l'Internet public. Le package est hébergé dans un dépôt de packages sur le réseau de votre projet.
Installer en tant que bibliothèque Python locale Le package est introuvable dans PyPI et la bibliothèque ne comporte aucune dépendance externe, telle que dist-packages.
Installer un plug-in Le package fournit des fonctionnalités spécifiques au plug-in, telles que la modification de l'interface Web Airflow.
PythonVirtualenvOperator Vous ne souhaitez pas que le package soit installé pour tous les nœuds de calcul Airflow, ou la dépendance entre en conflit avec les packages préinstallés. Le package se trouve dans le PyPI et ne possède aucune dépendance externe.
Opérateurs KubernetesPodOperator et GKE Vous avez besoin de dépendances externes qui ne peuvent pas être installées à partir de pip, telles que dist-packages, ou qui se trouvent sur un serveur pip interne. Cette option nécessite davantage de configuration et de maintenance. N'en tenez compte que si d'autres options ne fonctionnent pas.

Avant de commencer

  • Vous devez disposer d'un rôle permettant de déclencher des opérations de mise à jour d'environnement. De plus, le compte de service de l'environnement doit disposer d'un rôle doté d'autorisations suffisantes pour effectuer des opérations de mise à jour. Pour plus d'informations, consultez la section Contrôle des accès.
  • Si votre environnement est protégé par un périmètre VPC Service Controls, avant d'installer des dépendances PyPI, vous devez accorder des identités d'utilisateur supplémentaires ayant accès aux services que le périmètre de service protège et activer la compatibilité avec un dépôt PyPI privé.
  • Les exigences doivent respecter le format spécifié dans PEP-508, où chaque exigence est spécifiée en minuscules et consiste en un nom de package avec des options et des spécificateurs de version facultatifs.
  • Les mises à jour des dépendances PyPI génèrent des images Docker dans Artifact Registry.

  • Si un conflit de dépendance entraîne l'échec de la mise à jour, votre environnement continue de s'exécuter avec ses dépendances existantes. Si l'opération réussit, vous pouvez commencer à utiliser les dépendances Python récemment installées dans vos DAG.

Afficher la liste des packages PyPI

Vous pouvez obtenir la liste des packages pour votre environnement dans plusieurs formats.

Afficher les packages préinstallés

Pour afficher la liste des packages préinstallés pour votre environnement, consultez la liste des packages de l'image Cloud Composer de votre environnement.

Afficher tous les packages

Pour afficher tous les packages (préinstallés et personnalisés) de votre environnement:

gcloud

La commande gcloud CLI suivante renvoie le résultat de la commande python -m pip list pour un nœud de calcul Airflow dans votre environnement. Vous pouvez utiliser l'argument --tree pour obtenir le résultat de la commande python -m pipdeptree --warn.

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

Remplacez :

  • ENVIRONMENT_NAME par le nom de l'environnement.
  • LOCATION par la région dans laquelle se trouve l'environnement.

Afficher les packages PyPI personnalisés

Console

  1. Dans la console Google Cloud, accédez à la page Environnements.

    Accéder à la page Environnements

  2. Dans la liste des environnements, cliquez sur le nom de votre environnement. La page Détails de l'environnement s'ouvre.

  3. Accédez à l'onglet Packages PyPI.

gcloud

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

Remplacez :

  • ENVIRONMENT_NAME par le nom de l'environnement.
  • LOCATION par la région dans laquelle se trouve l'environnement.

Installer des packages personnalisés dans un environnement Cloud Composer

Cette section décrit différentes méthodes d'installation de packages personnalisés dans votre environnement.

Installer des packages à partir de PyPI

Un package peut être installé à partir de l'index de packages Python s'il ne comporte aucune dépendance externe ou s'il n'est pas en conflit avec des packages préinstallés.

Pour ajouter, mettre à jour ou supprimer les dépendances Python sur l'environnement, procédez comme suit :

Console

  1. Dans la console Google Cloud, accédez à la page Environnements.

    Accéder à la page Environnements

  2. Dans la liste des environnements, cliquez sur le nom de votre environnement. La page Détails de l'environnement s'ouvre.

  3. Accédez à l'onglet Packages PyPI.

  4. Cliquez sur Modifier.

  5. Cliquez sur Add package (Ajouter un package).

  6. Dans la section Packages PyPI, spécifiez les noms des packages, avec des spécificateurs et des extras facultatifs.

    Exemple :

    • scikit-learn
    • scipy, >=0.13.3
    • nltk, [machine_learning]
  7. Cliquez sur Enregistrer.

gcloud

La gcloud CLI propose plusieurs méthodes pour utiliser des packages PyPI personnalisés:

  • --update-pypi-packages-from-file remplace tous les packages PyPI personnalisés existants par les packages spécifiés. Les packages que vous ne spécifiez pas sont supprimés.
  • --update-pypi-package met à jour ou installe un package.
  • --remove-pypi-packages supprime les packages spécifiés.
  • --clear-pypi-packages supprime tous les packages.

Installer la configuration requise à partir d'un fichier

Dans le fichier requirements.txt, chaque spécificateur d'exigence doit se trouver sur une ligne distincte.

Exemple :

scipy>=0.13.3
scikit-learn
nltk[machine_learning]

Mettez à jour votre environnement et spécifiez le fichier requirements.txt dans l'argument --update-pypi-packages-from-file.

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

Remplacez :

  • ENVIRONMENT_NAME par le nom de l'environnement.
  • LOCATION par la région dans laquelle se trouve l'environnement.

Installer un seul package

Mettez à jour votre environnement et spécifiez le package, la version et les extras dans l'argument --update-pypi-package.

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

Remplacez :

  • ENVIRONMENT_NAME par le nom de l'environnement.
  • LOCATION par la région dans laquelle se trouve l'environnement.
  • PACKAGE_NAME par le nom du package.
  • EXTRAS_AND_VERSION par le spécificateur de version et d'extras facultatif. Pour omettre des versions et des extras, spécifiez une valeur vide.

Exemple :

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

Supprimer des packages

Mettez à jour votre environnement et spécifiez les packages que vous souhaitez supprimer dans l'argument --remove-pypi-packages:

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

Remplacez :

  • ENVIRONMENT_NAME par le nom de l'environnement.
  • LOCATION par la région dans laquelle se trouve l'environnement.
  • PACKAGE_NAMES par une liste de packages séparés par une virgule.

Exemple :

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

API

Rédigez une requête API environments.patch.

Dans cette requête :

  1. Dans le paramètre updateMask, spécifiez le masque:

    • Utilisez le masque config.softwareConfig.pypiPackages pour remplacer tous les packages existants par les packages spécifiés. Les packages que vous ne spécifiez pas sont supprimés.
    • Utilisez config.softwareConfig.envVariables.PACKAGE_NAME pour ajouter ou mettre à jour un package spécifique. Pour ajouter ou mettre à jour plusieurs packages, spécifiez plusieurs masques avec des virgules.
  2. Dans le corps de la requête, spécifiez les packages et les valeurs des versions et des extras:

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

    Remplacez :

    • PACKAGE_NAME par le nom du package.
    • EXTRAS_AND_VERSION par le spécificateur de version et d'extras facultatif. Pour omettre des versions et des extras, spécifiez une valeur vide.
    • Pour ajouter plusieurs packages, ajoutez des entrées supplémentaires pour les packages dans pypiPackages.

Exemple :

// 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"
      }
    }
  }
}

Terraform

Le bloc pypi_packages du bloc software_config spécifie les packages.

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

  config {

    software_config {

      pypi_packages = {
          PACKAGE_NAME = "EXTRAS_AND_VERSION"
      }

    }
  }
}

Remplacez :

  • ENVIRONMENT_NAME par le nom de l'environnement.
  • LOCATION par la région dans laquelle se trouve l'environnement.
  • PACKAGE_NAME par le nom du package.
  • EXTRAS_AND_VERSION par le spécificateur de version et d'extras facultatif. Pour omettre des versions et des extras, spécifiez une valeur vide.
  • Pour ajouter plusieurs packages, ajoutez des entrées supplémentaires pour les packages dans pypi_packages.

Exemple :

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]"
      }
    }
  }
}

Installer des packages à partir d’un dépôt public

Vous pouvez installer des packages hébergés dans d'autres dépôts qui ont une adresse IP publique.

Les packages doivent être correctement configurés pour que l'outil pip par défaut puisse l'installer.

Pour effectuer l'installation à partir d'un dépôt de packages disposant d'une adresse publique:

  1. Créez un fichier pip.conf et incluez-y les informations suivantes, le cas échéant:

    • URL du dépôt
    • Identifiants d'accès au dépôt
    • Options d'installation de pip autres que celles par défaut

    Exemple :

    [global]
    index-url=https://example.com/
    

    Si vous souhaitez récupérer des packages à partir de plusieurs dépôts, utilisez un dépôt virtuel Artifact Registry pour contrôler l'ordre dans lequel pip recherche vos dépôts.

  2. Déterminez l'URI du bucket de votre environnement.

  3. Importez le fichier pip.conf dans le dossier /config/pip/ du bucket de votre environnement.

  4. Installez les packages en utilisant l'une des méthodes disponibles.

Installer des packages à partir d'un dépôt Artifact Registry

Vous pouvez stocker des packages dans un dépôt Artifact Registry de votre projet et configurer votre environnement pour l'installer à partir de celui-ci.

Configurez les rôles et les autorisations:

  1. Le compte de service de votre environnement doit disposer du rôle iam.serviceAccountUser.

  2. Assurez-vous que le compte de service Cloud Build dispose des autorisations de lecture dans votre dépôt Artifact Registry.

  3. Si votre environnement a limité l'accès aux autres services de votre projet, par exemple si vous utilisez VPC Service Controls:

    1. Attribuez des autorisations d'accès à votre dépôt Artifact Registry au compte de service de l'environnement plutôt qu'au compte de service Cloud Build.

    2. Assurez-vous que la connectivité au dépôt Artifact Registry est configurée dans votre projet.

Pour installer des packages PyPI personnalisés à partir d'un dépôt Artifact Registry, procédez comme suit:

  1. Créez un fichier pip.conf et incluez-y les informations suivantes, le cas échéant:

    • URL du dépôt Artifact Registry
    • Identifiants d'accès au dépôt
    • Options d'installation de pip autres que celles par défaut
    • Si vous souhaitez n'utiliser que votre dépôt Artifact Registry comme source de packages, redéfinissez le paramètre index-url. Sinon, le dépôt que vous spécifiez dans le paramètre extra-index-url est utilisé en plus de l'index de package PyPI par défaut (pypi.python.org).

    Pour un dépôt Artifact Registry, ajoutez /simple/ à l'URL du dépôt:

    [global]
    extra-index-url = https://us-central1-python.pkg.dev/example-project/example-repository/simple/
    
  2. Importez ce fichier pip.conf dans le dossier /config/pip/ du bucket de votre environnement. Exemple : gs://us-central1-example-bucket/config/pip/pip.conf.

  3. Installez les packages en utilisant l'une des méthodes disponibles.

Installer des packages à partir d'un dépôt privé

Vous pouvez héberger un dépôt privé sur le réseau de votre projet et configurer votre environnement pour installer des packages Python à partir de celui-ci.

Configurez les rôles et les autorisations:

  1. Le compte de service de votre environnement Cloud Composer doit disposer du rôle iam.serviceAccountUser.

  2. Si vous installez des packages PyPI personnalisés à partir d'un dépôt du réseau de votre projet et que ce dépôt ne possède pas d'adresse IP publique:

    1. Attribuez au compte de service de l'environnement des autorisations permettant d'accéder à ce dépôt.

    2. Assurez-vous que la connectivité à ce dépôt est configurée dans votre projet.

Pour installer des packages à partir d’un dépôt privé hébergé sur le réseau de votre projet:

  1. Créez un fichier pip.conf et incluez-y les informations suivantes, le cas échéant:

    • Adresse IP du dépôt sur le réseau de votre projet
    • Identifiants d'accès au dépôt
    • Options d'installation de pip autres que celles par défaut

    Exemple :

    [global]
    extra-index-url=https://192.0.2.10/
    
  2. Importez le fichier pip.conf dans le dossier /config/pip/ du bucket de votre environnement. Exemple : gs://us-central1-example-bucket/config/pip/pip.conf.

  3. Installez les packages en utilisant l'une des méthodes disponibles.

Installer une bibliothèque Python locale

Pour installer une bibliothèque Python interne ou locale, procédez comme suit :

  1. Placez les dépendances dans un sous-répertoire du dossier dags/ du bucket de votre environnement. Pour importer un module à partir d'un sous-répertoire, chaque sous-répertoire du chemin d'accès du module doit contenir un fichier de repère de package __init__.py.

    Dans l'exemple suivant, la dépendance est coin_module.py:

    dags/
      use_local_deps.py  # A DAG file.
      dependencies/
        __init__.py
        coin_module.py
    
  2. Importez la dépendance à partir du fichier de définition du DAG.

    Exemple :

from dependencies import coin_module

Utiliser des packages qui dépendent de bibliothèques d'objets partagées

Certains packages PyPI dépendent de bibliothèques système. Bien que Cloud Composer ne soit pas compatible avec les bibliothèques système, vous pouvez utiliser les options suivantes :

  • Utiliser KubernetesPodOperator. Définissez l'image de l'opérateur sur une image de build personnalisée. Si vous rencontrez des paquets qui échouent lors de l'installation en raison d'une dépendance système non satisfaite, utilisez cette option.

  • Importez les bibliothèques d'objets partagées dans le bucket de votre environnement. Si vos packages PyPI ont bien été installés, mais échouent au moment de l'exécution, utilisez cette option.

    1. Recherchez manuellement les bibliothèques d'objets partagées pour la dépendance PyPI (un fichier .so).
    2. Importez les bibliothèques d'objets partagées dans le dossier /plugins du bucket de votre environnement.
    3. Définissez la variable d'environnement suivante : LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/airflow/gcs/plugins

Installer des packages dans des environnements IP privés

Cette section explique comment installer des packages dans des environnements IP privés.

Selon la configuration de votre projet, votre environnement peut ne pas avoir accès à l'Internet public.

Environnement IP privé avec accès Internet public

Si votre environnement IP privé peut accéder à l'Internet public, vous pouvez installer des packages à l'aide des options pour les environnements IP publics:

Environnement IP privé sans accès à Internet

Si votre environnement IP privé n'a pas accès à l'Internet public, vous pouvez installer des packages de l'une des manières suivantes:

  • Utilisez un dépôt PyPI privé hébergé sur le réseau de votre projet.
  • Utilisez une VM de serveur proxy du réseau de votre projet pour vous connecter à un dépôt PyPI sur l'Internet public. Spécifiez l'adresse du proxy dans le fichier /config/pip/pip.conf du bucket de votre environnement.
  • Utilisez un dépôt Artifact Registry comme seule source de packages. Pour ce faire, redéfinissez le paramètre index-url, comme décrit ci-dessus.
  • Si votre stratégie de sécurité autorise l'accès aux adresses IP externes depuis votre réseau VPC, vous pouvez autoriser l'installation de packages à partir de dépôts sur l'Internet public en configurant Cloud NAT.
  • Placez les dépendances Python dans le dossier /dags du bucket de votre environnement pour les installer en tant que bibliothèques locales. Cette option n'est peut-être pas adaptée si l'arborescence de dépendances est volumineuse.

Installer dans un environnement IP privé soumis à des restrictions d'emplacement des ressources

Garder votre projet en conformité avec les exigences de restriction d'emplacement des ressources qui interdisent l'utilisation de certains outils. En particulier, Cloud Build ne peut pas être utilisé pour l'installation de packages, ce qui empêche l'accès direct aux dépôts sur l'Internet public.

Pour installer des dépendances Python dans un tel environnement, suivez les instructions relatives à un environnement IP privé sans accès à Internet.

Installer une dépendance Python dans un environnement IP privé dans un périmètre VPC Service Controls

La protection de votre projet avec un périmètre VPC Service Controls entraîne des restrictions de sécurité supplémentaires. En particulier, Cloud Build ne peut pas être utilisé pour l'installation de packages, ce qui empêche l'accès direct aux dépôts sur l'Internet public.

Pour installer des dépendances Python pour un environnement IP privé à l'intérieur d'un périmètre, suivez les instructions relatives aux environnements IP privés sans accès à Internet.

Étapes suivantes