Snowflake DevOps

Sie können Snowflake-Tools mit Ihren vorhandenen Tools kombinieren, um DevOps-Prozesse zur sicheren und effizienten Verwaltung von Code und Daten zu erstellen.

Was ist Snowflake DevOps?

Snowflake bietet einen integrierten Ansatz zur Beschleunigung von Entwicklungszyklen und zur Verbesserung der Gesamtproduktivität von Datenteams. Dieser Ansatz führt die Git-Versionskontrolle, Python-APIs, die deklarative Objektverwaltung und die nahtlose CI/CD-Automatisierung zusammen.

Git-Repository für alle Ihre Quellen

Indem Sie Ihre Datenbestände, Ihren Code und Ihre Konfigurationen zentral verwalten und Versionen zentral kontrollieren, können Sie Konsistenz sicherstellen, die Zusammenarbeit vereinfachen und Rollbacks bei Bedarf rationalisieren.

Wenn Sie Ihr Git-Repository über Snowflake verwenden, können Sie all dies innerhalb des sicheren Bereichs von Snowflake tun, was für produktionsbereite Umgebungen entscheidend ist.

Deklarative Syntax

Durch einen deklarativen Ansatz für das Änderungsmanagement von Datenbankänderungen – Definieren und Verwalten von Snowflake-Objekten mit Python oder SQL – können Sie auf komplexe Skripte verzichten und gleichzeitig die Lesbarkeit verbessern.

CI/CD-Automatisierung

Sie können Ihre bestehenden CI/CD-Tools oder Snowflake CLI integrieren, um Befehle automatisch auszuführen und Ihre gesamte Pipeline für effiziente und zuverlässige Bereitstellungen zu orchestrieren.

Was sind die Bausteine von Snowflake DevOps?

Snowflake bietet mehrere integrierte Features, die DevOps einfacher und sicherer machen.

CREATE OR ALTER für Tabellen oder Aufgaben.

Sie können den Befehl CREATE OR ALTER verwenden, um Aktualisierungen für die Konsistenz von Datenbankobjekten vorzunehmen, was das Änderungsmanagement von Datenbankänderungen vereinfacht.

Weitere Informationen dazu finden Sie unter Änderungen mit deklarativem Code und Versionierung verwalten.

EXECUTE IMMEDIATE FROM

Mit dem Befehl EXECUTE IMMEDIATE FROM Snowflake können Sie SQL- und Python-Code aus einem Git-Repository in Snowflake ausführen.

Weitere Informationen dazu finden Sie unter Skripte mit Jinja-Vorlagen parametrisieren.

Snowflake CLI

In Skripten zur Steuerung Ihrer CI/CD-Pipeline können Sie Snowflake CLI-Befehle ausführen, um Bereitstellungen zu automatisieren, mit der Versionskontrolle zusammenzuarbeiten und andere CI/CD-Tools zu integrieren.

Weitere Informationen dazu finden Sie unter CI/CD-Jobs mit GitHub Actions automatisieren.

Python-APIs

Mit den Snowflake-Python-APIs können Sie Snowflake-Ressourcen, einschließlich Datenbanken, Schemas, Tabellen und Aufgaben, verwalten.

Weitere Informationen dazu finden Sie unter Ausführung von Snowflake-Code mit Snowflake-Aufgaben orchestrieren.

Git in Snowflake

Sie können die Projektkonfiguration und Datenpipelines (Schema, Tabellen, Skripte) aus einem Git Repo abrufen, um den Bereitstellungsworkflow zu triggern.

Weitere Informationen dazu finden Sie unter Workflows durch Aufbewahren der Assets in einem mit Snowflake verbundenen Git-Repository optimieren.

Verwenden von Snowflake-Features in DevOps-Workflows

Wenn Sie Snowflake mit Ihren vorhandenen Tools verwenden, können Sie die folgenden DevOps-Ziele erreichen:

  • Optimieren von Workflows, indem Assets in einem mit Snowflake verbundenen Git-Repository aufbewahrt werden.

    Sie können die Vorteile Ihrer bestehenden Git-Investitionen nutzen, indem Sie das Repository mit Ihrem Snowflake-Konto verbinden. Sobald diese Verbindung hergestellt ist und das Repository lokal in Snowflake selbst geklont wurde, können Sie den Code direkt in Snowflake durchsuchen und ausführen.

  • Minimieren von Risiken, indem getrennte Umgebungen für Entwicklung, Test und Produktion unterhalten werden.

    Durch die Verwendung separater Snowflake-Datenbanken für jede Umgebung minimieren Sie das Risiko, dass sich unerwünschte Änderungen auf Live-Systeme auswirken. Um Bereitstellungen einfacher zu verwalten, verwenden Sie Skripte, die den Bereitstellungsprozess parametrisieren.

  • Verwalten von Datenbankänderungen auf kontrollierte und wiederholbare Weise für Entwicklung, Test und Produktion durch Verwendung von Skripten und deklarativem Code.

  • Automatisieren von CI/CD-Jobs, einschließlich der Bereitstellung von Code und Daten unter Verwendung von GitHub Actions.

  • Orchestrieren der Ausführung von Snowflake-Code mithilfe von Snowflake-Aufgaben (Tasks).

