Snowflake DevOps

Vous pouvez combiner les outils Snowflake avec vos outils existants pour créer des processus DevOps afin de gérer le code et les données de manière sûre et efficace.

Qu’est-ce que Snowflake DevOps ?

Snowflake propose une approche intégrée pour accélérer les cycles de développement et améliorer la productivité globale des équipes chargées des données. Cette approche intègre le contrôle de version Git, des APIsPython, la gestion déclarative des objets et l’automatisation transparente CI/CD.

Référentiel Git pour toutes vos sources

En centralisant la gestion et le contrôle des versions de vos données, de votre code et de vos configurations, vous pouvez garantir la cohérence, simplifier la collaboration et rationaliser les restaurations si nécessaire.

L’utilisation de votre référentiel Git à partir de Snowflake vous permet de faire tout cela dans le périmètre sécurisé de Snowflake, ce qui est crucial pour les environnements prêts pour la production.

Syntaxe de la déclaration

En adoptant une approche déclarative de la gestion des modifications de la base de données — en définissant et en gérant les objets de Snowflake à l’aide de Python ou de SQL — vous éliminez le besoin de scripts complexes tout en favorisant la lisibilité.

Automatisation CI/CD

Vous pouvez l’intégrer à vos outils CI/CD existants ou à Snowflake CLI pour exécuter automatiquement des commandes et orchestrer l’ensemble de votre pipeline pour des déploiements efficaces et fiables.

Quels sont les éléments constitutifs de Snowflake DevOps ?

Snowflake offre plusieurs fonctions qui s’intègrent pour rendre les tâches de DevOps plus simples et plus sûres.

CREATE OR ALTER pour les tables ou les tâches.

Vous pouvez utiliser la commande CREATE OR ALTER pour appliquer des mises à jour de cohérence à l’ensemble des objets de la base de données, ce qui simplifie la gestion des modifications de la base.

Pour plus d’informations, voir Gérer les changements avec du code déclaratif et des versions.

EXECUTE IMMEDIATE FROM

Avec la commande EXECUTE IMMEDIATE FROM de Snowflake, vous pouvez exécuter du code SQL et Python à partir d’un référentiel Git dans Snowflake.

Pour plus d’informations, voir Paramétrer des scripts avec des modèles Jinja.

Snowflake CLI

Dans les scripts pour piloter votre pipeline CI/CD, vous pouvez exécuter des commandes Snowflake CLI pour automatiser les déploiements, collaborer avec le contrôle de version et intégrer d’autres outils de CI/CD.

Pour plus d’informations, voir Automatiser les tâches CI/CD avec GitHub Actions.

APIs Python

À l’aide des APIs Python de Snowflake, vous pouvez gérer les ressources de Snowflake, notamment les bases de données, les schémas, les tables et les tâches.

Pour plus d’informations, voir Orchestrer l’exécution du code Snowflake avec des tâches Snowflake.

Git dans Snowflake

Vous pouvez récupérer la configuration du projet et les pipelines de données (schéma, tables, scripts) à partir d’un référentiel Git pour déclencher le workflow de déploiement.

Pour plus d’informations, voir Rationaliser les workflows en conservant les actifs dans un référentiel Git connecté à Snowflake.

Utilisation des fonctions de Snowflake dans les workflows DevOps

En utilisant Snowflake avec vos outils existants, vous pouvez atteindre les objectifs DevOps suivants :

  • Rationalisez les workflows en conservant les actifs dans un référentiel Git connecté à Snowflake.

    Vous pouvez tirer parti de votre investissement Git existant en connectant le référentiel à votre compte Snowflake. Une fois cette connexion établie, avec le référentiel cloné localement dans Snowflake lui-même, vous pouvez parcourir et exécuter son code directement dans Snowflake.

  • Réduisez les risques en maintenant des environnements distincts pour le développement, les tests et la production.

    En utilisant des bases de données Snowflake distinctes pour chaque environnement, vous pouvez atténuer le risque que des changements non désirés affectent les systèmes en production. Pour gérer plus facilement les déploiements, vous utilisez des scripts qui paramètrent le processus de déploiement.

  • Gérez les modifications de la base de données de manière contrôlée et reproductible pour le développement, les tests et la production en utilisant des scripts et du code déclaratif.

  • Automatisez les tâches CI/CD, y compris le déploiement du code et des données, en utilisant des actions GitHub.

  • Orchestrez l’exécution du code de Snowflake en utilisant les tâches de Snowflake.

