Snowflakeを使用した DevOps¶
Snowflakeは、Snowflake環境をコードとして管理し、実稼働環境に移行する前に変更を検証し、 CI/CD パイプラインを通じてデプロイを自動化するためのツールとプラクティスを提供します。
Snowflakeの DevOps とは何ですか?¶
Snowflakeを使用した DevOps は、データインフラストラクチャ管理にソフトウェアエンジニアリングのベストプラクティスを導入します。中心原則は次のとおりです。
コードとして定義します。 バージョン管理されたファイルで、Snowflakeオブジェクトの望ましい状態を宣言します。Snowflakeは、その状態に到達するために必要な変更(作成、変更、またはドロップ)を決定し、適用します。
デプロイする前に検証します。 アカウントに適用する前に、計画ステップで提案された変更をプレビューします。作成、変更、ドロップを精査し、変更が正しいと確認したらデプロイします。
CI/CD で自動化します。 Snowflakeを既存の CI/CD パイプラインに統合することにより、手動のステップではなく、プルリクエスト、マージ、またはスケジュールされた実行によってデプロイがトリガーされるようにします。
推奨されるアプローチは DCM プロジェクト (データベース変更管理プロジェクト)を使用することです。これは、宣言型オブジェクト管理、計画後のデプロイ検証、マルチ環境ターゲット、および CI/CD を単一のワークフローに自動化します。
Snowflakeオブジェクトをコードとして定義する¶
DCM プロジェクト(推奨)¶
DCM プロジェクト (データベース変更管理プロジェクト)は、Snowflake環境を管理するための宣言的でコードとしてのインフラストラクチャのアプローチを提供します。各ステップを指定する命令スクリプトを記述する代わりに、オブジェクトの望ましいターゲット状態を定義します。Snowflakeはこれらの定義を現在の状態と比較し、必要な変更を決定します。
DCM プロジェクトの構成は次のとおりです。
マニフェストファイル (
manifest.yml)は、各環境のデプロイターゲット、所有者ロール、テンプレート化構成を指定します。定義ファイル (
sources/definitions/の下にある SQL ファイル)には、Snowflakeオブジェクトの DEFINE ステートメント、アクセス制御の GRANT ステートメント、およびデータ品質に期待される ATTACH ステートメントが含まれます。
次の例は、Jinja2テンプレートを使用して複数チームのインフラストラクチャを作成する定義ファイルを示しています。
プロジェクトファイルの設定方法、複数の環境の管理方法、デプロイの自動化方法など DCM プロジェクトの完全なドキュメントについては、 Snowflake DCM Projects を参照してください。
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 <オブジェクト> コマンドを使用できます。このコマンドは、オブジェクトを作成したり、コマンドで指定された定義と一致するようにオブジェクトを変更したりします。リモートリポジトリ内のバージョン管理されたファイルからこのコマンドを使用すると、ファイルの以前のバージョンを実行することで以前のバージョンへの変更をロールバックできます。
注釈
Snowflake Python APIs および Snowflake CLI を使用して、Snowflakeリソースを管理することもできます。データエンジニアリング作業をPythonで行うことを好む場合、SnowflakeのファーストクラスのPython API を使用すると、最も生産性の高い言語で同じリソース管理を行うことができます。
変更の検証とプレビュー¶
Snowflakeアカウントに変更をデプロイする前に、提案された変更をプレビューして、意図と一致することを確認できます。
DCM プロジェクトを含む計画¶
DCM プロジェクトは、計画の後におけるデプロイモデルを使用します。PLAN コマンドは、定義ファイルとアカウントの現在の状態を比較し、何も変更せずに、提案された変更のリストを生成します。
Snowflake CLI: を使用してプランを実行できます。
または SQL: を使用します。
デプロイに進む前に、出力を精査して、予想される作成、変更、およびドロップを確認します。
CI/CD によりデプロイを自動化¶
Snowflakeを CI/CD パイプラインに統合できるため、プルリクエストのマージ、ブランチのプッシュ、スケジュールされた実行などのイベントによってデプロイが自動的にトリガーされます。
以下のテーブルは、一般的な CI/CD パイプラインジョブを、対応するSnowflake CLI コマンドにマッピングしています。
パイプラインジョブ |
CLI コマンド |
説明 |
|---|---|---|
プルリクエストでの計画 |
|
ターゲット環境に適用される変更をプレビューする計画を生成します。計画の出力を精査するための PR コメントとして投稿できます。 |
マージでのデプロイ |
|
ターゲット環境に計画された変更を適用します。通常は、 PR がメインブランチにマージされた後に実行されます。 |
動的テーブルを更新 |
|
デプロイ後に動的テーブルのリフレッシュをトリガーし、ダウンストリームのデータが最新であることを確認します。 |
期待値のテスト |
|
DCM プロジェクトで定義された期待チェックを実行し、デプロイが期待される結果をもたらしたことを確認します。 |
GitHub アクション¶
GitHub アクション を使用して、 CI/CD パイプラインを構成するジョブを自動化できます。
安全に認証するために、Snowflakeはパスワードや秘密キーなどの静的認証情報の代わりに、 OpenID 接続( OIDC )でのワークロードIDフェデレーション( WIF )の使用を推奨します。WIF OIDC 、 GitHub アクションは、 GitHub の OIDC プロバイダーから有効期限の短いトークンをリクエストし、Snowflakeはトークンを直接検証します。リポジトリに長期間有効なシークレットは格納されません。
WIF OIDC を設定するには、 GitHub の OIDC プロバイダーを信頼するSnowflakeサービスユーザーを作成します。
サブジェクトクレームの構成と一般的な WIF について詳しくは ワークロードIDフェデレーション を参照してください。
次の例は、 WIF OIDC および DCM プロジェクトを使用して main ブランチに変更をプッシュすることで変更を計画し、デプロイするワークフローを示しています。
代替認証メソッドを含む、Snowflake CLI での CI/CD の設定について詳しくは、 CI/CD と Snowflake CLI の統合 を参照してください。
環境の管理¶
開発環境、テスト環境、本番環境を別々に管理することで、チームは開発アクティビティを本番環境から切り離すことができ、意図しない結果やデータ破損の可能性を減らすことができます。
環境ターゲットの接続プロファイル¶
DCM プロジェクトを使用すると、 manifest.yml ファイルで複数のデプロイターゲットを定義できます。各ターゲットは、特定のSnowflakeアカウント(またはデータベース)、プロジェクトオブジェクト、所有者ロール、テンプレート化構成にマップされます。同じ定義ファイルは、構成プロファイルを通じて環境固有の設定を適用して、すべての環境にデプロイできます。
複数プロジェクトのセットアップやチームコラボレーションなどのエンタープライズパターンについては、 。エンタープライズにおける|dcm|のユースケース を参照してください。
詳細:カスタムスクリプトのJinjaパラメーター化¶
DCM プロジェクトは、定義ファイルでのJinja2テンプレート化をネイティブでサポートしています。テンプレート変数、ループ、条件、マクロ、およびディクショナリを使用して、環境全体で定義を再利用できるようにすることができます。変数の値は manifest.yml の構成プロファイル、またはランタイムオーバーライドから取得されます。
DCM テンプレート化について詳しくは、 |dcm|ファイルとテンプレート を参照してください。
また、 EXECUTE IMMEDIATE FROM でJinja2を使用したスタンドアロン SQL スクリプト( DCM プロジェクトの外部)でパラメーター化することもできます。Snowflake CLI では Python スクリプトに環境変数を渡すこともできます。
たとえば、展開ターゲットを変更するには、 SQL スクリプトでは {{ environment }} のようなJinja変数、Pythonスクリプトでは環境変数でターゲットデータベースの名前を置き換えます。このテクニックは、次の SQL とPythonのコード例で示されています。
はじめるにあたり¶
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/>`__ クイックスタートを試してください。