Bemerkung

Mit Snowflake Extension for Visual Studio Code können Sie Snowflake SQL-Anweisungen direkt in VS-Code schreiben und ausführen. Indem Sie VS-Code mit demselben extern verbinden, das Sie mit Snowflake verbunden haben, können Sie Code lokal in VS-Code entwickeln, Ihre Arbeit in Ihrem Git-Repository aufbewahren und dann von Snowflake aus auf Ihren Code zugreifen.

Workflows durch Aufbewahren der Assets in einem mit Snowflake verbundenen Git-Repository optimieren

Sie können Konsistenz sicherstellen, die Zusammenarbeit vereinfachen und bei Bedarf Rollbacks durchführen, indem Sie Ihre Datenassets, Ihren Code und Ihre Konfigurationen zentral in einem Git-Repository verwalten und Versionen zentral kontrollieren und dann das Repository über Snowflake verwenden.

Sie können Ihr Snowflake-Konto mit Ihrem Git-Repository verbinden, damit Snowflake den Code ausführen kann, der sich in den aus dem Repository geklonten Dateien befindet. Das Ergebnis ist ein Git-Repository-Stagingbereich, der einen vollständigen Klon Ihres Repositorys darstellt. Von Snowflake aus können Sie auf versionskontrollierte Dateien in einem bestimmten Commit, Branch oder Tag zugreifen.

Bei geklonten Repository-Dateien in Snowflake können Sie zum Beispiel den Befehl EXECUTE IMMEDIATE FROM verwenden, um den Code in einer geklonten Datei auszuführen. Auf diese Weise können Sie Datenbankobjekte deklarativ mit SQL erstellen und diesen SQL-Code dann von einem anderen Code aus ausführen, z. B. einer GitHub Action.

Abbildung eines Git-Repositorys, das Dateien mit Entwicklungstools und Snowflake austauscht.

Separate Umgebungen für Entwicklung, Test und Produktion verwalten

Durch die Beibehaltung getrennter Umgebungen für Entwicklung, Test und Produktion können Ihre Teams die Entwicklungsaktivitäten von der Produktionsumgebung isolieren und so die Wahrscheinlichkeit unbeabsichtigter Folgen und Datenbeschädigungen verringern.

Wenn Sie Workflows in mehrere Umgebungen aufteilen, erhält jede ihre eigene Snowflake-Datenbank – in der Regel eine identische Kopie.

Skripte mit Jinja-Vorlagen parametrisieren

Um die Bereitstellung und Ausführung von Code in Entwicklungs- und Produktionsumgebungen auf im Wesentlichen identische Weise zu unterstützen, können Sie Verweise auf Umgebungsspezifika parametrisieren – z. B. welche Datenbank während der Bereitstellung verwendet werden soll. Auf diese Weise können Sie eine CI/CD-Pipeline aktivieren, um das für die Umgebung geeignete Bereitstellungsziel zu wählen.

Zur Parametrisierung von Skripten können Sie Jinja verwenden, eine beliebte Templating-Sprache mit Features, die von einfacher Skriptparametrisierung bis hin zu umfangreichem Scripting in einer Python-ähnlichen Sprache reichen. Snowflake unterstützt die Ausführung von SQL-Skriptvorlagen mit EXECUTE IMMEDIATE FROM.

Wenn Sie beispielsweise ein Bereitstellungsziel ändern möchten, können Sie die Variablenersetzung in Jinja verwenden. In SQL-Skripten geben Sie eine Jinja-Variable mit {{...}} an. Sie können einen Wert für eine Variable in der USING-Klausel von EXECUTE IMMEDIATE FROM angeben.

Die folgende Zeile in SQL verwendet eine Jinja-Variable {{environment}} als Platzhalter für einen Teil des Datenbanknamens, der diese Datenbank von anderen mit ähnlichem Namen unterscheidet:

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

Sie könnten zum Beispiel den Befehl CREATE DATABASE über jobs. <job_id>.steps[*].run in einer Github Action verwenden.

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

Der Code in diesem Auszug aus dieser GitHub Action-Workflow-Datei enthält die folgenden Befehle:

  • run führt den Befehl snow sql der Snowflake CLI aus.

  • snow sql führt den Inhalt der Datei deploy_parameterized_pipeline.sql aus dem Zweig main des GitHub-Repositorys aus, das in den Stagingbereich des Git-Repositorys repository myco_common.public.my_repo in Snowflake geklont wurde.

    deploy_parameterized_pipeline.sql enthält den CREATE DATABASE-Befehl.