Note

Avec Snowflake Extension for Visual Studio Code, vous pouvez écrire et exécuter les instructions SQL de Snowflake directement dans VS Code. En connectant VS Code avec le même référentiel que vous avez connecté à Snowflake, vous pouvez développer du code localement dans VS Code, conserver votre travail dans votre référentiel Git, puis accéder à votre code depuis Snowflake.

Rationaliser les workflows en conservant les actifs dans un référentiel Git connecté à Snowflake

Vous pouvez garantir la cohérence, simplifier la collaboration et rationaliser les restaurations si nécessaire en gérant vos données, votre code et vos configurations de manière centralisée et en contrôlant les versions dans un référentiel Git et en utilisant le référentiel de Snowflake.

Vous pouvez connecter votre compte Snowflake à votre référentiel Git afin que Snowflake puisse exécuter du code dans les fichiers clonés depuis le référentiel. Le résultat est une zone de préparation du référentiel Git qui représente un clone complet de votre référentiel. Depuis Snowflake, vous pouvez accéder aux fichiers contrôlés par version à une certaine validation, une certaine branche ou une certaine balise.

Par exemple, avec les fichiers de référentiels clonés dans Snowflake, vous pouvez utiliser la commande EXECUTE IMMEDIATE FROM pour exécuter du code dans un fichier cloné. De cette manière, vous pouvez créer de manière déclarative des objets de base de données avec SQL et ensuite exécuter ce SQL à partir d’un autre code, tel qu’une action GitHub.

Diagramme affichant un référentiel Git échangeant des fichiers avec des outils de développement et Snowflake.

Maintenir des environnements distincts pour le développement, les tests et la production

En conservant des environnements distincts pour le développement, les tests et la production, vos équipes peuvent isoler les activités de développement de l’environnement de production, ce qui réduit la probabilité de conséquences involontaires et de corruption des données.

Lorsque vous séparez les workflows en plusieurs environnements, chacun reçoit sa propre base de données Snowflake - généralement une copie identique.

Paramétrer des scripts avec des modèles Jinja

Pour faciliter le déploiement et l’exécution du code de manière essentiellement identique entre les environnements de développement et de production, vous pouvez paramétrer les références aux spécificités de l’environnement - par exemple, la base de données à utiliser pendant le déploiement. Ainsi, vous pouvez activer un pipeline CI/CD pour choisir la cible de déploiement appropriée à l’environnement.

Pour paramétrer les scripts, vous pouvez utiliser Jinja, un langage de modélisation populaire dont les fonctions vont du simple paramétrage de scripts à la création de scripts étendus dans un langage similaire à Python. Snowflake prend en charge l’exécution de scripts SQL modélisés avec EXECUTE IMMEDIATE FROM.

Pour modifier une cible de déploiement, par exemple, vous utiliserez le remplacement de variables avec Jinja. Dans les scripts SQL, vous indiquez une variable Jinja avec {{...}}. Vous pouvez fournir une valeur pour une variable dans la clause USING de EXECUTE IMMEDIATE FROM.

La ligne suivante de SQL utilise une variable Jinja {{environment}} comme espace réservé pour une partie du nom de la base de données qui différencie cette base de données d’autres dont les noms sont similaires :

CREATE IF NOT EXISTS DATABASE MYDB_{{environment}};
Copy

Par exemple, vous pouvez utiliser la commande CREATE DATABASE à partir de jobs. <job_id>.steps[*].run dans une action Github.

