Snowflake-koppling
Kopplingens status: Planerad Inte byggd än. Tajo kör inte den här kopplingen i dag.
Illustration · exempeldata
Exempel på synkronisering
Källa
Snowflake
Kopplingens status: Planerad
Mål
Ditt andra verktyg
Kopplingens status: Eget verktyg
Fältmappning
| Källfält | Målfält | Exempelvärde |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Utkast
- Granska en post
- Godkänn den här versionen
Status gäller varje enskild koppling och garanterar inte att den här synkroniseringen är klar. Fälten är illustrativa. Kontrollera det faktiska schemat och behörigheterna innan synkronisering körs.
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