Connecteur Snowflake
Connectez Snowflake à Brevo via Tajo pour synchroniser les segments clients depuis votre entrepôt de données, enrichir les profils de contact avec des données analytiques et alimenter des campagnes marketing personnalisées grâce aux insights issus de l’entrepôt.
Vue d’ensemble
| Propriété | Valeur |
|---|---|
| Plateforme | Snowflake |
| Catégorie | Entrepôt de données (Custom) |
| Complexité d’installation | Moyenne |
| Intégration officielle | Non |
| Données synchronisées | Clients, segments, analytiques, événements |
| Méthode d’authentification | Key Pair / OAuth 2.0 |
Fonctionnalités
- Reverse ETL, Poussez les segments clients depuis Snowflake vers les listes de contacts Brevo
- Synchronisation d’audiences, Synchronisez les audiences calculées dans l’entrepôt pour des campagnes ciblées
- Enrichissement analytique, Enrichissez les contacts Brevo avec des métriques calculées (LTV, scores RFM)
- Requêtes SQL, Utilisez l’API REST SQL Snowflake pour exécuter des requêtes programmatiquement
- Synchronisation planifiée, Exécutez des pipelines de données automatisés selon des intervalles configurables
- Prise en charge multi-statements, Exécutez des transformations de données complexes en un seul appel API
Prérequis
Avant de commencer, assurez-vous de disposer de :
- Un compte Snowflake avec le rôle ACCOUNTADMIN ou SYSADMIN
- Un compte Brevo avec accès API
- Un compte Tajo avec les permissions connecteur
- Un warehouse Snowflake dédié aux requêtes d’intégration
- Une network policy autorisant les adresses IP Tajo
Authentification
Authentification par paire de clés (recommandée)
# Générer une paire de clés RSAopenssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocryptopenssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
# Assigner la clé publique à l'utilisateur Snowflake# Dans Snowflake :# ALTER USER tajo_integration SET RSA_PUBLIC_KEY='MII...';Authentification OAuth 2.0
const tokenResponse = await fetch( 'https://<account>.snowflakecomputing.com/oauth/token-request', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ grant_type: 'client_credentials', client_id: process.env.SNOWFLAKE_CLIENT_ID, client_secret: process.env.SNOWFLAKE_CLIENT_SECRET, scope: 'session:role:TAJO_ROLE' }) });Authentification SQL API
# Avec un token JWT sur l'API SQLcurl -X POST \ 'https://<account>.snowflakecomputing.com/api/v2/statements' \ -H 'Authorization: Bearer <jwt_token>' \ -H 'Content-Type: application/json' \ -H 'X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT' \ -d '{"statement": "SELECT * FROM customers LIMIT 10", "warehouse": "TAJO_WH"}'Configuration
Configuration de base
connectors: snowflake: enabled: true account: "your-account.snowflakecomputing.com" warehouse: "TAJO_WH" database: "MARKETING_DB" schema: "PUBLIC" role: "TAJO_ROLE"
sync: customers: true segments: true analytics: true schedule: "0 */6 * * *" # Toutes les 6 heures
queries: customer_segments: | SELECT email, segment_name, ltv_score, rfm_class FROM customer_segments WHERE updated_at > :last_syncMappage des champs
field_mapping: email: email first_name: FIRSTNAME last_name: LASTNAME ltv_score: LTV_SCORE rfm_class: RFM_SEGMENT total_orders: ORDER_COUNT last_purchase_date: LAST_ORDER_DATE predicted_churn: CHURN_RISK customer_segment: SEGMENT_NAMEEndpoints API
| Endpoint | Méthode | Description |
|---|---|---|
/api/v2/statements | POST | Soumettre des instructions SQL pour exécution |
/api/v2/statements/{statementHandle} | GET | Vérifier le statut d’exécution |
/api/v2/statements/{statementHandle}/cancel | POST | Annuler une instruction en cours |
/api/v2/statements/{statementHandle}?partition={id} | GET | Récupérer les partitions de résultats |
Partitions de l'API SQL
L’API SQL de Snowflake renvoie les grands ensembles de résultats en partitions. Chaque partition contient jusqu’à environ 12 Mo de données. Utilisez le paramètre partition pour itérer sur les résultats.
Exemples de code
Initialiser le connecteur
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('snowflake', { account: process.env.SNOWFLAKE_ACCOUNT, privateKey: process.env.SNOWFLAKE_PRIVATE_KEY, warehouse: 'TAJO_WH', database: 'MARKETING_DB', schema: 'PUBLIC'});Synchroniser des segments clients via l’API SQL
// Exécuter une requête SQL via l'API REST SQL de Snowflakeconst response = await fetch( `https://${account}.snowflakecomputing.com/api/v2/statements`, { method: 'POST', headers: { 'Authorization': `Bearer ${jwtToken}`, 'Content-Type': 'application/json', 'X-Snowflake-Authorization-Token-Type': 'KEYPAIR_JWT' }, body: JSON.stringify({ statement: `SELECT email, segment, ltv FROM customer_segments WHERE updated_at > '${lastSync}'`, warehouse: 'TAJO_WH', database: 'MARKETING_DB', schema: 'PUBLIC', timeout: 120 }) });
const result = await response.json();const statementHandle = result.statementHandle;
// Poller pour obtenir les résultatslet status = result.statementStatusUrl;while (result.code !== '090001') { const check = await fetch(status, { headers: { 'Authorization': `Bearer ${jwtToken}` } }); result = await check.json();}
// Synchroniser vers Brevo via Tajofor (const row of result.data) { await tajo.contacts.sync({ email: row[0], attributes: { SEGMENT: row[1], LTV: row[2] } });}Pipeline Reverse ETL
// Pousser les audiences calculées de Snowflake vers les listes Brevoawait tajo.connectors.sync('snowflake', { type: 'reverse-etl', query: ` SELECT email, first_name, last_name, predicted_ltv, churn_score FROM ml_predictions.customer_scores WHERE score_date = CURRENT_DATE() `, destination: { list_id: 42, attribute_mapping: { predicted_ltv: 'PREDICTED_LTV', churn_score: 'CHURN_SCORE' } }});Limites de débit
| Ressource | Limite | Notes |
|---|---|---|
| Requêtes API SQL simultanées | 20 par utilisateur | Par compte Snowflake |
| Taille de résultat API SQL | 12 Mo par partition | Paginez avec les IDs de partition |
| Timeout d’instruction | 172 800 s (48 h) | Configurable par requête |
| Requêtes API | Variable selon le plan | Selon l’édition Snowflake |
Coûts du warehouse
Snowflake facture en fonction du temps de calcul. Utilisez un warehouse dédié de taille appropriée pour les requêtes Tajo et configurez l’auto-suspend pour minimiser les coûts.
Dépannage
| Problème | Cause | Solution |
|---|---|---|
| Authentification échouée | Token JWT expiré | Régénérez un JWT avec une expiration valide |
| Timeout de requête | Jeu de données volumineux | Ajoutez des filtres ou utilisez une synchronisation incrémentale |
| Erreur réseau | IP non whitelistée | Ajoutez les IPs Tajo à la network policy Snowflake |
| Colonnes manquantes | Changement de schéma | Mettez à jour la configuration de mappage des champs |
| Erreur de partition | Résultat trop volumineux | Traitez les résultats en partitions plus petites |
Mode debug
connectors: snowflake: debug: true log_level: verbose log_queries: trueBonnes pratiques
- Utilisez un warehouse dédié, Évitez la contention avec les charges de travail de production
- Implémentez une synchronisation incrémentale, Interrogez uniquement les enregistrements modifiés depuis la dernière synchronisation
- Configurez l’auto-suspend, Paramétrez le warehouse pour qu’il se suspende après 5 minutes d’inactivité
- Utilisez l’auth par paire de clés, Préférez les paires de clés à l’authentification par mot de passe
- Optimisez les requêtes, Filtrez et ne sélectionnez que les colonnes nécessaires pour des syncs plus rapides
- Surveillez les crédits, Suivez la consommation de crédits Snowflake pour les requêtes d’intégration
Sécurité
- Authentification par paire de clés, Chiffrement RSA 2048 bits pour l’accès API
- OAuth 2.0, Authentification basée sur tokens avec portée par rôle
- Network policies, Allowlist d’IP pour les endpoints de service Tajo
- Accès basé sur les rôles, Rôle Snowflake dédié avec privilèges minimum requis
- Transfert de données chiffré, TLS 1.2+ pour toutes les communications API
- Masquage des données, Utilisez le Dynamic Data Masking de Snowflake pour les champs sensibles