Mit Snowflake CLI können Sie in Snowflake ausgeführte Apps über alle Workloads hinweg erstellen, verwalten, aktualisieren und anzeigen.

Änderungen mit deklarativem Code und Versionierung verwalten

Sie können Änderungen an Ihren Datenbankressourcen mithilfe von wiederverwendbaren Konfigurationsdateien in Ihrem Git-Repository einfacher verwalten.

Sie können Datenbankobjekte mit dem CREATE OR ALTER-Befehl definieren, der das Objekt erstellt oder es so verändert, dass es mit der vom Befehl angegebenen Definition übereinstimmt. Wenn Sie diesen Befehl von einer versionierten Datei in einem Repository aus verwenden, können Sie Änderungen einfacher auf eine frühere Version zurücksetzen: Sie führen einfach eine frühere Version der Datei aus.

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

Bemerkung

Sie können zum Verwalten von Snowflake-Ressourcen auch die Snowflake-Python-APIs oder Snowflake CLI verwenden.

CI/CD-Jobs mit GitHub Actions automatisieren

Wie unter Skripte mit Jinja-Vorlagen parametrisieren kurz beschrieben, können Sie GitHub Actions verwenden, um die Jobs zu automatisieren, die eine CI/CD-Pipeline einrichten. Mit GitHub Actions können Sie Workflows definieren, mit denen Erstellungs-, Test- und Bereitstellungsaufgaben automatisiert werden.

In diesen Workflows können Sie andere Features von Snowflake und GitHub nutzen, um die Teile zusammenzufügen. Alternativ können Sie auch Folgendes tun:

  • Speichern Ihrer Snowflake-Anmeldeinformationen in einem GitHub-Geheimnis, sodass GitHub Actions eine Verbindung zu Snowflake herstellen kann.

  • Ausführen von Befehlen in Snowflake durch Verwendung der Snowflake CLI.

  • Verwenden Sie Snowflake CLI, um Code auszuführen, der in Dateien enthalten ist, die von einem verbundenen Git-Repository abgerufen und von Snowflake verwaltet werden.

Bei dem GitHub Actions-Workflow-Auszug im folgenden Beispiel wird eine Pipeline bereitgestellt. Der Workflow authentifiziert sich bei Snowflake, indem er die benötigten Werte aus zuvor konfigurierten Geheimnissen abruft.

Um die Pipeline bereitzustellen, führt der Workflow die folgenden beiden SQL-Befehle mit dem Befehl snow sql aus:

  • ALTER GIT REPOSITORY ruft das Neueste aus dem GitHub-Repository ab, das in den Stagingbereich des Git-Repositorys repository myco_common.public.my_repo in Snowflake geklont wurde.

  • EXECUTE IMMEDIATE FROM führt den Code in der Datei deploy_parameterized_pipeline.sql aus dem Zweig main des Repositorys aus.

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

Ausführung von Snowflake-Code mit Snowflake-Aufgaben orchestrieren

Sie können Snowflake-Aufgaben erstellen, um die Ausführung von SQL-Anweisungen in Snowflake zu orchestrieren. Die Ausführung einer Aufgaben kann nach einem Zeitplan erfolgen, wiederholt versucht und nach Fehlern angehalten werden, und die Aufgabe kann ausgeführt werden, nachdem bestimmte andere Aufgaben abgeschlossen wurden.

Mit einer Aufgabe können Sie Ansichten verknüpfen, E-Mail-Benachrichtigungen senden, Daten an andere Teile Ihrer Anwendung weiterleiten usw.

Nachdem Sie eine Aufgabe erstellt haben, die diese SQL-Anweisungen koordiniert, können Sie die Aufgabe in einem einzigen Ausführungslauf ausführen. Wie an anderer Stelle unter diesem Thema erwähnt, können Sie beispielsweise eine Aufgabe ausführen, indem Sie EXECUTE TASK in eine Repository-Datei einfügen, die Sie mit EXECUTE IMMEDIATE FROM ausführen.

Sie können Aufgaben, einschließlich des Verlaufs der Aufgabenausführung, mit SQL oder Snowsight überwachen.

Die Aufgabe im folgenden Beispiel führt eine Auswahl aus einer Tabelle vacation_spots aus. Anhand des Ergebnisses ruft die Aufgabe dann SYSTEM$SEND_EMAIL auf, um eine E-Mail-Benachrichtigung zu senden.

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

Eine interaktive Anleitung zur Verwendung von Snowflake-DevOps finden Sie im Quickstart unter Erste Schritte mit Snowflake DevOps.