Snowflake DevOps

Snowflakeツールと既存のツールを組み合わせて、コードとデータを安全かつ効率的に管理する DevOps プロセスを構築できます。

Snowflakeの DevOps とは?

Snowflakeは、開発ライフサイクルを加速し、データチームの全体的な生産性を向上させる統合アプローチを提供します。このアプローチは、Gitバージョン管理、Python APIs、宣言型オブジェクト管理、シームレスな CI/CD 自動化を統合しています。

すべてのソースのGitリポジトリ

データ資産、コード、構成を一元的に管理し、バージョン管理することで、一貫性を確保し、コラボレーションを簡素化し、必要に応じてロールバックを効率化できます。

SnowflakeのGitリポジトリを使用すると、これらすべてをSnowflakeの安全な境界内で実行できます。これは、本番環境対応の環境にとって非常に重要です。

宣言構文

データベース変更管理に宣言型アプローチを採用することで(Pythonまたは SQL を使用してSnowflakeオブジェクトを定義および管理する)、複雑なスクリプトの必要性がなくなり、読みやすさが向上します。

CI/CD の自動化

既存の CI/CD ツールまたはSnowflake CLI と統合して、コマンドを自動的に実行し、パイプライン全体をオーケストレーションして、効率的で信頼性の高いデプロイメントを実現できます。

Snowflakeを使用した DevOps の構成要素とは?

Snowflakeは、 DevOps タスクをよりシンプルかつ安全にするために統合されたいくつかの機能を提供します。

テーブルまたはタスクの CREATE OR ALTER。

CREATE OR ALTER コマンドを使用すると、データベースオブジェクト全体の一貫性を保つために更新を適用し、データベースの変更管理を簡素化できます。

詳細については、 宣言型コードとバージョン管理による変更の管理 をご参照ください。

EXECUTE IMMEDIATE FROM

EXECUTE IMMEDIATE FROM Snowflakeコマンドを使用すると、SnowflakeでGitリポジトリから SQL とPythonコードを実行できます。

詳細については、 Jinjaテンプレートを使用してスクリプトをパラメーター化する をご参照ください。

Snowflake CLI

CI/CD パイプラインを駆動するスクリプトでは、Snowflake CLI コマンドを実行して、デプロイメンを自動化し、バージョン管理と連携して、他の CI/CD ツールと統合できます。

詳細については、 GitHub アクションを使用して CI/CD ジョブを自動化する をご参照ください。

Python APIs

SnowflakeのPython APIs を使用すると、データベース、スキーマ、テーブル、タスクなどのSnowflakeリソースを管理できます。

詳細については、 Snowflakeタスクを使用してSnowflakeコード実行をオーケストレーションする をご参照ください。

SnowflakeのGit

Gitリポジトリからプロジェクト構成とデータパイプライン(スキーマ、テーブル、スクリプト)を取得して、デプロイメントワークフローをトリガーできます。

詳細については、 Snowflakeに接続されたGitリポジトリにアセットを保存することで、ワークフローを合理化する をご参照ください。

DevOps ワークフローでのSnowflake機能の使用

Snowflakeを既存のツールと共に使用することで、次のような DevOps 目標を達成できます。

  • Snowflakeに接続されたGitリポジトリにアセットを保存することで、 ワークフローを合理化 します。

    リポジトリをSnowflakeアカウントに接続することで、既存のGit投資を活用できます。この接続が確立されると、リポジトリがSnowflake自体のローカルにクローンされ、Snowflakeで直接コードを参照して実行できるようになります。

  • 開発、テスト、本番環境で 別々の環境を維持する ことでリスクを最小限に抑えます。

    環境ごとに個別のSnowflakeデータベースを使用することで、不要な変更が稼動中のシステムに影響を与えるリスクを最小限に抑えることができます。デプロイメントをより簡単に管理するには、デプロイメントプロセスをパラメーター化するスクリプトを使用します。

  • スクリプトと宣言型コードを使用して、開発、テスト、実運用において、管理された再現可能な方法で データベースの変更を管理する

  • GitHub アクションを使用して、コードとデータのデプロイメントを含む CI/CD ジョブを自動化する

  • Snowflakeタスクを使用して Snowflakeコード実行をオーケストレーションする

注釈

Snowflake Extension for Visual Studio Code を使用すると、 VS コード内で直接Snowflake SQL ステートメントを記述して実行できます。VS コードを Snowflakeに接続 した同じリポジトリに接続することで、 VS コードでローカルにコードを開発し、作業をGitリポジトリに保存して、Snowflake内からコードにアクセスできるようになります。

Snowflakeに接続されたGitリポジトリにアセットを保存することで、ワークフローを合理化する

データ資産、コード、構成をGitリポジトリで集中管理およびバージョン管理し、Snowflakeのリポジトリを使用することで、一貫性を確保し、コラボレーションを簡素化し、必要に応じてロールバックを効率化できます。

SnowflakeアカウントをGitリポジトリに接続すると、Snowflakeはリポジトリからクローンされたファイル内のコードを実行できるようになります。結果は、リポジトリの完全なクローンを表すGitリポジトリステージになります。Snowflake内から、特定のコミット、ブランチ、タグでバージョン管理されたファイルにアクセスできます。

たとえば、Snowflakeでクローン化されたリポジトリファイルでは、 EXECUTE IMMEDIATE FROM コマンドを使用して、クローン化されたファイル内のコードを実行できます。この方法では、 SQL を使用してデータベースオブジェクトを宣言的に作成し、その SQL を GitHub アクションなどの他のコードから実行できます。

開発ツールおよびSnowflakeとファイルを交換するGitリポジトリを示す図。

