Snowflakeを使用した DevOps

Snowflakeは、Snowflake環境をコードとして管理し、実稼働環境に移行する前に変更を検証し、 CI/CD パイプラインを通じてデプロイを自動化するためのツールとプラクティスを提供します。

Snowflakeの DevOps とは何ですか?

Snowflakeを使用した DevOps は、データインフラストラクチャ管理にソフトウェアエンジニアリングのベストプラクティスを導入します。中心原則は次のとおりです。

  • コードとして定義します。 バージョン管理されたファイルで、Snowflakeオブジェクトの望ましい状態を宣言します。Snowflakeは、その状態に到達するために必要な変更(作成、変更、またはドロップ)を決定し、適用します。

  • デプロイする前に検証します。 アカウントに適用する前に、計画ステップで提案された変更をプレビューします。作成、変更、ドロップを精査し、変更が正しいと確認したらデプロイします。

  • CI/CD で自動化します。 Snowflakeを既存の CI/CD パイプラインに統合することにより、手動のステップではなく、プルリクエスト、マージ、またはスケジュールされた実行によってデプロイがトリガーされるようにします。

推奨されるアプローチは DCM プロジェクト (データベース変更管理プロジェクト)を使用することです。これは、宣言型オブジェクト管理、計画後のデプロイ検証、マルチ環境ターゲット、および CI/CD を単一のワークフローに自動化します。

Snowflakeオブジェクトをコードとして定義する

Snowflakeでのdbtプロジェクト

:doc:` Snowflakeでのdbtプロジェクト </user-guide/data-engineering/dbt-projects-on-snowflake>` をデプロイして ` dbtコア <https://www.getdbt.com/>`_ プロジェクトをネイティブSnowflakeオブジェクトとして実行します。dbtモデルの SQL 変換を定義し、バージョン管理された DBT PROJECT オブジェクトとしてデプロイし、Snowflake SQL またはSnowflake CLI でそれらを実行します。Snowflakeタスクで実行をスケジュールし、 CI/CD パイプラインにデプロイを統合することができます。

詳細については、 Snowflakeでのdbtプロジェクト をご参照ください。

代替候補: バージョン管理されたスクリプトを使用してCREATE OR ALTER

DCM プロジェクトの外側にある個々のオブジェクトの変更については、 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;

注釈

Snowflake Python APIs および Snowflake CLI を使用して、Snowflakeリソースを管理することもできます。データエンジニアリング作業をPythonで行うことを好む場合、SnowflakeのファーストクラスのPython API を使用すると、最も生産性の高い言語で同じリソース管理を行うことができます。

変更の検証とプレビュー

Snowflakeアカウントに変更をデプロイする前に、提案された変更をプレビューして、意図と一致することを確認できます。

DCM プロジェクトを含む計画

DCM プロジェクトは、計画の後におけるデプロイモデルを使用します。PLAN コマンドは、定義ファイルとアカウントの現在の状態を比較し、何も変更せずに、提案された変更のリストを生成します。

Snowflake CLI: を使用してプランを実行できます。

snow dcm plan --target PROD

または SQL: を使用します。

EXECUTE DCM PROJECT my_db.my_schema.my_project
  PLAN
  USING CONFIGURATION PROD
FROM
  '@my_stage/my_project/';

デプロイに進む前に、出力を精査して、予想される作成、変更、およびドロップを確認します。

CI/CD によりデプロイを自動化

Snowflakeを CI/CD パイプラインに統合できるため、プルリクエストのマージ、ブランチのプッシュ、スケジュールされた実行などのイベントによってデプロイが自動的にトリガーされます。

以下のテーブルは、一般的な CI/CD パイプラインジョブを、対応するSnowflake CLI コマンドにマッピングしています。

パイプラインジョブ

CLI コマンド

説明

プルリクエストでの計画

snow dcm plan

ターゲット環境に適用される変更をプレビューする計画を生成します。計画の出力を精査するための PR コメントとして投稿できます。

マージでのデプロイ

snow dcm deploy

ターゲット環境に計画された変更を適用します。通常は、 PR がメインブランチにマージされた後に実行されます。

動的テーブルを更新

snow dcm refresh

デプロイ後に動的テーブルのリフレッシュをトリガーし、ダウンストリームのデータが最新であることを確認します。

期待値のテスト

snow dcm test

DCM プロジェクトで定義された期待チェックを実行し、デプロイが期待される結果をもたらしたことを確認します。

GitHub アクション

GitHub アクション を使用して、 CI/CD パイプラインを構成するジョブを自動化できます。

