|dcm|の展開と管理¶
このトピックでは、アカウントを含め、Snowflake環境を管理するための|dcm|を作成してデプロイする方法について説明します。
|dcm-object|の管理には、次の手順が含まれます。
プロジェクトへのインクリメント変更だけでなく、大規模なアカウントインフラストラクチャの変更も継続的にデプロイできます。
1回のデプロイで0から100の大規模なアカウントインフラストラクチャの変更を行うのではなく、プロジェクトへのインクリメント変更と追加を継続的にデプロイすることをお勧めします。
|dcm-object|の準備¶
|dcm|を開始するには、Snowflakeアカウントが次の前提条件を満たしている必要があります。
|dcm|オブジェクトを作成できるデータベースとスキーマ
|dcm|オブジェクトを作成する権限と、ウェアハウスでクエリを実行するためのアクセス権を持つロール
|sf-cli|の場合、仮ステージを作成する権限を持つロール
このセクションでは、|dcm|の準備のために完了する必要のあるタスクについて説明します。
:ref:`|sf-cli|またはCortexCLIを使用する場合は、DCMプロジェクト<label-dcm_projects_interface_tools>`で使用するインターフェースをインストールします。
:ref:`Git統合を構成します<label-dcm_projects_git_integration>`(推奨ですが、必須ではありません)
注釈
`snowflake-labs DCMリポジトリ<https://github.com/Snowflake-Labs/snowflake_dcm_projects>`__は継続的に更新されており、使い始めるのに役立つリソースが提供されています。
インターフェースツール¶
|dcm|には次のインターフェースオプションがあります。
インターフェースツール |
最適な用途 |
|---|---|
Snowsight Snowsightのワークスペースは、アカウント内のSnowflakeネイティブクラウドIDEです。 |
|
Snowflake CLI**を使用した**ローカルIDE ソフトウェアエンジニアにとって非常に使いやすいカスタマイズされたインターフェース。 |
|
Cortexコード Snowflake向けのエージェントAIツール。詳細については、 |dcm|向けCortex Code をご参照ください。 |
|
SQLコマンド |
|
|dcm|向けCortex Code¶
Cortex Codeは、Snowflake向けのエージェントAIツールです。DCMスキルを有効にすると、Cortex Codeは自律的に|dcm|を作成、移行、デバッグ、デプロイできます。また、ステップバイステップで連携して作業することもできます。
注釈
DCMスキルを備えたCortex Codeは現在、Cortex Code CLI経由でのみ利用可能です。Snowsightワークスペースでは利用できません。
Cortex Code DCMスキルにより、以下が可能になります。
マニフェストファイル、フォルダー構造、定義ファイルなど、新しい|dcm-object|をゼロから構築します。
DEFINEステートメント、Jinjaテンプレート、およびマクロを作成および編集します。
PLAN、DEPLOY、REFRESH、TEST、およびPREVIEWコマンドを実行します。
計画の出力を解釈し、障害を診断して、修正を提案します。
デプロイメントアーティファクトをダウンロードして検査します。
既存の|dcm-object|をナビゲートして説明します。
Cortex Code DCMスキルを使い始めるには、次の手順に従います。
:doc:`Cortex Codeのインストール</user-guide/cortex-code/cortex-code-cli>`で説明されているように、Cortex Code CLIをインストールします。
ターミナルでCortex Codeを起動します。
`$dcm`スキルリファレンスを使用するか、自然言語プロンプトで`DCM`という用語を使用して、|dcm|と対話形式でやり取りします。
例:
「分析パイプライン用の新しいDCMプロジェクトを作成」
「PRODターゲットに対してプロジェクト計画を作成」
「前回の計画が失敗したのはなぜですか?」
「カスタマー支出のための新しい動的テーブル定義を追加」
Snowflake CLI の DCM Projects¶
|sf-cli|は、Snowflakeのコマンドラインインターフェースです。ローカルのIDEからSnowflakeアカウントとやり取りするために使用できるツールです。
DCMプロジェクトには、|sf-cli|バージョン3.16以降が必要です。:doc:`/developer-guide/snowflake-cli/installation/installation`で説明されているように、|sf-cli|をインストールまたはアップグレードします。
:doc:`Snowflakeの構成CLIおよびSnowflakeへの接続</developer-guide/snowflake-cli/connecting/connect>`で説明されているように、Snowflakeアカウントへの接続を構成します。有効な接続があることを確認します。
Gitリポジトリクローンのローカルディレクトリにナビゲートします。例:
利用可能な|sf-cli| DCMコマンドを確認します。
Git統合¶
|dcm-object|定義ファイルが保存されているGitリポジトリに接続します。
予定している変更のためのGitブランチを作成または選択します。
Snowflakeでは、ブランチからワークスペースエディターにファイルがクローンされます。
|dcm-object|定義ファイルがあるフォルダー、または作成したいフォルダーにナビゲートします。
-
VSCode用の`Snowflake拡張機能<https://docs.snowflake.com/en/user-guide/vscode-ext>`_はここでは必要ありませんが、役に立つ場合があります。
`Snowflakeに接続します<https://docs.snowflake.com/en/developer-guide/snowflake-cli/connecting/connect>`__。
Gitリポジトリに接続します。
ローカルIDEをリモートのGitリポジトリに接続します。
予定している変更のブランチを作成または選択します。
そのブランチをローカルディスクにクローンします。
|dcm|定義ファイルがあるフォルダー、または作成したいフォルダーにナビゲートします。
DCM project の作成¶
予算のロールと権限¶
|dcm-object|オブジェクトを作成するユーザーのロールには、次のロールと権限が必要です。
CREATE DCM PROJECT ON SCHEMA権限。
DCM project の作成¶
次のオプションのいずれかを使用して|dcm-object|オブジェクトを作成します。
デフォルト以外のターゲットのプロジェクトを作成するには、次のコマンドのいずれかを使用します。
ナビゲーションメニューで Projects » Workspaces を選択します。
:ui:`Workspaces`ページで、「+ 新規追加」->「DCM プロジェクト」を選択して、新しい|dcm-object|フォルダーを作成します。
「デフォルトターゲット環境の定義」を選択して、マニフェスト内のデフォルトターゲット用の新しい|dcm-object|オブジェクトを選択または作成します
マニフェストに定義されているがまだ存在しない|dcm-object|オブジェクトを持つターゲットに対してDCM PLANを実行すると、計画を実行する前に、定義された名前と所有者ロールに基づいてその|dcm-object|オブジェクトを作成するかどうかを確認するプロンプトがUIにより表示されます。
:ui:`Target`は、指定された|dcm-object|オブジェクトがすでに存在し、使用できるかどうかを示します。
アクセス制御とロールの権限¶
スキーマレベルの|dcm-object|オブジェクトに対するロールベースのアクセス制御(RBAC)を、READ、MONITOR、またはOWNERSHIP権限に設定できます。
これらの権限は、ワークスペース、ステージ、またはリポジトリに格納されている定義ファイルのアクセス制御とは独立しています。
権限 |
説明 |
許可されている操作 |
|---|---|---|
READ |
|
|
MONITOR |
|
|
OWNERSHIP |
|
|
注釈
Snowflakeの他のコマンドと同様に、:code:`EXECUTE DCM PROJECT`も、実行ユーザーが**セカンダリロールからの権限**を有効にしている場合、その権限を反映した状態で動作します。プロジェクト所有者ロール以外のロール権限を利用しないように、:code:`USE SECONDARY ROLES NONE;`を実行します。これにより、同じプライマリロールを持つ異なるサービスユーザーが実行する場合、どの環境においてもデプロイの挙動が一定に保たれることが保証されます。
DCM管理のオブジェクトの所有権¶
|dcm-object|をデプロイするロールは、デフォルトで、デプロイされたすべてのオブジェクトに対するOWNERSHIP権限を有しています。
プロジェクト定義には、他のロールへのGRANT OWNERSHIPステートメントを含めることができます。Snowflakeは、|dcm-object|所有者ロールが、保持する別の下位レベルのロールに対してのみDCM管理オブジェクトの所有権を付与することをお勧めします。その後、プロジェクト所有者ロールが新しいオブジェクト所有者ロールの権限を「継承する」ため、プロジェクトはこのオブジェクトを引き続き管理できます。
|dcm-object|所有者ロールが、自身が保持しない別のロールにDCM管理オブジェクトの所有権を付与すると、プロジェクト所有者ロールのオブジェクトに対する所有権はなくなります。それで、プロジェクトからこのデプロイされたオブジェクトを管理することはできなくなります。それ以降のデプロイは失敗します。この場合、オブジェクト定義をプロジェクトから削除するか、所有権をプロジェクト所有者ロールに戻す必要があります。
既存のオブジェクトを|dcm-object|の管理下に移行する場合、|dcm-object|オブジェクトを所有するロールには、|dcm-object|によって管理されるオブジェクトに対する所有権限(直接または他のロールを通じて継承)も必要になります。
注釈
移行されたオブジェクトの場合、現在の状態と|dcm-object|の定義が同期されるよう、対応するGRANT OWNERSHIPステートメントもプロジェクト定義に追加することをお勧めします。
|dcm-object|を定義する¶
|dcm-object|はマニフェストファイルと1つまたは複数のSQLオブジェクト定義ファイルに基づいています。これらのファイルは通常、Gitリポジトリまたはローカルワークスペースに保存および管理されます。
マニフェストファイル
オブジェクト定義ファイル
この|dcm-object|で、合わせて管理するSnowflakeオブジェクト、付与、および期待値のグループを定義します。
|dcm-object|フォルダーと定義ファイルの設定方法、およびテンプレートを使用して|dcm-object|を定義する方法については、:ref:`label-dcm_projects_files`を参照してください。
|dcm-object|の計画¶
|dcm-object|を計画すると、デプロイメント前の変更をプレビューするためのドライランが実行されます。Snowflakeは:ref:`プロジェクト定義ファイル<label-dcm_projects_definition_files>`を既存のオブジェクトと比較し、どのオブジェクトが作成、変更、またはドロップされるかを表示します。アカウントに変更は加えられません。
DCMプロジェクトをデプロイする前に、計画を使用して変更を精査し、検証します。:ref:`設定<label-dcm_projects_files_configurations>`や計画結果の出力パスなどのオプションを指定できます。
PLANは、DDLステートメントを実行しないことを除いて、実際には可能な限りDEPLOYコマンドを模倣します。
重要
デプロイ前に常にプロジェクトでPLANコマンドを実行して、構文、テンプレート、オブジェクトの依存関係、アクセス権限などのエラーがないことを確認します。計画の出力を精査してエラーをデバッグし、提供された変数でレンダリングされたJinjaをプレビューします。また、デプロイ後に発生する変更もプレビューします。
計画では次のステップが実行されます。
選択された構成プロファイルまたは実行時に提供された値で、すべてのJinjaテンプレートをレンダリングする。
前回のデプロイメントの一部として定義されたエンティティの現在の状態と、すべての定義を比較する。
定義されたすべてのステートメントをCREATE、ALTER、DROP、GRANT、およびREVOKEステートメントに変換する。
相互依存関係に基づいてすべてのステートメントを並べ替える。
すべてのステートメントをコンパイルする。
注釈
PLANはデプロイ中に発生する可能性のあるほぼすべてのエラーを補足しますが、デプロイの成功を保証するものではありません。
PLAN コマンドを実行します¶
PLANコマンドは、入力として次の情報を受け取ります。
マニフェストファイルへのパス
CLIはマニフェストからターゲットを読み取ります(
default_target``または--target``フラグ)。SQLコマンドの場合は、マニフェストファイルへのパスとプロジェクト名を指定する必要があります。Jinja変数の定義値(オプション)。
ターゲットの``templating_config``は自動的に構成プロファイルを選択します。SQLコマンドの場合、プロファイルを指定するにはUSING CONFIGURATION句を使用します。
上書きする構成プロファイルの1つまたは複数の値(オプション)。
以下は、PLANコマンドの実行方法の例です。
ローカルのIDEターミナルで、またはGitワークフローの一部として、:code:`snow dcm plan`コマンドを実行します。
ローカルディレクトリからDCMプロジェクトを計画するCLIコマンドの例は次のとおりです。
SnowflakeステージまたはGitリポジトリクローンからDCMプロジェクトを計画するCLIコマンドの例は次のとおりです。
オプションの引数を使用してDCMプロジェクトを計画するCLIコマンドの例は次のとおりです。
変数は二重引用符で囲む必要があり、文字列値には追加の一重引用符が必要です。値のリストには角括弧が必要です。
DCMコントロールパネルの最上部:
現在のワークスペースでプロジェクトフォルダーを選択します。
ターゲットを選択します(複数のターゲットがある場合)。
(オプション)特定のパラメーターを上書きします。
Plan をクリックします。
Snowsight UIでは、マニフェストターゲットで定義された|dcm-object|オブジェクトが自動的に使用されます。プロジェクトオブジェクトがまだ存在しない場合は、UIから作成できます。
PLANが完了すると、出力が新しいタブで開きます。表示されない場合は、もう一度:ui:`Plan`をクリックしてタブを開きます。
計画がすでに存在し、定義を変更した場合は、再計画を選択できます。
計画の出力は常に、プロジェクトのサブフォルダー``out/``の下に自動的に生成されます。
Snowflake内の、またはSnowflakeに接続されたSQLコマンドを実行できる任意の場所から、SQLでDCM PLANを実行できます。PLAN`モードで:doc:/sql-reference/sql/execute-dcm-project`コマンドを使用します。
ワークスペースパスからDCMプロジェクトを計画するSQLコマンドの例は次のとおりです。
構成プロファイルでJinjaを使用し、``wh_size``および``teams``を上書きする場合に、DCMプロジェクトを計画するSQLコマンドの例は次のとおりです。
構成プロファイルなしでJinjaテンプレート化を使用する場合に|dcm-object|を計画するSQLコマンドの例は次のとおりです。
定義ファイルパス¶
マニフェストファイルと定義ファイルの場所を参照する場合、次のオプションがあります。
ワークスペースパスから
Snowsightユーザーインターフェースは、現在のワークスペース内にあるすべての|dcm-object|定義を自動的に一覧表示します。これらのパスのいずれかを選択すると、ワークスペースによりそれが使用され、DCMコマンドが実行されます。
ワークスペースで手動によりSQLコマンドを実行する場合、任意のワークスペース内の同じパスを参照することもできます。
ヒント:ワークスペース内にあるすべてのファイルの背後にあるスリードットメニューを使用すると、そのファイルへのフルパスをSQLコードにコピーできます。
ワークスペースパスからDCMプロジェクトを計画するSQLコマンドの例は次のとおりです。
ディスク上のローカルGitリポジトリクローンから
ローカルのIDEでCLIコマンドを実行する前に、``manifest.yml``ファイルを含むディレクトリを選択します。または、使用するマニフェストと定義を含む別のローカルディレクトリを指定することもできます。
ローカルGitリポジトリの現在のディレクトリから|dcm-object|を計画するCLIコマンドの例は次のとおりです。
ローカルGitリポジトリクローンの別のディレクトリから|dcm-object|を計画するCLIコマンドの例は次のとおりです。
ワークフロー内のリモートリポジトリから
同じCLI構文は、DCMコマンドがCI/CDワークフローで実行される場合に使用できます。
ローカルGitリポジトリクローンから|dcm-object|を計画するCI/CDワークフローの例は次のとおりです。
Snowflake内のステージまたはGitリポジトリクローンから
DCMコマンドを実行するプロシージャまたはタスクをSnowflake内で実行する場合、このSQLコマンドは、アカウント内のSnowflakeステージまたはGitリポジトリクローンへの絶対パスを参照できます。
Gitリポジトリクローンの場合は、最新バージョンを利用するために、まずALTER GIT REPOSITORY FETCHの実行を検討してください。
``'@...'``パスは、DCM SQLコマンドを実行する場合にのみ使用できます。
SnowflakeのステージまたはGitリポジトリクローンからDCMプロジェクトを計画するSQLコマンドの例は次のとおりです。
計画の出力¶
注釈
プレビュー段階では、正確な出力形式が変更される可能性があります。
標準計画の出力には、計画の実行に関する次の情報がJSON形式で含まれます。
プロパティ |
説明 |
|---|---|
|
出力形式のスキーマバージョン。バージョン2は最新で、唯一サポートされているバージョンです。 |
|
実行に関するコンテキスト情報。 |
|
コマンドが実行されたときのISO 8601タイムスタンプ。 |
|
このプランを生成したクエリの一意の識別子。 |
|
DCMプロジェクトオブジェクトの完全修飾名。 |
|
コマンドを実行したユーザーの名前。 |
|
コマンドの実行に使用されたアクティブなロール。 |
|
実行されたコマンド。 |
|
変更エントリの配列。各エントリは、作成、変更、またはドロップされる(あるいはされた)1つのオブジェクトを表します。空の配列は、プロジェクト定義がすでにアカウントと同期していることを示します。 |
|
オブジェクトに対して計画されたアクション。可能な値: |
|
ターゲットオブジェクトを識別します。 |
|
Snowflakeのオブジェクトタイプ。 |
|
オブジェクトの名前です。 |
|
オブジェクトの完全修飾名。 |
|
オブジェクトを含むデータベース。アカウントレベルのオブジェクトでは省略されます。 |
|
オブジェクトを含むスキーマ。データベースレベルおよびアカウントレベルのオブジェクトでは省略されます。 |
|
特定の属性の変更を詳細に示す変更記述子の配列。 |
|
変更のタイプ。可能な値: |
|
設定または変更される属性の名前。 |
|
属性の新しい値。``kind``が``set``または``changed``の場合に存在します。 |
|
変更前における属性の以前の値。``kind``が``changed``の場合にのみ存在します。 |
|
変更されるコレクションの名前( |
|
コレクション内のアイテムを識別するために使用されるラベル(``name``など)。特定のコレクションにのみ存在します。 |
|
コレクションアイテム記述子のネストされた配列。``kind``が``collection``の場合にのみ存在します。 |
|
コレクションアイテムへの変更タイプ。可能な値: |
|
コレクション内のアイテムを識別します。コレクションタイプに応じて、文字列またはオブジェクトになります。 |
|
このアイテムに関する追加の変更記述子の配列。``added``および``modified``アイテムに存在します。``removed``アイテムには常に存在しません。 |
プラン出力の例を次に示します。
|dcm-object|のデプロイ¶
|dcm-object|を展開するとき、次のアクションが実行されます。
定義されているがまだ存在しないオブジェクトは作成されます。
既に存在するが現在の定義と異なるオブジェクトは変更されます。
定義されたとおりにすでに存在するオブジェクトはスキップされます。
すでに存在するが定義されなくなったオブジェクトはドロップされます。
プロジェクトで定義された権限付与とアタッチされたデータ品質の期待値にも、同じ動作が適用されます。
重要
意図しないデータの損失を避けるため、DEPLOYを実行する前に、常にPLANを実行して出力を精査してください。
各|dcm-object|は、常に1つのインスタンスのみをデプロイできます。複数の構成プロファイルを共存させることはできません。同じ|dcm-object|で構成Bをデプロイすると、Bで定義されていない以前の他の構成のオブジェクトはすべてドロップされます。
ターゲット環境ごとに単一の|dcm-object|を作成します。その後、各環境の|dcm-object|は同じ定義ファイルを参照しつつ、``suffix => 'DEV_JS'``のように各変数の異なる値を使用し独立してデプロイできるため、同じSnowflakeアカウント上にそれぞれ独立して存在できます。
事前定義されたプロファイルを少し変更して使用する場合は、実行時に選択した変数の値を上書きできます。
例:
各デプロイ試行(成功、失敗、またはキャンセル)には、デプロイ番号(たとえば``DEPLOYMENT$1``など)が付与されます。デプロイ履歴での可視性を高めるために、オプションで一意の文字列を指定し、個々のデプロイに名前を付けるデプロイエイリアスとして使用できます。デプロイエイリアスは、コード変更のコミットメッセージのようなものと考えてください。
各DEPLOYコマンドは、デプロイの一部として、まず内部のPRE-PLANを実行します。PRE-PLANが成功した場合、その直後にDEPLOYが実行されます。この内部プランのステップを中断または精査するオプションはありません。PRE-PLANは、デプロイ中の障害のリスクをさらに軽減するために実行されます。DEPLOYが失敗した場合、PRE-PLANステップとDEPLOYステップのどちらで失敗したかをエラーメッセージで確認できます。PRE-PLANステップでの失敗はPLANと似ており、DDLの変更は実行されません。
重要
DEPLOYステップでの失敗により、定義された変更が部分的に実行される場合があります。これにより、管理オブジェクトの一部が未定義の状態になる可能性があります。ほとんどの場合、根本原因を修正してDEPLOYを再度実行すると、定義されたターゲット状態に復元されます。
DEPLOY出力ファイルのターゲットパスはカスタマイズできません。デプロイメントのアーティファクトは常に|dcm-object|内に保存されます。
DEPLOY コマンドを実行します¶
DEPLOYコマンドを実行するには、次の入力を指定します。
マニフェストファイルへのパス。
マニフェストで構成プロファイルが定義されている場合は、構成プロファイル名を指定する必要があります。
デフォルト値を上書きする構成プロファイルの値(オプション)。
デプロイ*エイリアス*(オプション)。
以下は、DEPLOYコマンドの実行方法の例です。
:code:`snow dcm deploy`は、ローカルのIDEターミナル、またはGitワークフローの一部として実行できます。
ローカルディレクトリから|dcm-object|をデプロイするCLIコマンドの例は次のとおりです。
デフォルト以外の環境をターゲットにして|dcm-object|をデプロイするCLIコマンドの例は次のとおりです。
オプション引数を指定して|dcm-object|をデプロイするCLIコマンドの例は次のとおりです。
ナビゲーションメニューで Projects » Workspaces を選択します。
現在のワークスペースでプロジェクトフォルダーを選択します。
ターゲットを選択します(複数のターゲットがある場合)。
Plan をクリックします。
UIは、マニフェストターゲットで定義された|dcm-object|オブジェクトを自動的に使用します。プロジェクトオブジェクトがまだ存在しない場合は、UIから作成できます。
PLANが完了すると、出力が新しいタブで開きます。表示されない場合は、もう一度:ui:`Plan`をクリックしてタブを開きます。
計画がすでに存在し、定義を変更した場合は、再計画を選択できます。
PLANの出力を精査し、意図しない変更が含まれていないことを確認します。
:ui:`Deploy`をクリックして、PLANと同じターゲットと値でデプロイメントを実行します。
標準計画の出力構造については、:ref:`label-dcm_projects_plan_deploy_output`を参照してください。
|dcm-object|を管理する¶
|dcm-object|が管理するすべてのオブジェクトを表示¶
:doc:`/sql-reference/sql/show-entities-in-dcm-project`コマンドを使用すると、特定の|dcm-object|によって現在管理されているすべてのSnowflakeオブジェクトのリストを表示できます。すべてのオブジェクトに関する完全修飾名のリストを提供します。結果を表示するには、|dcm-object|に対するREAD権限と、管理対象オブジェクト自体を表示する権限の両方が必要です。
注釈
結果は、必ずしも最新のデプロイのオブジェクトと一致するとは限りません。プロジェクトから手動でドロップまたは切り離されたオブジェクトは、結果に一覧表示されません。
:code:`LIKE`を使用して名前で検索するか、フロー演算子を使用して結果セットに対し追加の処理やフィルタリングを実行できます。
同様に、このプロジェクトで定義およびデプロイされた権限について、SHOW GRANTSおよびSHOW FUTURE GRANTSを実行できます。
現在|dcm-object|によって管理されているすべてのオブジェクトを表示する例は次のとおりです。
|dcm-object|からのオブジェクトの切り離し¶
UNSET DCM PROJECT句とともに:doc:`/sql-reference/sql/alter`コマンドを使用すると、デプロイ済みで、現在|dcm-object|によって管理されているオブジェクトを切り離すことができます。このコマンドは、オブジェクトをドロップせずにオブジェクトと|dcm-object|の関連付けを削除します。別の|dcm-object|でオブジェクトの管理を開始する場合に、このコマンドを使用できます。
再度デプロイする前に、:ref:`プロジェクト定義ファイル<label-dcm_projects_definition_files>`から対応するDEFINEステートメントを必ず削除してください。そうでない場合、オブジェクトは|dcm-object|に再統合されます。
|dcm-object|からオブジェクトを切り離すSQLコマンドの例は次のとおりです。
デプロイ済みの権限付与や期待値は、DCMプロジェクトから切り離すことはできません。
|dcm-object|のドロップ¶
|dcm-object|オブジェクトがドロップされた場合、管理対象のすべてのエンティティ、権限付与、および期待値は「管理対象外」としてそのまま残ります。
重要
|dcm-object|オブジェクトをドロップまたは置換すると、オブジェクトに含まれるすべてのデプロイ履歴アーティファクトが失われます。
|dcm-object|デプロイの自動化¶
CI/CDベストプラクティス¶
CI/CDパイプラインを使用してデプロイメントを自動化する場合は、次のプラクティスに従ってください。
本番以外の環境をターゲットとする|dcm-object|は、誤って本番環境にデプロイされるのを避けるため、本番環境に対応するオブジェクトとは異なるロールにより、所有されている必要があります。
本番環境をターゲットとする|dcm-object|は、プロジェクト内のすべてのオブジェクトをデプロイできる特別に調整されたアクセス権限を持つ、本番デプロイ専用のロールにより、所有されている必要があります。
|dcm-object|の所有権向けに、一般的な管理者ロールを使用しないでください。そのようなロールはサービスユーザーにのみ付与し、個々の開発者には付与しないでください。
個々の開発者ではなく、サービスユーザーにのみ専用の本番デプロイロールを付与します。
重要なインフラやデータ製品の不変性を確保するため、所有権を本番デプロイロールに制限します。
専用の本番デプロイロールが本番オブジェクトの所有権を他のロールに付与した場合、それらのロールを付与されたユーザーは本番オブジェクトを変更またはドロップできます。
GitHubアクションの例¶
このセクションでは、|dcm|の典型的なCI/CDパターンを説明する、サンプルGitHubアクションワークフローを提供します。Azure DevOps、GitLab CI/CD、Bitbucket Pipelinesなどの他のGitベースのプラットフォームにも同じ概念が適用されます。ワークフローの構文のみが異なります。
各サンプルは、パイプラインのセットアップ、環境トポロジ、組織要件に基づいてカスタマイズし、組み合わせることができるビルドブロックを提供します。
サンプルワークフローは、任意のDCM CI/CDセットアップに適用可能な次のパターンを示しています。
**マニフェスト駆動型の構成**各ワークフローは、マニフェストターゲットから``account_identifier``、
project_owner、および``project_name``を読み取ります。これにより、環境構成を1か所に保持し、GitHubシークレット間での重複を防ぐことができます。**データドロップ保護**デプロイワークフローは、データベース、スキーマ、テーブル、ステージなど、データを保持するオブジェクトに対する破壊的なDROP操作について、``plan_result.json``を解析し、見つかった場合はデプロイをブロックします。
**ステージから本番環境への順次昇格**実稼働へのデプロイは、ステージングのデプロイが成功し、動的テーブルが更新され、データ品質テストに合格した後にのみ開始されます。
**構造化プラン出力の解析**ワークフローは``jq``を使用して``plan_result.json``から操作数とオブジェクトドメインを抽出し、カスタムの要約とチェックを簡単にビルドできるようにします。
**AIを利用した要約**``snow cortex complete``は、GitHubアクションジョブの概要として、post-hookスクリプトの結果と動的テーブルの更新出力の自然言語による要約を生成します。
これらのサンプルワークフローを実行する前に、次の前提条件を完了してください。
|dcm-object|ファイルをGitリポジトリに保存します。
ユーザーにGitHubアクションを作成および実行する権限を付与します。
Snowflakeサービスユーザーの認証情報(
SNOWFLAKE_USER、SNOWFLAKE_PASSWORD、または個人アクセストークン)用のGitHubシークレットを構成します。|dcm-object|フォルダーへのパス(
DCM_PROJECT_PATH)用のGitHub変数を構成します。各マニフェストターゲット(
DCM_STAGE、``DCM_PROD_US``など)のGitHub環境を構成します。
GitHubアクションでのSnowflake接続の設定については、ブログ投稿、`GitHubアクションCI/CD実践ガイド<https://medium.com/@uche.nkadi/automate-your-dbt-project-on-snowflake-a-practical-guide-to-github-actions-ci-cd-a366b6e061e5>`_の前半を参照してください。
|dcm|のCI/CDライフサイクル全体をカバーする一連のGitHubアクションワークフローについては、`snowflake-labs DCMリポジトリ<https://github.com/Snowflake-Labs/snowflake_dcm_projects/GitHub_workflows>`_を参照してください。
すべてのサンプルワークフローは、環境固有の構成が重複するGitHubシークレットではなく、バージョン管理された``manifest.yml``内に保持されるように、``yq``を使用してマニフェストターゲットからSnowflake ``account_identifier``および``project_owner``ロールを直接読み取ります。サービスユーザーの認証情報のみがシークレットとして保存されます。
サンプルワークフロー:接続と権限の検証¶
ワークフロー構成ファイル:DCM_0_Test_Connections.yml
トリガー:``workflow_dispatch``イベントを使用した手動トリガー
このワークフローでは、GitHubアクションのサービスユーザーが、マニフェストで定義されたすべてのターゲット環境に接続できるかどうかを検証します。新しいリポジトリのセットアップ、新しいアカウントのオンボーディング、または認証問題のデバッグ時に使用します。ワークフローでは次の手順を実行します。
サンプルワークフロー:プルリクエストの変更をプレビュー¶
ワークフロー構成ファイル:DCM_1_Test_PR_to_main.yml
トリガー:``main``ブランチに対して開かれた、同期された、または再開されたプルリクエスト
このワークフローは、すべてのプルリクエストの統合テストとして、ステージングおよび本番ターゲットの両方に対してPLANを実行します。これにより、レビュアーは計画された変更の概要をプルリクエスト上で直接確認できます。ワークフローでは次の手順を実行します。
STAGEおよびPRODターゲットに対して``snow dcm plan``を並行して実行する。
``plan_result.json``を解析し、オブジェクトドメインごとにグループ化されたCREATE、ALTER、およびDROP操作を要約する。
後で検査できるようにプランアーティファクトをアップロードする。
両方の環境のプラン概要を含む統合コメントをプルリクエストに投稿する。
いずれかのPLANが失敗した場合にチェックを失敗させ、マージをブロックする。
サンプルワークフロー:ステージおよびProdへの変更のデプロイ¶
ワークフロー構成ファイル:DCM_2_Deploy_to_Stage_and_Prod.yml
トリガー:``main``ブランチへのプッシュ(通常はマージされたプルリクエスト)
このワークフローは、シーケンスプロモーションパイプラインを実装します。変更は最初にステージングにデプロイされ、エンドツーエンドで検証された後にのみ、実稼働にプロモーションされます。いずれかのステージが失敗した場合、パイプラインは停止し、実稼働には影響しません。
ステージデプロイのシーケンス
計画:``snow dcm plan``を実行し、変更セットを要約する。
データドロップ検出:計画出力を解析し、データベース、スキーマ、テーブル、またはステージに対するDROP操作が含まれている場合はパイプラインをブロックする。
デプロイ``snow dcm deploy``を実行する。
Postスクリプト:``snow sql``を使用して、Jinja変数が注入されたオプションのSQL post-hookスクリプトを実行する。
動的テーブルを更新:``snow dcm refresh``を実行して、新しい変換ロジックを適用する。
期待値のテスト:``snow dcm test``を実行して、データ品質の期待値を検証する。
実稼働のデプロイシーケンス:
すべてのステージングジョブに合格した後にのみ、実稼働ターゲットに対して同じ6つのステップが繰り返されます。
すべてのジョブが完了すると、ワークフローは元のプルリクエストに最終的なステータス概要をポストします。
注釈
デプロイワークフローでは``snow cortex complete``を使用して、post-hookスクリプト結果と動的テーブル更新出力の要約を生成します。これは、GitHubアクションジョブの概要に、可読性のある形式で記載されます。
サンプルワークフロー:ステージでの期待値のテスト¶
ワークフロー構成ファイル:DCM_3_Test_STAGE_Expectations.yml
トリガー:``workflow_dispatch``イベントを使用した手動トリガー
このワークフローは、完全なデプロイをトリガーすることなく、ステージング環境でデータ品質を検証するオンデマンドの方法を提供します。手動によるデータ変更やアップストリームデータの更新後における期待値の確認、または定期的な品質チェックとして使用します。ワークフローでは次の手順を実行します。
ステージング|dcm-object|によって管理されるすべての動的テーブルを更新する。
プロジェクト内のテーブル、動的テーブル、およびビューにアタッチされたすべてのデータ品質期待値テストを実行する。
違反した期待値に関する詳細を含む、合格または不合格のステータスをレポートする。
よくある質問(FAQ)¶
- 既存のオブジェクトの名前を変更するにはどうすればよいですか?
DCMプロジェクトの外部でALTERコマンドを実行する。
定義を変更する。
PLANを実行して、新しい定義が新しい状態と一致すること(PLANに変更がないこと)を確認する。
DEPLOYを実行して、新しい状態を保存する。
- DEFINEステートメントでまだサポートされていないオブジェクトをデプロイするにはどうすればよいですか?
DCMプロジェクトの計画またはデプロイを実行した後、別のSQLスクリプトでCREATE IF NOT EXISTSまたはCREATE OR REPLACEステートメントを実行できます。
どちらのオプションも、Jinja2テンプレート化とdry-runをサポートしています(dry-runはJinjaテンプレート化をレンダリングしますが、SQLのコンパイルが成功するかどうかは確認しません)。
例: