Snowflake DevOps¶
Snowflake DevOps は、開発者が Snowflake 環境のソフトウェア開発ライフサイクルを合理化および自動化できるようにします。CI/CD では、デプロイの自動化、インフラ管理のベストプラクティスに重点を置き、Snowflake DevOps のツールとプラクティスにより、開発タスクと運用タスクのスムーズな統合を実現します。
このガイドでは、Snowflakeの機能を活用して、Snowflakeプロジェクト全体でコラボレーションを強化し、品質を維持し、効率的なソフトウェアデリバリを実現するための洞察を提供します。
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 コマンドを使用して、Snowflake オブジェクトに更新を適用し、Git のコードとしてインフラストラクチャとアカウントの同期を保つことができます。 詳細については、 宣言型コードとバージョン管理による変更の管理 をご参照ください。 |
|
EXECUTE IMMEDIATE FROM Snowflakeコマンドを使えば、SnowflakeのGitリポジトリから SQL を実行できます。SQL スクリプトは Jinja2 テンプレートにすることができます。 詳細については、 Jinjaテンプレートを使用してスクリプトをパラメーター化する をご参照ください。 |
|
CI/CD パイプラインを駆動するスクリプトでは、Snowflake CLI コマンドを実行して、デプロイメンを自動化し、バージョン管理と連携して、他の CI/CD ツールと統合できます。 詳細については、 GitHub アクションを使用して CI/CD ジョブを自動化する をご参照ください。 |
|
SnowflakeのPython APIs を使用すると、データベース、スキーマ、テーブル、タスクなどのSnowflakeリソースを管理できます。 詳細については、 Snowflake Python APIs: PythonによるSnowflakeオブジェクトの管理 をご参照ください。 |
|
Gitリポジトリからプロジェクト構成とデータパイプライン(スキーマ、テーブル、スクリプト)を取得して、デプロイメントワークフローをトリガーできます。 詳細については、 Snowflakeに接続されたGitリポジトリにアセットを保存することで、ワークフローを合理化する をご参照ください。 |
DevOps ワークフローでのSnowflake機能の使用¶
Snowflakeを既存のツールと共に使用することで、次のような DevOps 目標を達成できます。
Snowflakeに接続されたGitリポジトリにアセットを保存することで、 ワークフローを合理化 します。
リポジトリをSnowflakeアカウントに接続することで、既存のGit投資を活用できます。この接続が確立されると、リポジトリがSnowflake自体のローカルにクローンされ、Snowflakeで直接コードを参照して実行できるようになります。
開発、テスト、本番環境で 別々の環境を維持する ことでリスクを最小限に抑えます。
環境ごとに個別のSnowflakeデータベースを使用することで、不要な変更が稼動中のシステムに影響を与えるリスクを最小限に抑えることができます。デプロイメントをより簡単に管理するには、デプロイメントプロセスをパラメーター化するスクリプトを使用します。
スクリプトと宣言型コードを使用して、開発、テスト、実運用において、管理された再現可能な方法で データベースの変更を管理する。
GitHub アクションを使用して、コードとデータのデプロイメントを含む CI/CD ジョブを自動化する。
注釈
Snowflake Extension for Visual Studio Code を使用すると、 VS コード内で直接Snowflake SQL ステートメントを記述して実行できます。VS コードを Snowflakeに接続 した同じリポジトリに接続することで、 VS コードでローカルにコードを開発し、作業をGitリポジトリに保存して、Snowflake内からコードにアクセスできるようになります。
Snowflakeに接続されたGitリポジトリにアセットを保存することで、ワークフローを合理化する¶
データ資産、コード、構成をGitリポジトリで集中管理およびバージョン管理し、Snowflakeのリポジトリを使用することで、一貫性を確保し、コラボレーションを簡素化し、必要に応じてロールバックを効率化できます。
SnowflakeアカウントをGitリポジトリに接続すると、Snowflakeはリポジトリからクローンされたファイル内のコードを実行できるようになります。結果は、リポジトリの完全なクローンを表すGitリポジトリステージになります。Snowflake内から、特定のコミット、ブランチ、タグでバージョン管理されたファイルにアクセスできます。
リポジトリステージを使用すると、バージョン管理されたファイルからSnowpark関数やプロシージャを作成し、バージョン管理された SQL スクリプトを EXECUTE IMMEDIATE FROM で直接実行したり、Snowflake CLI を使用してPythonスクリプトを実行することができます。このように、 SQL または Python でデータベースオブジェクトを宣言的に定義し、 CI/CD パイプラインを堅牢かつ簡単にセットアップして、それらのオブジェクトをデプロイすることができます。

