Snowflake-koppling
Anslut Snowflake till Brevo via Tajo för att synka kundsegment från ditt datalager, berika kontaktprofiler med analysdata och driva personliga marknadsföringskampanjer med insikter från datalagret.
Översikt
| Egenskap | Värde |
|---|---|
| Plattform | Snowflake |
| Kategori | Datalager (Anpassad) |
| Installationskomplexitet | Medel |
| Officiell integration | Nej |
| Data som synkas | Kunder, segment, analyser, händelser |
| Autentiseringsmetod | Nyckelpar / OAuth 2.0 |
Funktioner
- Reverse ETL - Skicka kundsegment från Snowflake till Brevo-kontaktlistor
- Målgruppssynkronisering - Synka målgrupper beräknade i datalagret för riktade kampanjer
- Analysberikning - Berika Brevo-kontakter med beräknade mått (LTV, RFM-poäng)
- SQL-baserade frågor - Använd Snowflake SQL REST API för att köra frågor programmatiskt
- Schemalagd synkronisering - Kör automatiserade datapipelines med konfigurerbara intervall
- Stöd för flera satser - Kör komplexa datatransformationer i enskilda API-anrop
Förutsättningar
Innan du börjar, se till att du har:
- Ett Snowflake-konto med ACCOUNTADMIN- eller SYSADMIN-roll
- Ett Brevo-konto med API-åtkomst
- Ett Tajo-konto med kopplingsbehörigheter
- Ett dedikerat Snowflake-warehouse för integrationsfrågor
- Nätverkspolicy som tillåter Tajos IP-adresser
Autentisering
Nyckelparautentisering (rekommenderas)
# Generate RSA key pairopenssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocryptopenssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
# Assign public key to Snowflake user# In Snowflake:# ALTER USER tajo_integration SET RSA_PUBLIC_KEY='MII...';OAuth 2.0-autentisering
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' }) });SQL API-autentisering
# Using JWT token with the SQL APIcurl -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"}'Konfiguration
Grundinställning
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 * * *" # Every 6 hours
queries: customer_segments: | SELECT email, segment_name, ltv_score, rfm_class FROM customer_segments WHERE updated_at > :last_syncFältmappning
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_NAMEAPI-endpoints
| Endpoint | Metod | Beskrivning |
|---|---|---|
/api/v2/statements | POST | Skicka SQL-satser för exekvering |
/api/v2/statements/{statementHandle} | GET | Kontrollera exekveringsstatus |
/api/v2/statements/{statementHandle}/cancel | POST | Avbryt en pågående sats |
/api/v2/statements/{statementHandle}?partition={id} | GET | Hämta resultatpartitioner |
SQL API-partitioner
Snowflake SQL API returnerar stora resultatuppsättningar i partitioner. Varje partition innehåller upp till cirka 12 MB data. Använd partitionsparametern för att iterera genom resultaten.
Kodexempel
Initiera kopplingen
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'});Synka kundsegment via SQL API
// Execute a SQL query via Snowflake SQL REST APIconst 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;
// Poll for resultslet status = result.statementStatusUrl;while (result.code !== '090001') { const check = await fetch(status, { headers: { 'Authorization': `Bearer ${jwtToken}` } }); result = await check.json();}
// Sync to Brevo via Tajofor (const row of result.data) { await tajo.contacts.sync({ email: row[0], attributes: { SEGMENT: row[1], LTV: row[2] } });}Reverse ETL-pipeline
// Push computed audiences from Snowflake to Brevo listsawait 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' } }});Hastighetsbegränsningar
| Resurs | Gräns | Anteckningar |
|---|---|---|
| SQL API samtidiga frågor | 20 per användare | Per Snowflake-konto |
| SQL API-resultatstorlek | 12 MB per partition | Sidindela med partitions-ID |
| Sats-timeout | 172 800 sek (48 h) | Konfigurerbar per fråga |
| API-förfrågningar | Varierar per plan | Baserat på Snowflake-utgåva |
Warehouse-kostnader
Snowflake debiterar baserat på beräkningstid. Använd ett dedikerat, lämpligt dimensionerat warehouse för Tajo-frågor och sätt auto-suspend för att minimera kostnader.
Felsökning
| Problem | Orsak | Lösning |
|---|---|---|
| Autentisering misslyckades | Utgången JWT-token | Återgenerera JWT med giltig utgång |
| Frågetimeout | Stort dataset | Lägg till filter eller använd inkrementell synk |
| Nätverksfel | IP ej godkänd | Lägg till Tajo-IP:er i Snowflakes nätverkspolicy |
| Kolumner saknas | Schemaändring | Uppdatera fältmappningskonfigurationen |
| Partitionsfel | Resultat för stort | Behandla resultat i mindre partitioner |
Felsökningsläge
connectors: snowflake: debug: true log_level: verbose log_queries: trueBästa praxis
- Använd ett dedikerat warehouse - Undvik konkurrens med produktionsbelastningar
- Implementera inkrementell synk - Fråga endast efter ändrade poster sedan senaste synk
- Sätt auto-suspend - Konfigurera warehouse att suspendera efter 5 minuters inaktivitet
- Använd nyckelparautentisering - Föredra nyckelpar framför lösenordsautentisering
- Optimera frågor - Filtrera och projicera endast nödvändiga kolumner för snabbare synkroniseringar
- Övervaka krediter - Spåra Snowflakes kreditförbrukning för integrationsfrågor
Säkerhet
- Nyckelparautentisering - RSA 2048-bitars kryptering för API-åtkomst
- OAuth 2.0 - Tokenbaserad autentisering med roll-scoping
- Nätverkspolicyer - IP-allowlisting för Tajos service-endpoints
- Rollbaserad åtkomst - Dedikerad Snowflake-roll med minsta nödvändiga privilegier
- Krypterad dataöverföring - TLS 1.2+ för all API-kommunikation
- Datamaskering - Använd Snowflakes dynamiska datamaskering för känsliga fält