Snowflake-kobling
Koble Snowflake til Brevo gjennom Tajo for å synkronisere kundesegmenter fra datalageret ditt, berike kontaktprofiler med analysedata og drive personaliserte markedsføringskampanjer med lagerdrevet innsikt.
Oversikt
| Egenskap | Verdi |
|---|---|
| Plattform | Snowflake |
| Kategori | Datalager (Custom) |
| Oppsettskompleksitet | Moderat |
| Offisiell integrasjon | Nei |
| Synkroniserte data | Kunder, segmenter, analyse, hendelser |
| Autentiseringsmetode | Nøkkelpar / OAuth 2.0 |
Funksjoner
- Reverse ETL - Push kundesegmenter fra Snowflake til Brevo-kontaktlister
- Målgruppesynkronisering - Synkroniser lagerberegnede målgrupper for målrettede kampanjer
- Analyseberikelse - Berik Brevo-kontakter med beregnede målinger (LTV, RFM-score)
- SQL-baserte spørringer - Bruk Snowflake SQL REST API for å kjøre spørringer programmatisk
- Planlagt synkronisering - Kjør automatiserte datapipelines med konfigurerbare intervaller
- Støtte for flere utsagn - Kjør komplekse datatransformasjoner i enkle API-kall
Forutsetninger
Før du begynner, sørg for at du har:
- En Snowflake-konto med ACCOUNTADMIN- eller SYSADMIN-rollen
- En Brevo-konto med API-tilgang
- En Tajo-konto med konnektor-rettigheter
- Et dedikert Snowflake-warehouse for integrasjonsspørringer
- En nettverkspolicy som tillater Tajo-IP-adresser
Autentisering
Nøkkelparautentisering (anbefalt)
# Generer RSA-nøkkelparopenssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocryptopenssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
# Tildel offentlig nøkkel til Snowflake-bruker# I 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
# Bruker JWT-token med 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"}'Konfigurasjon
Grunnleggende oppsett
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 * * *" # Hver 6. time
queries: customer_segments: | SELECT email, segment_name, ltv_score, rfm_class FROM customer_segments WHERE updated_at > :last_syncFeltmapping
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-endepunkter
| Endepunkt | Metode | Beskrivelse |
|---|---|---|
/api/v2/statements | POST | Send inn SQL-utsagn for kjøring |
/api/v2/statements/{statementHandle} | GET | Sjekk kjøringsstatus |
/api/v2/statements/{statementHandle}/cancel | POST | Avbryt et kjørende utsagn |
/api/v2/statements/{statementHandle}?partition={id} | GET | Hent resultatpartisjoner |
SQL API-partisjoner
Snowflake SQL API returnerer store resultatsett i partisjoner. Hver partisjon inneholder opptil omtrent 12 MB data. Bruk partisjonsparameteren for å iterere gjennom resultater.
Kodeeksempler
Initialiser kobling
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'});Synkroniser kundesegmenter via SQL API
// Kjør en SQL-spørring 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 resultaterlet status = result.statementStatusUrl;while (result.code !== '090001') { const check = await fetch(status, { headers: { 'Authorization': `Bearer ${jwtToken}` } }); result = await check.json();}
// Synkroniser til 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 beregnede målgrupper fra Snowflake til Brevo-listerawait 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' } }});Ratebegrensninger
| Ressurs | Grense | Merknader |
|---|---|---|
| SQL API samtidige spørringer | 20 per bruker | Per Snowflake-konto |
| SQL API-resultatstørrelse | 12 MB per partisjon | Paginer med partisjons-ID-er |
| Utsagnstidsavbrudd | 172 800 sek (48 t) | Konfigurerbart per spørring |
| API-forespørsler | Varierer etter plan | Basert på Snowflake-versjon |
Warehouse-kostnader
Snowflake fakturerer basert på kompute-tid. Bruk et dedikert, riktig dimensjonert warehouse for Tajo-spørringer og sett auto-suspend for å minimere kostnader.
Feilsøking
| Problem | Årsak | Løsning |
|---|---|---|
| Autentisering mislyktes | Utløpt JWT-token | Regenerer JWT med gyldig utløp |
| Spørringstidsavbrudd | Stort datasett | Legg til filtre eller bruk inkrementell synkronisering |
| Nettverksfeil | IP ikke hvitelistet | Legg Tajo-IP-er til Snowflake-nettverkspolicyen |
| Manglende kolonner | Skjemaendring | Oppdater feltmappingkonfigurasjon |
| Partisjonsfeil | Resultat for stort | Behandle resultater i mindre partisjoner |
Feilsøkingsmodus
connectors: snowflake: debug: true log_level: verbose log_queries: trueBeste praksis
- Bruk et dedikert warehouse - Unngå konflikt med produksjonsarbeidslast
- Implementer inkrementell synkronisering - Spør kun om endrede poster siden siste synkronisering
- Sett auto-suspend - Konfigurer warehouse til å suspendere etter 5 minutter med inaktivitet
- Bruk nøkkelparautentisering - Foretrekk nøkkelpar fremfor passordautentisering
- Optimaliser spørringer - Filtrer og projiser kun nødvendige kolonner for raskere synkroniseringer
- Overvåk kreditter - Spor Snowflake-kredittforbruk for integrasjonsspørringer
Sikkerhet
- Nøkkelparautentisering - RSA 2048-bits kryptering for API-tilgang
- OAuth 2.0 - Token-basert autentisering med rollescoping
- Nettverkspolicyer - IP-hviteliste for Tajo-tjenesteendepunkter
- Rollebasert tilgang - Dedikert Snowflake-rolle med minimalt nødvendige rettigheter
- Kryptert dataoverføring - TLS 1.2+ for all API-kommunikasjon
- Datamaskering - Bruk Snowflakes dynamiske datamaskering for sensitive felt