開発、テスト、本番用に別々の環境を維持する¶
開発、テスト、本番用に別々の環境を維持することで、チームは開発アクティビティを本番環境から分離し、意図しない結果やデータ破損の可能性を減らすことができます。
ワークフローを複数の環境に分割すると、それぞれに独自のSnowflakeデータベース(通常は同一のコピー)が取得されます。
Jinjaテンプレートを使用してスクリプトをパラメーター化する¶
開発環境と運用環境の間で本質的に同じ方法でコードのデプロイと実行をサポートするには、デプロイ中に使用するデータベースなど、環境の詳細への参照をパラメーター化できます。これにより、 CI/CD パイプラインを有効にして、環境に適したデプロイメントターゲットを選択できるようになります。
スクリプトをパラメーター化するには、Pythonに似た言語で、単純なスクリプトのパラメーター化から広範でモジュール化されたスクリプトまで、さまざまな機能を持つ人気のあるテンプレート言語であるJinja2を使用できます。Snowflakeは、 EXECUTE IMMEDIATE FROM でテンプレート化された SQL スクリプトの実行をサポートしています。あるいは、Snowflake CLI では Python スクリプトに環境変数を渡すことができます。
例えば、デプロイメントターゲットを変更する場合、 SQL スクリプトでは:codenowrap:{{ environment }}
のような Jinja 変数、Python スクリプトでは環境変数でターゲットデータベースの名前を置き換えます。このテクニックは、次の SQL とPythonのコード例で示されています。
CREATE OR ALTER TASK {{ environment }}.my_schema.my_task
WAREHOUSE = my_warehouse
SCHEDULE = '60 minute'
AS select pi();
import os
from snowflake.core import Root, CreateMode
from datetime import timedelta
from snowflake.core.task import Task
my_task = Task(
name="my_task",
warehouse="my_warehouse",
definition="select pi()",
schedule=timedelta(minutes=60)
)
root = Root(Session.builder.getOrCreate())
tasks = root.databases[os.environ["environment"]].schemas["my_schema"].tasks
tasks.create(my_task, mode=CreateMode.or_replace)
パラメーター化されたスクリプトは、Snowflake CLI の:codenowrap:`snow git execute ` コマンドで実行できます。CLI では、Snowflake アカウントのガードレールおよびパフォーマンス機能内のリポジトリステージから SQL 、Python、またはその両方をミックスしたスクリプトを直接実行できます。
snow git execute @my_git_repo/branches/main/path/to/my_scripts" \
-D "environment='preprod'"
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;
from snowflake.core import Root
from snowflake.core.table import PrimaryKey, Table, TableColumn
my_table = root.databases["my_db"].schemas["my_schema"].tables["vacation_spots"].fetch()
my_table.columns.append(TableColumn(name="city", datatype="varchar", nullable=False]))
my_table.columns.append(TableColumn(name="airport", datatype="varchar", nullable=False]))
my_table.columns.append(TableColumn(name="avg_temperature_air_f", datatype="float", nullable=False]))
my_table.columns.append(TableColumn(name="avg_relative_humidity_pct", datatype="float", nullable=False]))
my_table.columns.append(TableColumn(name="avg_cloud_cover_pct", datatype="float", nullable=False]))
my_table.columns.append(TableColumn(name="precipitation_probability_pct", datatype="float", nullable=False]))
my_table_res = root.databases["my_db"].schemas["my_schema"].tables["vacation_spots"]
my_table_res.create_or_alter(my_table)
注釈
Snowflake Python APIs および Snowflake CLI を使用して、Snowflakeリソースを管理することもできます。データエンジニアリング作業をPythonで行うことを好む場合、SnowflakeのファーストクラスのPython API を使用すると、最も生産性の高い言語で同じリソース管理を行うことができます。
GitHub アクションを使用して CI/CD ジョブを自動化する¶
GitHub アクション を使用して、 CI/CD パイプラインを構成するジョブを自動化できます。GitHub アクションまたは同様の CI/CD ランナーを使用すると、ビルド、テスト、デプロイのタスクを自動化するワークフローを定義できます。
これらのワークフローでは、Snowflakeと GitHub の他の機能を使用して、各部分をまとめることができます。次のタスクを実行できます。
Snowflakeの認証情報を GitHub シークレット に保存し、 GitHub アクションがSnowflakeに接続できるようにします。
Snowflake CLI を簡単にインストールし、ネイティブの Snowflake CLI GitHub アクション の助けを借りて Snowflake に接続します。
Snowflake CLI を使用して、Snowflakeでコマンドを実行します。まず、Gitリポジトリから最新の変更点をSnowflakeに取り込みます。次に、宣言スクリプトとパラメトリックスクリプトを実行して、変更内容を任意の環境にデプロイします。
次の例の GitHub アクションワークフローの抜粋では、パイプラインをデプロイします。ワークフローは、以前に構成されたシークレットから必要な値を取得して、Snowflakeで認証します。
パイプラインをデプロイするために、ワークフローは以下の:codenowrap:snow git
コマンドを実行します。
snow git fetch
は、 GitHub リポジトリから Snowflake のクローンmy_git_repo
Git リポジトリステージに最新のものをプルします。snow git execute
はリポジトリのmain
ブランチから/scripts
ディレクトリのPython と SQL スクリプトを実行します。
name: Deploy scripts to preprod
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
env:
SNOWFLAKE_CONNECTIONS_DEFAULT_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
SNOWFLAKE_CONNECTIONS_DEFAULT_USER: ${{ secrets.SNOWFLAKE_USER }}
SNOWFLAKE_CONNECTIONS_DEFAULT_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install snowflake-cli
uses: Snowflake-Labs/snowflake-cli-action@v1.5
with:
cli-version: "latest"
default-config-file-path: ".snowflake/config.toml"
- name: Fetch repository changes
run: snow git fetch my_git_repo
- name: Deploy scripts to preprod environment
run: snow git execute @my_git_repo/branches/main/scripts/* \
-D "environment='preprod'"
Snowflake DevOps を始めましょう¶
Snowflake DevOps の使用に関するインタラクティブなウォークスルーについては、 Snowflake入門 DevOps クイックスタートをご参照ください。