安全に認証するために、Snowflakeはパスワードや秘密キーなどの静的認証情報の代わりに、 OpenID 接続( OIDC )でのワークロードIDフェデレーション( WIF )の使用を推奨します。WIF OIDC 、 GitHub アクションは、 GitHub の OIDC プロバイダーから有効期限の短いトークンをリクエストし、Snowflakeはトークンを直接検証します。リポジトリに長期間有効なシークレットは格納されません。

WIF OIDC を設定するには、 GitHub の OIDC プロバイダーを信頼するSnowflakeサービスユーザーを作成します。

CREATE USER github_deployer
  TYPE = SERVICE
  DEFAULT_ROLE = deployer_role
  WORKLOAD_IDENTITY = (
    TYPE = OIDC
    ISSUER = 'https://token.actions.githubusercontent.com'
    SUBJECT = 'repo:<owner>/<repo>:environment:<environment_name>'
  );

サブジェクトクレームの構成と一般的な WIF について詳しくは ワークロードIDフェデレーション を参照してください。

次の例は、 WIF OIDC および DCM プロジェクトを使用して main ブランチに変更をプッシュすることで変更を計画し、デプロイするワークフローを示しています。

name: Deploy DCM project to production

on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Set up Snowflake CLI
        uses: snowflakedb/snowflake-cli-action@v2
        with:
          use-oidc: true
          cli-version: "3.11"

      - name: Plan DCM project
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
        run: snow dcm plan --target PROD --save-output -x

      - name: Deploy DCM project
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SNOWFLAKE_ACCOUNT }}
        run: snow dcm deploy --target PROD -x

代替認証メソッドを含む、Snowflake CLI での CI/CD の設定について詳しくは、 CI/CD と Snowflake CLI の統合 を参照してください。

環境の管理

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

環境ターゲットの接続プロファイル

DCM プロジェクトを使用すると、 manifest.yml ファイルで複数のデプロイターゲットを定義できます。各ターゲットは、特定のSnowflakeアカウント(またはデータベース)、プロジェクトオブジェクト、所有者ロール、テンプレート化構成にマップされます。同じ定義ファイルは、構成プロファイルを通じて環境固有の設定を適用して、すべての環境にデプロイできます。

targets:
  DEV:
    account_identifier: MYORG-MYACCOUNT_DEV
    project_name: MY_DB.MY_SCHEMA.MY_PROJECT_DEV
    project_owner: DEV_DEPLOYER
    templating_config: DEV

  PROD:
    account_identifier: MYORG-MYACCOUNT_PROD
    project_name: MY_DB.MY_SCHEMA.MY_PROJECT_PROD
    project_owner: PROD_DEPLOYER
    templating_config: PROD

templating:
  configurations:
    DEV:
      wh_size: "X-SMALL"
    PROD:
      wh_size: "LARGE"

複数プロジェクトのセットアップやチームコラボレーションなどのエンタープライズパターンについては、 。エンタープライズにおける|dcm|のユースケース を参照してください。

詳細:カスタムスクリプトのJinjaパラメーター化

DCM プロジェクトは、定義ファイルでのJinja2テンプレート化をネイティブでサポートしています。テンプレート変数、ループ、条件、マクロ、およびディクショナリを使用して、環境全体で定義を再利用できるようにすることができます。変数の値は manifest.yml の構成プロファイル、またはランタイムオーバーライドから取得されます。

DCM テンプレート化について詳しくは、 |dcm|ファイルとテンプレート を参照してください。

また、 EXECUTE IMMEDIATE FROM でJinja2を使用したスタンドアロン SQL スクリプト( DCM プロジェクトの外部)でパラメーター化することもできます。Snowflake CLI では Python スクリプトに環境変数を渡すこともできます。

たとえば、展開ターゲットを変更するには、 SQL スクリプトでは {{ environment }} のようなJinja変数、Pythonスクリプトでは環境変数でターゲットデータベースの名前を置き換えます。このテクニックは、次の SQL とPythonのコード例で示されています。

CREATE OR ALTER TASK {{ environment }}.my_schema.my_task
  WAREHOUSE = my_warehouse
  SCHEDULE = '60 minute'
  AS select pi();

はじめるにあたり

DCM プロジェクトを開始するには、プロジェクトファイルの設定、環境の構成、変更のデプロイなど、機能の概要について Snowflake DCM Projects を参照してください。

サンプルプロジェクト、 CI/CD テンプレートおよびクイックスタートについては ` Snowflakeラボ DCM リポジトリ <https://github.com/Snowflake-Labs/snowflake_dcm_projects>`__ を参照してください。

ステップバイステップのチュートリアルに従うには、 ` Snowflake DCM プロジェクト入門 <https://www.snowflake.com/en/developers/guides/get-started-snowflake-dcm-projects/>`__ クイックスタートを試してください。