Dans les scripts Python de débutants, il n'est pas rare de voir des chaînes de connexion codées en dur : psycopg2.connect(user="postgres", password="SecretPassword123", host="192.168.1.50").
Cette pratique est une faille de sécurité majeure en entreprise : les mots de passe sont visibles en clair sur GitHub, s'affichent dans les journaux de logs d'Airflow et obligent à modifier le code source dès qu'un mot de passe expire.
Pour respecter le principe de séparation stricte entre le code et la configuration (12-Factor App), Apache Airflow centralise la gestion des accès via son système de Connexions (Connections).
flowchart LR
subgraph GestionnaireSecrets["Gestionnaire Sécurisé Airflow"]
UI["Interface Web : Admin > Connections"]
ENV["Variables d'environnement : AIRFLOW_CONN_*"]
VAULT["Secret Backends : HashiCorp Vault / AWS Secrets"]
end
subgraph Chiffrement["Sécurité au Repos"]
FERNET["Clé Fernet AES-128<br><i>AIRFLOW__CORE__FERNET_KEY</i>"]
end
subgraph Utilisation["Code Python des Tâches"]
HOOK["PostgresHook / SQLExecuteQueryOperator<br><b>conn_id = 'postgres_production'</b>"]
end
GestionnaireSecrets --> Chiffrement
Chiffrement -->|Injection transparente| Utilisation
style GestionnaireSecrets fill:#f1f5f9,stroke:#64748b
style Chiffrement fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#0f172a
style Utilisation fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#0f172a
1. Créer une connexion via l'interface Web#
- Connectez-vous sur l'interface d'Airflow (http://localhost:8080/).
- Dans la barre de menus supérieure, cliquez sur Admin > Connections.
- Cliquez sur le bouton bleu + (Add a new record) pour ouvrir le formulaire de saisie.
Les champs essentiels à renseigner :#
- Connection Id : Le nom unique utilisé dans votre code Python (par exemple
postgres_productionousnowflake_dw). - Connection Type : Sélectionnez le type de connecteur (ex. :
Postgres,MySQL,Amazon Web Services,Snowflake,HTTP). - Host : L'adresse IP ou le nom d'hôte du serveur de base de données.
[!TIP] Si votre base PostgreSQL tourne dans le même réseau Docker Compose qu'Airflow, le champ Host est simplement le nom du service Docker :
postgres. - Database / Schema : Le nom de la base de données cible (ex. :
entrepot_ventes). - Login : L'identifiant de l'utilisateur de base de données.
- Password : Le mot de passe associé (chiffré automatiquement dans la base de métadonnées).
- Port : Le port réseau (ex. :
5432pour PostgreSQL,3306pour MySQL,1433pour SQL Server). -
Extra : Champ JSON optionnel permettant de transmettre des paramètres avancés (options SSL, tokens d'API, chemins de clés privées).
-
Cliquez sur le bouton Test en bas du formulaire : si les identifiants et le réseau sont corrects, un bandeau vert confirme le succès de la connexion.
- Cliquez sur Save.
2. Déclarer des connexions via des variables d'environnement (Production & CI/CD)#
En environnement de production conteneurisé (Kubernetes, AWS ECS) ou dans vos pipelines d'intégration continue, il est déconseillé de saisir manuellement les connexions dans l'interface graphique.
Airflow permet de déclarer des connexions sous forme de variables d'environnement au format URI :
AIRFLOW_CONN_POSTGRES_PRODUCTION='postgresql://user_bi:SuperSecretPassword@postgres:5432/entrepot_ventes'
AIRFLOW_CONN_AWS_S3='aws://AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI%2FK7MDENG%2FbPxRfiCYEXAMPLEKEY@/?region_name=eu-west-3'
Airflow détecte instantanément ces variables d'environnement sans nécessiter aucune insertion en base de données !
3. Chiffrement au repos : La clé Fernet#
Les mots de passe saisis dans l'interface web sont automatiquement chiffrés dans la table connection de PostgreSQL grâce à l'algorithme Fernet (AES-128).
Cette clé de chiffrement est définie dans votre configuration :
[!CAUTION] Conservez précieusement votre clé Fernet lors des migrations de serveurs. Si vous perdez cette clé, vous ne pourrez plus déchiffrer aucun mot de passe de vos connexions existantes !
4. Utiliser la connexion dans un DAG#
Une fois la connexion déclarée avec l'identifiant postgres_production, vous pouvez l'exploiter de deux façons :
Approche 1 : Dans les Opérateurs natifs#
L'opérateur SQL officiel se charge d'ouvrir et fermer la session de manière totalement sécurisée :
from airflow.providers.common.sql.operators.sql import SQLExecuteQueryOperator
tache_purge = SQLExecuteQueryOperator(
task_id="purger_table_staging",
conn_id="postgres_production", # Appel de l'identifiant déclaré
sql="TRUNCATE TABLE staging.commandes_du_jour;",
)
Approche 2 : Dans du code Python avec les Hooks#
Les Hooks sont l'interface de programmation bas niveau d'Airflow vers les systèmes externes. Le PostgresHook permet d'exécuter des scripts arbitraires ou de charger des données directement dans des DataFrames Pandas :
from airflow.providers.postgres.hooks.postgres import PostgresHook
import pandas as pd
def extraire_et_analyser():
# Instanciation du Hook en fournissant l'ID de connexion
hook = PostgresHook(postgres_conn_id="postgres_production")
# 1. Exécution directe d'une requête et conversion en DataFrame Pandas
requete = "SELECT client_id, SUM(montant) AS ca FROM ventes GROUP BY client_id;"
df = hook.get_pandas_df(requete)
print(f"Extraction de {len(df)} clients acheteurs.")
# 2. Récupération d'un moteur SQLAlchemy pour des opérations avancées
moteur = hook.get_sqlalchemy_engine()
df.to_sql("synthese_clients", con=moteur, if_exists="replace", index=False)
Récapitulatif#
- Ne codez jamais d'identifiants sensibles en clair dans vos fichiers
.py. - Donnez un nom standard et explicite à vos connexions (ex. :
postgres_oltp,snowflake_dw). - Utilisez les Hooks pour interfacer facilement le monde Python/Pandas avec vos bases de données d'entreprise.
Vous maîtrisez désormais les composants fondamentaux d'Apache Airflow. Dans la leçon suivante, nous allons mobiliser toutes ces connaissances à travers un atelier pratique complet d'intégration de données !
Commentaires