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

EgenskapVärde
PlattformSnowflake
KategoriDatalager (Anpassad)
InstallationskomplexitetMedel
Officiell integrationNej
Data som synkasKunder, segment, analyser, händelser
AutentiseringsmetodNyckelpar / 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:

  1. Ett Snowflake-konto med ACCOUNTADMIN- eller SYSADMIN-roll
  2. Ett Brevo-konto med API-åtkomst
  3. Ett Tajo-konto med kopplingsbehörigheter
  4. Ett dedikerat Snowflake-warehouse för integrationsfrågor
  5. Nätverkspolicy som tillåter Tajos IP-adresser

Autentisering

Nyckelparautentisering (rekommenderas)

Terminal window
# Generate RSA key pair
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
openssl 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

Terminal window
# Using JWT token with the SQL API
curl -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_sync

Fä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_NAME

API-endpoints

EndpointMetodBeskrivning
/api/v2/statementsPOSTSkicka SQL-satser för exekvering
/api/v2/statements/{statementHandle}GETKontrollera exekveringsstatus
/api/v2/statements/{statementHandle}/cancelPOSTAvbryt en pågående sats
/api/v2/statements/{statementHandle}?partition={id}GETHä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 API
const 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 results
let status = result.statementStatusUrl;
while (result.code !== '090001') {
const check = await fetch(status, {
headers: { 'Authorization': `Bearer ${jwtToken}` }
});
result = await check.json();
}
// Sync to Brevo via Tajo
for (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 lists
await 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

ResursGränsAnteckningar
SQL API samtidiga frågor20 per användarePer Snowflake-konto
SQL API-resultatstorlek12 MB per partitionSidindela med partitions-ID
Sats-timeout172 800 sek (48 h)Konfigurerbar per fråga
API-förfrågningarVarierar per planBaserat 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

ProblemOrsakLösning
Autentisering misslyckadesUtgången JWT-tokenÅtergenerera JWT med giltig utgång
FrågetimeoutStort datasetLägg till filter eller använd inkrementell synk
NätverksfelIP ej godkändLägg till Tajo-IP:er i Snowflakes nätverkspolicy
Kolumner saknasSchemaändringUppdatera fältmappningskonfigurationen
PartitionsfelResultat för stortBehandla resultat i mindre partitioner

Felsökningsläge

connectors:
snowflake:
debug: true
log_level: verbose
log_queries: true

Bästa praxis

  1. Använd ett dedikerat warehouse - Undvik konkurrens med produktionsbelastningar
  2. Implementera inkrementell synk - Fråga endast efter ändrade poster sedan senaste synk
  3. Sätt auto-suspend - Konfigurera warehouse att suspendera efter 5 minuters inaktivitet
  4. Använd nyckelparautentisering - Föredra nyckelpar framför lösenordsautentisering
  5. Optimera frågor - Filtrera och projicera endast nödvändiga kolumner för snabbare synkroniseringar
  6. Ö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

Relaterade resurser

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AI-assistent

Hej! Fråga mig om dokumentationen.