run:
  snow sql -q "EXECUTE IMMEDIATE FROM @myco_common.public.my_repo/branches/main/deploy_parameterized_pipeline.sql USING (environment => 'prod', retention_time => 1)" \
Copy

Le code de cet extrait de fichier de workflow GitHub Action comprend les commandes suivantes :

  • run exécute la commande snow sql de l’application Snowflake CLI.

  • snow sql exécute le contenu du fichier deploy_parameterized_pipeline.sql de la branche main du référentiel GitHub cloné dans la zone de préparation du référentiel Git repository myco_common.public.my_repo dans Snowflake.

    deploy_parameterized_pipeline.sql contient la commande CREATE DATABASE.

Avec Snowflake CLI, vous pouvez créer, gérer, mettre à jour et voir les apps s’exécutant sur Snowflake à travers les charges de travail.

Gérer les changements avec du code déclaratif et des versions

Vous pouvez gérer plus facilement les modifications apportées aux ressources de votre base de données grâce à des fichiers de configuration réutilisables dans votre référentiel Git.

Vous pouvez définir les objets de la base de données à l’aide de la commande CREATE OR ALTER, qui crée l’objet ou le modifie pour qu’il corresponde à la définition spécifiée par la commande. En utilisant cette commande à partir d’un fichier versionné dans un référentiel, vous pouvez plus facilement revenir à une version antérieure : il vous suffit d’exécuter une version précédente du fichier.

CREATE OR ALTER TABLE vacation_spots (
  city VARCHAR,
  airport VARCHAR,
  avg_temperature_air_f FLOAT,
  avg_relative_humidity_pct FLOAT,
  avg_cloud_cover_pct FLOAT,
  precipitation_probability_pct FLOAT
) data_retention_time_in_days = 1;
Copy

Note

Vous pouvez également utiliser l’APIs Snowflake Python et Snowflake CLI pour gérer les ressources de Snowflake.

Automatiser les tâches CI/CD avec GitHub Actions

Comme indiqué brièvement dans Paramétrer des scripts avec des modèles Jinja, vous pouvez utiliser GitHub Actions pour automatiser les tâches qui constituent un pipeline CI/CD. Avec GitHub Actions, vous pouvez définir des workflows qui automatisent les tâches de création de version, de test et de déploiement.

Dans ces workflows, vous pouvez utiliser d’autres fonctions de Snowflake et de GitHub pour assembler les pièces du puzzle. Vous pouvez exécuter ces tâches :

  • Stockez vos identifiants de connexion Snowflake dans un GitHub secret afin que GitHub Actions puisse se connecter à Snowflake.

  • Exécutez des commandes dans Snowflake en utilisant la CLI de Snowflake.

  • Utilisez la CLI de Snowflake pour exécuter du code contenu dans des fichiers récupérés dans un référentiel Git connecté et conservés par Snowflake.

L’extrait du workflow GitHub Actions dans l’exemple suivant déploie un pipeline. Le workflow s’authentifie auprès de Snowflake en récupérant les valeurs nécessaires à partir des secrets précédemment configurés.

Pour déployer le pipeline, le workflow exécute les deux commandes SQL suivantes avec la commande snow sql :

  • ALTER GIT REPOSITORY récupère la dernière version du référentiel GitHub cloné dans la zone de préparation du référentiel repository myco_common.public.my_repo Git dans Snowflake.

  • EXECUTE IMMEDIATE FROM exécute le code du fichier deploy_parameterized_pipeline.sql de la branche main du référentiel.

name: Deploy data pipeline to prod

