Configuration du conteneur Agent Snowflake Connector for PostgreSQL¶
Note
Le Snowflake Connector for PostgreSQL est soumis aux Conditions du connecteur.
Cette rubrique décrit la procédure de configuration du conteneur d’agent Snowflake Connector for PostgreSQL. Un agent de connecteur de base de données est une application conteneurisée qui s’exécute à l’intérieur de votre infrastructure, se connectant directement à vos bases de données et à Snowflake.
Le processus de configuration de l’agent Snowflake Connector for PostgreSQL comprend les étapes suivantes :
Examiner les conditions préalables requises et sélectionner un système d’orchestration
[Facultatif] Configurer l’orchestration à l’aide de Kubernetes
Examiner les conditions préalables requises et sélectionner un système d’orchestration¶
Examinez et remplissez toutes les conditions préalables requises et passez à l’étape Configurer et exécuter l’agent.
Sélection d’un système d’orchestration de conteneur¶
L’agent est conditionné sous forme d’image de conteneur Docker standard et peut être exécuté sur n’importe quel système d’orchestration prenant en charge la norme. Il peut s’agir d’une instance Docker autonome, de Kubernetes, de RedHat OpenShift, d’une solution gérée dans le cloud telle que AWS Fargate ou d’autres solutions. Votre entreprise disposera souvent d’un système existant privilégié que vous pourrez utiliser.
Faites attention à la section Configuration de l’agent de ce document, car des systèmes d’orchestration différents entraînent des contraintes différentes. Il se peut que votre système ou votre configuration spécifique ne permette pas de monter des volumes accessibles en écriture (comme cela est requis avec l’option de configuration principale de l’agent).
Les exemples ultérieurs se concentreront sur Kubernetes comme système d’orchestration le plus populaire. L’approche sera souvent similaire dans d’autres systèmes et vous devrez ajuster les exemples à votre configuration.
Confirmer les ressources système requises¶
L’agent est une application gourmande en mémoire et nécessite un minimum de 6GB de RAM pour pouvoir fonctionner correctement.
Le nombre optimal de CPUs est de 4. Un nombre de CPUs inférieur peut diminuer les performances. Un nombre de CPUs supérieur n’améliorera pas les performances.
Configurer la connectivité¶
L’agent doit se connecter à chaque base de données source dans laquelle les données seront lues. Configurez votre réseau et vos pare-feu afin de permettre les connexions directes et afin que le port client de PostgreSQL soit accessible. Il s’agit généralement du port 5432
. Pour plus d’informations, voir la documentation sur les paramètres de connexion de PostgreSQL.
Si vos bases de données sources résident sur des réseaux isolés et qu’il n’est pas possible de se connecter à partir d’un seul agent, vous devrez installer des instances supplémentaires de l’application native du connecteur, chacune avec son propre agent. Cette fonctionnalité est actuellement proposée en avant-première privée. Pour demander l’accès, contactez l”Assistance Snowflake.
L’agent se connecte également directement à votre déploiement Snowflake. Pour plus d’informations sur les noms d’hôte qui doivent être disponibles, voir Autorisation des noms d’hôte.
Si l’une des connexions de l’agent passe par un proxy, vous devrez transmettre une configuration supplémentaire à l’agent. Voir Examiner les variables d’environnement de configuration facultatives.
Configurer et exécuter l’agent¶
La configuration et l’exécution de l’agent se composent des étapes suivantes :
[Facultatif] Obtenir et préparer des certificats SSL pour les bases de données sources
Préparer les fichiers ou variables d’environnement pour Préparer la configuration de l’agent et démarrer l’agent
Examiner les variables d’environnement de configuration facultatives
Si nécessaire Configurez la connectivité PrivateLink.
En option Configurez l’orchestration à l’aide de Kubernetes.
[Facultatif] Obtenir et préparer des certificats SSL pour les bases de données sources¶
Si vous avez l’intention d’utiliser des connexions SSL entre l’agent et les bases de données sources, vous devez acquérir le certificat racine de vos instances PostgreSQL et le monter dans le conteneur de l’agent sous /home/agent/.postgresql/root.crt
.
Préparer la configuration de l’agent¶
L’agent peut être configuré via des variables d’environnement et/ou des fichiers JSON montés dans le conteneur. Les clés d’accès requises pour se connecter à Snowflake peuvent être montées à partir du système de fichiers de l’hôte, fournies sous forme de secrets de conteneur ou de variables d’environnement.
Les sections suivantes décrivent différentes options de configuration, de la plus simple à la plus complète. Adoptez une approche adaptée aux spécificités de votre infrastructure.
La manière la plus simple de configurer l’agent est de monter deux fichiers JSON dans le conteneur lors de l’exécution :
snowflake.json
contient la configuration permettant à l’agent de se connecter à votre compte Snowflake.Téléchargez ce fichier à la fin du processus de configuration du connecteur via l’assistant disponible dans Snowsight.
datasources.json
contient la liste des bases de données sources auxquelles l’agent doit se connecter.Vous devrez préparer ce fichier vous-même.
Juste après le téléchargement, snowflake.json
inclut une clé privée temporaire pour le compte de service Snowflake qui représente l’agent. Lors du démarrage de l’agent pour la première fois, l’agent remplacera automatiquement cette clé temporaire par un nouveau jeu de clés permanent et les affichera au niveau du chemin d’accès /home/agent/.ssh/
à l’intérieur du conteneur. snowflake.json
et le chemin d’accès sous /home/agent/.ssh/
doivent être montés de sorte à être accessibles en écriture pour que l’agent puisse démarrer.
Sinon, vous pouvez fournir votre propre clé privée pour le compte de service de l’agent. Voir Examiner les variables d’environnement de configuration facultatives pour connaître les variables d’environnement requises à transmettre.
Prudence
Si l’agent trouve une clé privée existante, soit sous forme de fichier monté, soit sous forme de variable d’environnement, il ignorera toute clé temporaire susceptible d’être encore présente dans snowflake.json
.
Préparez le fichier datasources.json
en copiant et en renseignant le modèle suivant :
{
"<data_source_name_1>": {
"url": "jdbc:postgresql://<host>:<port>/<databaseName>[?<key1>=<value1>[&<key2>=<value2>]]",
"username": "<postgresql_db_username>",
"password": "<postgresql_db_password>",
"publication": "<postgresql_db_publication>",
"ssl": false
},
"<data_source_name_2>": {
"url": "jdbc:postgresql://<host>:<port>/<databaseName>[?<key1>=<value1>[&<key2>=<value2>]]",
"username": "<postgresql_db_username>",
"password": "<postgresql_db_password>",
"publication": "<postgresql_db_publication>",
"ssl": false
}
}
Lors de la création du fichier :
Vous devez ajouter au moins une source de données, avec une URL, sinon l’agent ne démarrera pas.
Vous pouvez ajouter autant de sources de données que nécessaire, à condition que l’agent puisse se connecter directement à chacune d’entre elles.
Les noms que vous saisissez deviennent les identificateurs dont vous aurez besoin ultérieurement pour appeler l’application native du connecteur et activer la réplication. Ils doivent être uniques pour chaque source de données.
Les noms des sources de données ne peuvent contenir que des chiffres et des lettres. Toutes les lettres minuscules seront automatiquement remplacées par des majuscules par l’agent.
Si vous activez des connexions SSL en définissant le paramètre
ssl
surtrue
, vous devrez également monter le certificat racine de la base de données source dans le conteneur. Voir [Facultatif] Obtenir et préparer des certificats SSL pour les bases de données sources.
Une fois que vous avez les deux fichiers JSON en place, un répertoire pour générer le nouveau jeu de clés et éventuellement le certificat SSL racine, démarrez le conteneur.
docker run -d \
--restart unless-stopped \
--name database-connector-agent \
--volume </path/to/ssh/keys/directory>:/home/agent/.ssh \
--volume </path/to/snowflake.json>:/home/agent/snowflake.json \
--volume </path/to/datasources.json>:/home/agent/datasources.json \
--volume </path/to/root.crt>:/home/agent/.postgresql/root.crt \
-m 6g \
snowflakedb/database-connector-agent:latest
Les options de configuration transmises via snowflake.json
et datasources.json
peuvent être fournies via des variables d’environnement.
Important
Les variables d’environnement ont priorité sur les paramètres fournis via l’un ou l’autre des fichiers JSON.
Les noms des variables d’environnement suivent la même structure que celle des chemins d’accès dans les deux fichiers JSON. Les clés imbriquées doivent être séparées par des traits de soulignement _
; chaque variable doit être préfixée de SNOWFLAKE_
; et les entrées de tableau doivent être préfixées via des index entiers.
Par exemple, le script suivant :
docker run \
-e SNOWFLAKE_USERNAME="POSTGRESQL_AGENT_USER" \
-e SNOWFLAKE_APPLICATION_NAME="SNOWFLAKE_CONNECTOR_FOR_POSTGRESQL" \
-e SNOWFLAKE_ALLOWLIST_0_HOST="example_account.us-west-2.aws.snowflakecomputing.com" \
-e SNOWFLAKE_ALLOWLIST_0_PORT=443 \
-e SNOWFLAKE_ALLOWLIST_0_TYPE="SNOWFLAKE_DEPLOYMENT" \
...
Est équivalent à :
{
"userName": "POSTGRESQL_AGENT_USER",
"applicationName": "SNOWFLAKE_CONNECTOR_FOR_POSTGRESQL",
"allowlist": [
{
"host": "example_account.us-west-2.aws.snowflakecomputing.com",
"port": 443,
"type": "SNOWFLAKE_DEPLOYMENT"
}
]
}
Vous n’avez pas besoin de copier toutes les entrées du tableau allowList
ou allowlistPrivatelink
. Au lieu de cela, recherchez l’entrée allowList
avec le type
SNOWFLAKE_DEPLOYMENT
et utilisez cette URL pour définir la variable SNOWFLAKE_ENFORCEDURL
, comme dans :
docker run \
-e SNOWFLAKE_USERNAME="POSTGRESQL_AGENT_USER" \
-e SNOWFLAKE_APPLICATION_NAME="SNOWFLAKE_CONNECTOR_FOR_POSTGRESQL" \
-e SNOWFLAKE_ENFORCEDURL="example_account.us-west-2.aws.snowflakecomputing.com:443" \
...
Les sources de données suivent une structure similaire et sont préfixées de SNOWFLAKE_DATASOURCES_
.
Par exemple :
docker run \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_URL="jdbc:postgresql://example.internal:5432/", \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_USERNAME="example_user" \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_PASSWORD="example_password" \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_PUBLICATION="example_publication" \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_SSL="false" \
...
Est équivalent à :
{
"POSTGRESQLDS1": {
"url": "jdbc:postgresql://example.internal:5432/",
"username": "example_user",
"password": "example_password",
"publication": "example_publication",
"ssl": false
}
}
Examiner les variables d’environnement de configuration facultatives¶
L’agent prend en charge les paramètres facultatifs suivants, disponibles via la définition de variables d’environnement supplémentaires dans le conteneur :
SNOWFLAKE_PRIVATEKEYPATH
Spécifie le chemin d’accès absolu au fichier contenant la clé privée de l’utilisateur d’agent. Cela est utilisé lors du montage de votre propre clé privée dans le conteneur, généralement via le secret d’un système d’orchestration.
SNOWFLAKE_PRIVATEKEYPASSWORD
Spécifie le mot de passe de la clé privée de l’utilisateur d’agent. Si vous laissez l’agent générer les clés, ce mot de passe sera défini sur la clé privée. Si vous réutilisez des clés existantes, ce mot de passe sera utilisé pour accéder à la clé privée existante.
SNOWFLAKE_PRIVATEKEY
Spécifie le contenu de la clé privée de l’utilisateur d’agent. Cela peut être défini lorsque le montage de la clé privée sous forme de fichier dans le conteneur n’est pas une option.
SNOWFLAKE_ENFORCEDURL
Spécifie l’URL permettant de se connecter à Snowflake, en remplaçant le propre mécanisme de découverte de l’agent. Cela est principalement utilisé pour se connecter à des déploiements PrivateLink.
JAVA_OPTS
Spécifie les paramètres ou propriétés Java supplémentaires qui seront transmis au processus de l’agent.
Les plus couramment utilisés sont :
L’option
-Xmx
permettant de définir la taille maximale du Heap Java. Snowflake recommande de définir cette valeur sur la quantité de mémoire disponible pour le conteneur, moins 1GB.Par exemple, si le conteneur a 6GB de RAM disponible, définissez les éléments suivants :
JAVA_OPTS=-Xmx5g
Lorsque la connexion de l’agent à Snowflake nécessite un proxy, définissez les éléments suivants :
JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
Pour contourner le proxy pour certains hôtes ou adresses IP, par exemple, des bases de données sources, définissez la propriété
http.nonProxyHosts
supplémentaire. Utilisez un symbole de barre verticale (|
) pour séparer plusieurs noms d’hôte. Utilisez un astérisque (*
) comme caractère générique.JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port> -Dhttp.nonProxyHosts='*.my_company.com|localhost|myorganization-myaccount.snowflakecomputing.com|192.168.91.*'
Pour transmettre les identifiants de connexion du proxy, définissez les propriétés système
http.proxyUser
ethttp.proxyPassword
.JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port> -Dhttp.proxyUser=<proxy-user> -Dhttp.proxyPassword=<proxy-pass>
Configurer la connectivité PrivateLink¶
Si vous vous connectez à un déploiement PrivateLink, vous devez fournir l’URL pour que l’agent puisse se connecter explicitement en définissant la variable d’environnement SNOWFLAKE_ENFORCEDURL
.
Pour déterminer l’URL PrivateLink de votre compte, procédez de l’une des manières suivantes :
Ouvrez le fichier
snowflake.json
que vous avez obtenu lors du processus de configuration. Recherchez le tableau nomméallowlistPrivatelink
, puis l’entrée avec letype
SNOWFLAKE_DEPLOYMENT
.Utilisez la fonction SYSTEM$GET_PRIVATELINK_CONFIG.
Comprendre les clés d’accès Snowflake¶
L’agent s’authentifie auprès de Snowflake sous forme de compte de service, créé par l’assistant de configuration du connecteur dans Snowsight, à l’aide d’un jeu de clés d’accès. L’assistant de configuration crée des clés d’accès temporaires et ajoute la clé privée au fichier snowflake.json
dans un champ nommé temporaryPrivateKey
.
Lors de son démarrage initial, l’agent remplace ces clés temporaires comme suit :
En générant un nouveau jeu de clés d’accès et en les stockant sous
/home/agent/.ssh
commedatabase-connector-agent-app-private-key.p8
etdatabase-connector-agent-app-public-key.pub
à l’intérieur du conteneur. Ce répertoire doit être monté sous forme de volume externe accessible en écriture dans le conteneur, afin que les clés persistent lorsque le conteneur s’arrête.En modifiant son compte de service de sorte à utiliser les nouvelles clés.
En supprimant le champ
temporaryPrivateKey
du fichiersnowflake.json
.
Après le remplacement de clés initial, l’agent ne fait jamais tourner les clés d’accès.
Vous pouvez utiliser les clés générées par l’agent. Ou vous pouvez créer votre propre jeu, modifier le compte de service et fournir la clé privée à l’agent.
L’ordre de découverte de la clé privée de l’agent est le suivant :
Toute clé transmise via la variable d’environnement
SNOWFLAKE_PRIVATEKEY
. Si cette valeur est trouvée, le connecteur ignorera la clé temporaire desnowflake.json
.Clés trouvées sur les volumes montés dans
/home/agent/.ssh/database-connector-agent-app-private-key.p8
. Si ce fichier est trouvé, le connecteur ignorera la clé temporaire desnowflake.json
.Valeur du champ
temporaryPrivateKey
du fichiersnowflake.json
.
Configurer l’orchestration à l’aide de Kubernetes¶
Note
Bien que cette section se concentre sur Kubernetes, le connecteur peut être lancé dans n’importe quel système d’orchestration de conteneur. Les syntaxes de configuration sont souvent similaires. Pour plus de détails, voir la documentation de votre système.
Lors de l’utilisation de Kubernetes, le montage de volumes accessibles en écriture n’est généralement pas une option. Par conséquent, l’agent ne pourra pas remplacer automatiquement les clés de son compte utilisateur Snowflake. Vous devrez créer manuellement un jeu de clés, modifier l’utilisateur, puis fournir la clé privée au conteneur exécutant l’agent, généralement sous forme de secret monté. Pour plus de détails sur la configuration de paires de clés pour les utilisateurs Snowflake, voir Configuration de l’authentification par paire de clés.
Nous vous recommandons de stocker les secrets dans un magasin sécurisé tel que HashiCorp Vault. Ces magasins comportent généralement des intégrations existantes avec Kubernetes, par exemple, Vault propose un opérateur spécialisé. Les détails de l’intégration seront spécifiques à votre système d’orchestration de conteneur et à votre magasin sécurisé. Pour plus de détails, voir leur documentation respective.
Kubernetes s’exécute normalement dans des clusters multi-nœuds, sans aucun moyen de monter des fichiers à partir de postes hôtes. Pour fournir au conteneur de l’agent les fichiers de configuration JSON, vous pouvez créer un ConfigMap Kubernetes stockant l’ensemble des trois fichiers.
L’exemple de base suivant montre comment configurer l’agent dans Kubernetes.
Créez un ConfigMap qui stockera
snowflake.json
et éventuellement le certificat racine SSL :kubectl create configmap database-connector-config \ --from-file=snowflake.json=</path/to/snowflake.json> \ --from-file=root.crt=</path/to/root.crt>
Créez un secret qui stockera le contenu de la clé privée de l’utilisateur d’agent et de
datasources.json
:kubectl create secret generic database-connector-secrets \ --from-file=private-key=</path/to/private/key/file> \ --from-file=datasources.json=</path/to/datasources.json>
Configurez le Pod de l’agent, en montant les fichiers de configuration et la clé privée sous forme de volumes :
apiVersion: v1 kind: Pod metadata: name: database-connector-agent spec: restartPolicy: Always containers: - name: database-connector-agent image: snowflakedb/database-connector-agent:latest resources: requests: memory: "6Gi" limits: memory: "8Gi" volumeMounts: - name: config mountPath: /home/agent/snowflake.json subPath: snowflake.json - name: config mountPath: /home/agent/.postgresql/root.crt subPath: root.crt - name: secrets mountPath: /home/agent/datasources.json subPath: datasources.json - name: secrets mountPath: /etc/private-key/private-key subPath: private-key env: - name: SNOWFLAKE_PRIVATEKEYPATH value: /etc/private-key/private-key volumes: - name: config configMap: name: database-connector-config - name: secrets secret: secretName: database-connector-secrets
Enregistrez la configuration du Pod sous forme de fichier YAML, par exemple,
database-connector.yaml
, et passez à l’étape suivante :kubectl apply -f database-connector.yaml
Surveiller l’agent¶
Le conteneur de l’agent génère des journaux vers stdout
, accessibles via Docker. Par exemple, si le nom de votre conteneur est database-connector-agent
, la commande pour afficher les journaux sera :
docker container logs database-connector-agent
Ces journaux sont également diffusés dans Snowflake. Voir Surveillance du Snowflake Connector for PostgreSQL pour obtenir des informations sur la façon d’y accéder.
Accès au point de terminaison de contrôle d’intégrité¶
L’agent expose un point de terminaison HTTP contenant des informations d’intégrité. Vous pouvez utiliser ce point de terminaison lors de l’exécution de l’agent dans un système d’orchestration pour déterminer à quel moment l’agent est entièrement lancé et s’il est intègre. Le point de terminaison est disponible sous le port 8080
et le chemin d’accès /actuator/health
.
Pour utiliser le point de terminaison comme probe liveness (sonde de vivacité) dans Kubernetes, ajoutez les éléments suivants à la configuration de votre Pod :
apiVersion: v1
kind: Pod
spec:
containers:
- ...
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
Prochaines étapes¶
Après avoir effectué ces procédures, suivez les étapes : Configuration de la réplication pour Snowflake Connector for PostgreSQL.