開発、テスト、本番用に別々の環境を維持する

開発、テスト、本番用に別々の環境を維持することで、チームは開発アクティビティを本番環境から分離し、意図しない結果やデータ破損の可能性を減らすことができます。

ワークフローを複数の環境に分割すると、それぞれに独自のSnowflakeデータベース(通常は同一のコピー)が取得されます。

Jinjaテンプレートを使用してスクリプトをパラメーター化する

開発環境と運用環境の間で本質的に同じ方法でコードのデプロイと実行をサポートするには、デプロイ中に使用するデータベースなど、環境の詳細への参照をパラメーター化できます。これにより、 CI/CD パイプラインを有効にして、環境に適したデプロイメントターゲットを選択できるようになります。

スクリプトをパラメーター化するには、単純なスクリプトのパラメーター化からPythonに似た言語での広範なスクリプト作成までさまざまな機能を備えた人気のテンプレート言語である、Jinjaを使用できます。Snowflakeは、 EXECUTE IMMEDIATE FROM でテンプレート化された SQL スクリプトの実行をサポートしています。

たとえば、デプロイメントターゲットを変更するには、Jinjaで変数置換を使用します。SQL スクリプトでは、Jinja変数を {{...}} で指定します。EXECUTE IMMEDIATE FROM の USING 句で変数の値を指定できます。

次の SQL の行では、データベース名の一部のプレースホルダーとしてJinja変数 {{environment}} を使用し、このデータベースを名前が似ている他のデータベースと区別します。

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

たとえば、Githubアクションの jobs. <job_id>.steps[*].run から CREATE DATABASE コマンドを使用できます。

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

この GitHub アクションワークフローファイルの抜粋のコードには、次のコマンドが含まれています。

  • run は、 Snowflake CLIsnow sql コマンドを実行します。

  • snow sql は、Snowflakeの repository myco_common.public.my_repo Gitリポジトリステージにクローンされた GitHub リポジトリの main ブランチから deploy_parameterized_pipeline.sql ファイルの内容を実行します。

    deploy_parameterized_pipeline.sql には、 CREATE DATABASE コマンドが含まれています。

Snowflake CLI を使用すると、ワークロード全体で、Snowflake上で実行中のアプリを作成、管理、更新、表示できます。

宣言型コードとバージョン管理による変更の管理

Gitリポジトリ内の再利用可能な構成ファイルを使用すると、データベースリソースへの変更をより簡単に管理できます。

CREATE OR ALTER コマンドを使用してデータベースオブジェクトを定義できます。このコマンドは、オブジェクトを作成したり、コマンドで指定された定義と一致するようにオブジェクトを変更したりします。リポジトリ内のバージョン管理されたファイルからこのコマンドを使用すると、以前のバージョンへの変更をより簡単にロールバックできます。単にファイルの以前のバージョンを実行するだけです。

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

注釈

Snowflake Python APIs および Snowflake CLI を使用して、Snowflakeリソースを管理することもできます。

GitHub アクションを使用して CI/CD ジョブを自動化する

Jinjaテンプレートを使用してスクリプトをパラメーター化する で簡単に説明したように、 GitHub アクション を使用して、 CI/CD パイプラインを構成するジョブを自動化できます。GitHub アクションを使用すると、構築、テスト、タスクのデプロイを自動化するワークフローを定義できます。

これらのワークフローでは、Snowflakeと GitHub の他の機能を使用して、各部分をまとめることができます。次のタスクを実行できます。

  • Snowflakeの認証情報を GitHub シークレット に保存し、 GitHub アクションがSnowflakeに接続できるようにします。

  • Snowflake CLI を使用して、Snowflakeでコマンドを実行します。

  • Snowflake CLI を使用して、接続されたGitリポジトリから取得され、Snowflakeによって保持されているファイルに含まれるコードを実行します。

次の例の GitHub アクションワークフローの抜粋では、パイプラインをデプロイします。ワークフローは、以前に構成されたシークレットから必要な値を取得して、Snowflakeで認証します。

パイプラインをデプロイするために、ワークフローは snow sql コマンドを使用して次の2つの SQL コマンドを実行します。

  • ALTER GIT REPOSITORY は、Snowflakeの GitHub Gitリポジトリステージにクローンされた repository myco_common.public.my_repo リポジトリから最新のものを取得します。

  • EXECUTE IMMEDIATE FROM は、リポジトリの main ブランチから deploy_parameterized_pipeline.sql ファイル内のコードを実行します。

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

Snowflakeタスクを使用してSnowflakeコード実行をオーケストレーションする

Snowflake タスク を作成し、Snowflakeの SQL ステートメントの実行をオーケストレーションできます。タスクには、スケジュールでの実行、再試行、失敗後の中断、他の特定のタスクが完了した後の実行などの機能があります。

タスクを使用すると、ビューの結合、メール通知の送信、アプリケーションの他の部分へのデータフィードなどを実行できます。

これらの SQL ステートメントを調整するタスクを作成した後、1回の実行でそのタスクを実行できます。このトピックの他の箇所で述べたように、たとえば、 EXECUTE IMMEDIATE FROM で実行するリポジトリファイルに EXECUTE TASK を含めることでタスクを実行できます。

SQL または Snowsight を使用して、タスクの実行履歴を含むタスクを監視できます。

次の例のタスクは、 vacation_spots テーブルから選択します。そして、その結果に基づいて、タスクは SYSTEM$SEND_EMAIL を呼び出し、メール通知を送信します。

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

Snowflake DevOps の使用に関するインタラクティブなウォークスルーについては、 Snowflake入門 DevOps クイックスタートをご参照ください。