# Controls when the action will run.
on:
  push:
    branches:
      - main

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Python 3.10
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'

      - name: Install Python packages
        run: pip install -r requirements.txt

      - name: Deploy data pipeline
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
          SNOWFLAKE_USER: ${{ secrets.SNOWFLAKE_USER }}
          SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
          SNOWFLAKE_ROLE: ${{ secrets.SNOWFLAKE_ROLE }}
          SNOWFLAKE_WAREHOUSE: ${{ secrets.SNOWFLAKE_WAREHOUSE}}
        run: |
          snow sql -q "ALTER GIT REPOSITORY quickstart_common.public.quickstart_repo FETCH" --temporary-connection --account $SNOWFLAKE_ACCOUNT --user $SNOWFLAKE_USER --role $SNOWFLAKE_ROLE --warehouse $SNOWFLAKE_WAREHOUSE
          snow sql -q "EXECUTE IMMEDIATE FROM @quickstart_common.public.quickstart_repo/branches/main/deploy_parameterized_pipeline.sql USING (environment => 'prod', retention_time => 1)" --temporary-connection --account $SNOWFLAKE_ACCOUNT --user $SNOWFLAKE_USER --role $SNOWFLAKE_ROLE --warehouse $SNOWFLAKE_WAREHOUSE
Copy

Orchestrer l’exécution du code Snowflake avec des tâches Snowflake

Vous pouvez créer des tâches pour orchestrer l’exécution des instructions SQL dans Snowflake. Les tâches peuvent être exécutées selon une planification, faire l’objet d’une nouvelle tentative, être suspendues en cas d’échec et être exécutées après que d’autres tâches spécifiques ont été achevées.

Avec une tâche, vous pouvez joindre des vues, envoyer des notifications par e-mail, transmettre des données à d’autres parties de votre application, etc.

Après avoir créé une tâche qui coordonne ces instructions SQL, vous pouvez exécuter la tâche en une seule fois. Comme indiqué ailleurs dans cette rubrique, vous pouvez par exemple exécuter une tâche en incluant EXECUTE TASK dans un fichier de référentiel que vous exécutez avec EXECUTE IMMEDIATE FROM.

Vous pouvez surveiller les tâches, y compris l’historique de leur exécution, en utilisant SQL ou Snowsight.

La tâche de l’exemple suivant effectue une sélection dans une table vacation_spots. Ensuite, en fonction du résultat, la tâche appelle SYSTEM$SEND_EMAIL pour envoyer une notification par e-mail.

CREATE OR ALTER TASK email_notification
  WAREHOUSE = 'quickstart_wh'
  AFTER vacation_spots_update
  AS
    BEGIN
      LET OPTIONS VARCHAR := (
        SELECT TO_VARCHAR(ARRAY_AGG(OBJECT_CONSTRUCT(*)))
        FROM vacation_spots
        WHERE TRUE
          AND punctual_pct >= 50
          AND avg_temperature_air_f >= 70
          -- STEP 5: INSERT CHANGES HERE
        LIMIT 10);


      IF (:OPTIONS = '[]') THEN
        CALL SYSTEM$SEND_EMAIL(
            'email_integration',
            '<insert your email here>', -- INSERT YOUR EMAIL HERE
            'New data successfully processed: No suitable vacation spots found.',
            'The query did not return any results. Consider adjusting your filters.');
      END IF;

      LET QUERY VARCHAR := 'Considering the data provided below in JSON format, pick the best city for a family vacation in summer?
      Explain your choice, offer a short description of the location and provide tips on what to pack for the vacation considering the weather conditions?
      Finally, could you provide a detailed plan of daily activities for a one week long vacation covering the highlights of the chosen destination?\n\n';

      LET RESPONSE VARCHAR := (SELECT SNOWFLAKE.CORTEX.COMPLETE('mistral-7b', :query || :options));

      CALL SYSTEM$SEND_EMAIL(
        'email_integration',
        '<insert your email here>', -- INSERT YOUR EMAIL HERE
        'New data successfully processed: The perfect place for your summer vacation has been found.',
        :response);
    EXCEPTION
        WHEN EXPRESSION_ERROR THEN
            CALL SYSTEM$SEND_EMAIL(
            'email_integration',
            '<insert your email here>', -- INSERT YOUR EMAIL HERE
            'New data successfully processed: Cortex LLM function inaccessible.',
            'It appears that the Cortex LLM functions are not available in your region');
    END;
Copy

Pour une démonstration interactive de l’utilisation de Snowflake DevOps, consultez le quickstart Premiers pas avec Snowflake DevOps.