|dcm|ファイルとテンプレート

|dcm-object|には、マニフェストファイルと1つ以上のSQLオブジェクト定義ファイルが必要です。これらのファイルは通常、Gitリポジトリまたはローカルワークスペースに保存および管理されます。

  • マニフェストファイル

    • 含めるオブジェクト定義ファイルを指定します。

    • :ref:`テンプレート変数<label-dcm_projects_files_configurations>`を使用して、環境ごとの構成を定義します。

  • オブジェクト定義ファイル

    • |dcm-object|でまとめて管理するSnowflakeオブジェクトのグループを定義します。

|dcm-object|ファイルを作成する大まかなワークフローは次のとおりです。

  1. 定義ファイルを保存する|dcm-object|フォルダーを作成する

  2. マニフェストファイルを作成する

  3. オブジェクト定義ファイルを作成する

定義ファイルを保存する|dcm-object|フォルダーを作成する

新しい|dcm-object|を作成するには、マニフェストファイル(manifest.yml)とSQLオブジェクト定義ファイルを保存するフォルダーを作成します。

snow init <project_name> --template DCM_PROJECT

``DCM_PROJECT``テンプレートを指定した``snow init``コマンドは、プロジェクトディレクトリに定義ファイルの例を作成します。これらのファイルを開いて編集し、|dcm-object|を定義できます。

|dcm|は標準化されたフォルダー構造に従います。

  • |dcm|オブジェクト定義ファイルは:file:`sources/definitions/`の下に配置する必要があります。

  • オプションのグローバルマクロファイルは:file:`sources/macros/`の下に配置できます。

  • これらのプロジェクトディレクトリ内では、ファイルの命名やネストは柔軟に設定できます。

  • DCMコマンドから保存された出力アーティファクトは、常に:file:`out/`に書き込まれます。

  • DCMコマンドに使用する追加のスクリプトやプロジェクトファイルがある場合は、それらを:file:`sources`の下に追加できます(例:dbtプロジェクトファイル)。

  • |dcm|コマンドでの使用やローカルからのアップロードの対象に含めないカスタムスクリプトをプロジェクトフォルダー内に保存したい場合は、:file:`sources`フォルダー外のフォルダーに追加してください。

  • CLIコマンドは、:file:`sources`フォルダー内のファイルのみをアップロードします。

注釈

Gitを使用している場合は、ローカルの出力ファイルがGitにプッシュされないように、:file:`.gitignore`ファイルに:file:`out/`を追加してください。

|dcm-object|フォルダーの構造の例は次のとおりです。

my_dcm_project/
  ├── manifest.yml
  ├── sources/
  │   ├── definitions/
  │   │   ├── bronze.sql
  │   │   └── silver.sql
  │   ├── macros/
  │   │   └── global_macro.sql
  │   └── dbt/
  │       ├── my_dbt_project_1/
  │       └── my_dbt_project_2/
  ├── my_post_scripts/
  └── out/
      └── plan/

マニフェストファイルを作成する

各|dcm-object|には``manifest.yml``ファイルが必要です。これによりプロジェクトの重要な構成の詳細を保持し、プロジェクトフォルダーを|dcm-object|として識別できるようにします。

マニフェストファイルを使用して、異なるターゲット環境にデプロイする際に使用する|dcm-object|オブジェクトとロールを制御し、テンプレート値のセットを管理します。

マニフェストファイルは、次のプロパティを含むYAMLファイルです。

manifest_version: 2
type: DCM_PROJECT
default_target:
targets:
templating:

プロパティ

必須

説明

manifest_version

必須

マニフェストスキーマのバージョン。現在のバージョンは2です。

type

必須

プロジェクトのタイプ。DCM_PROJECT に設定。

default_target

オプション

複数のターゲットがある場合は、デフォルトのターゲットを指定します。``--target``フラグを使用してターゲットを指定しない場合、|sf-cli|とワークスペースはデフォルトのターゲットを使用します。

targets

必須

``targets``セクションは、各デプロイターゲットを特定のSnowflakeアカウント、|dcm-object|オブジェクト、所有者ロール、およびオプションでテンプレート化構成にマップします。このマッピングにより、すべてのCLIコマンドで完全修飾プロジェクト名と構成フラグを渡す必要がなくなります。詳細については、 プロジェクトターゲット をご参照ください。

templating

オプション

``templating``セクションでは、プロジェクトに使用するテンプレート化構成を定義します。詳細については、 プロジェクトのテンプレート化構成 をご参照ください。

プロジェクトターゲット

マニフェストファイルの各ターゲットには、次のプロパティが含まれます。

targets:
  <target_name>:
    account_identifier:
    project_name:
    project_owner:
    templating_config:

プロパティ

説明

account_identifier

このターゲットのSnowflakeアカウント識別子。

アカウントのリージョンとロケーターを検索する をご参照ください。

project_name

|dcm-object|オブジェクトの完全修飾名(例:DCM_DEMO.PROJECTS.DCM_PROJECT_DEV)。

SHOW DCM PROJECTS SQLコマンドを使用して見つけます。

project_owner

このプロジェクトオブジェクトに対するOWNERSHIPを持つロール。

/sql-reference/sql/show-dcm-projects`または:doc:/sql-reference/sql/desc-dcm-project` SQLコマンドを使用して見つけます。

templating_config (オプション)

このターゲットに使用する、``templating``セクションで定義されたテンプレート化構成の名前。

プロジェクト定義とプロジェクトオブジェクト間のマップ

|dcm|定義ファイルは、特定の|dcm-object|オブジェクトに厳密に関連付けられていません。同じ定義セットを使用して、異なるSnowflakeアカウントで、または異なる構成プロファイルを参照することによって、複数のプロジェクトにデプロイできます。たとえば、次の図表に示すように、リポジトリブランチ上の同じ定義ファイルをDEVとPRODの両方のアカウントにデプロイできます。

DCM定義からDCMプロジェクトオブジェクトへ

同様に、異なるパスの定義ファイルを参照して|dcm|オブジェクトを実行できます。たとえば、CI/CD自動化はメインブランチから定義をデプロイでき、同じプロジェクトに対してローカル定義ファイルから手動でPLANを実行して、定義が最新のデプロイからどのように分岐するかを確認できます。このアプローチは、他のブランチやローカルパスからのアドホックな手動デプロイにも使用できます。

プロジェクトのテンプレート化構成

以下は、マニフェストファイル内におけるテンプレート化構成の高レベルの構造です。``defaults``のみ、``configurations``のみ、またはその両方を設定できます。

templating:
  defaults:
    <variable_name>: <value>
  configurations:
    <configuration_name>:
      <variable_name>: <value>

プロパティ

説明

defaults

繰り返しを避けるためにすべての構成に適用される、キーと値のペア形式の共有変数の値。

configurations

プロジェクトに使用するテンプレート化構成。

個別の構成ごとに、構成固有の値でデフォルトを上書きできます。変数の解決方法について詳しくは、:ref:`構成<label-dcm_projects_configurations>`を参照してください。

<configuration_name>

テンプレート化構成の名前。

構成名は大文字と小文字を区別しません。

<variable_name>

変数の名前。

変数名は、`Python変数の命名規則<https://www.w3schools.com/python/python_variables_names.asp>`_に従う必要があります。

プロジェクト定義のすべての変数は、デフォルト、選択した構成、または実行時のいずれかで宣言されている必要があります。

文字列変数を空として解決したい場合は、``""``と指定します。

<value>

変数の値。

値には、文字列、数値、ブール値、リスト、またはディクショナリを使用できます。

ディクショナリはマニフェストで定義できますが、実行時に上書きすることはできません。

例:manifest.yml

以下は、テンプレート変数とそのデフォルト値を含む|dcm-object|マニフェストファイル(manifest.yml)の例です。マニフェストファイルには、DEV、STAGE、PRODの3つの:ref:`構成<label-dcm_projects_files_configurations>`が含まれます。

manifest_version: 2

type: DCM_PROJECT

default_target: DCM_DEV

targets:
  DCM_DEV:
    account_identifier: MYORG-MYACCOUNT_DEV
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_DEV
    project_owner: DCM_DEVELOPER
    templating_config: DEV

  DCM_STAGE:
    account_identifier: MYORG-MYACCOUNT_STAGE
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_STG
    project_owner: DCM_STAGE_DEPLOYER
    templating_config: STAGE

  DCM_PROD:
    account_identifier: MYORG-MYACCOUNT_PROD
    project_name: DCM_DEMO.PROJECTS.DCM_PROJECT_PROD
    project_owner: DCM_PROD_DEPLOYER
    templating_config: PROD

templating:
  defaults:
    user: "GITHUB_ACTIONS_SERVICE_USER"
    wh_size: "SMALL"

  configurations:
    DEV:
      env_suffix: "_DEV"
      user: "INSERT_YOUR_USER"
      wh_size: "X-SMALL"
      teams:
        - name: "DEV_TEAM"
          write_access: TRUE

    STAGE:
      env_suffix: "_STG"
      teams:
        - name: "TEST_TEAM_A"
          write_access: TRUE
        - name: "TEST_TEAM_B"
          write_access: FALSE

    PROD:
      env_suffix: ""
      teams:
        - name: "Marketing"
          write_access: FALSE
        - name: "Finance"
          write_access: FALSE
          wh_size: "LARGE"
        - name: "HR"
          write_access: FALSE
        - name: "IT"
          write_access: TRUE

オブジェクト定義ファイルを作成する

|dcm-object|定義ファイルは、Snowflakeオブジェクトを管理するための有効なSQLステートメントに解決されるテンプレートです。各|dcm-object|には少なくとも1つの定義ファイルが必要です。

オブジェクト定義や付与を、複数のファイルやフォルダーに整理できます。Snowflakeでは、オブジェクトの種類ごとにグループ化するのではなく、プロジェクトのビジネスロジックを表す構造(たとえば、ブロンズ、シルバー、ゴールドなど)を選択することをお勧めします。

定義ファイルには、DEFINE、GRANT、またはATTACHステートメントのみを含めることができます。その他のSQLコマンドはサポートされていません。

|dcm|をすぐに使い始めるには、既存のDDLsに対してDEFINEキーワードを使用することで、既存のSQLデプロイスクリプトを変換できます(サポートされているオブジェクト型の場合)。

DEFINEステートメントは:doc:`/sql-reference/sql/create-or-alter`コマンドと同様に機能しますが、次の重要な違いがあります。

  • DEFINEステートメントの順序とロケーションは関係ありません。Snowflakeは、プロジェクトの実行中に、すべての定義ファイルからすべてのステートメントを収集し、ソートします。

  • DEFINEステートメントを削除すると、次回プロジェクトをデプロイしたときに、Snowflakeは対応するオブジェクトをドロップします。

  • Snowflakeオブジェクトのサブセットのみがサポートされています。詳細については、 |dcm|でサポートされているオブジェクト型 をご参照ください。

  • すべてのオブジェクトは、``database.schema.object_name``の形式で完全修飾名で定義する必要があります。

定義ファイルにはさまざまな:ref:`Jinja2テンプレート化<label-dcm_projects_templating>`オプションを含めることができ、高度なテンプレート機能をサポートしているため、次の操作を実行できます。

  • テンプレート変数を使用して、実行時にファイルの内容をカスタマイズします。

  • ループや条件分岐などのロジックに、Jinja2構文を使用します。

  • 定義ファイルを再利用可能にし、さまざまなシナリオに適応できるようにします。

オブジェクト定義のテンプレート化

|dcm|は、SQLステートメントをテンプレート化するためにJinja2フレームワークをサポートしています。構成プロファイル、:doc:`/sql-reference/sql/execute-dcm-project`コマンド、またはJinja内のいずれからでも、Jinja2構文を使用して変数を宣言し、値を割り当てることができます。値のリストを用いたループ、caseステートメント、再利用可能な関数などを構築することもできます。詳しくは、`Jinja2のドキュメント<https://jinja.palletsprojects.com/en/stable/>`_を参照してください。

サポートされているJinja2の機能には次が含まれます。

  • 文字列置換

  • リスト

  • ディクショナリとネストされたディクショナリ

  • 条件(IFステートメント)

  • ループ

  • グローバルマクロとファイル内マクロ

    • ``sources/macros``フォルダーで定義されたマクロは、すべての定義ファイルで使用できます。

    • ファイル内で定義されたマクロは、そのファイル内で使用できます。

サポートされていないJinja2の機能には次が含まれます。

注釈

`_snow`識別子は将来の使用のために予約されているため、変数またはマクロ名として使用できません

重要

機密情報や認証情報を含むオブジェクト定義には、|dcm|テンプレート化変数を使用しないでください。レンダリングされたSQL定義では、環境変数によって挿入された値がマスキングされません。

同様に、Snowflakeサービスを使用する場合、個人データ、機密データ、輸出管理データ、またはその他の規制されたデータを、ファイル名、構成名、変数名などのメタデータとして入力しないでください。詳しくは、`Snowflakeのメタデータフィールド<https://docs.snowflake.com/en/sql-reference/metadata>`_を参照してください。

以下は、Jinja2テンプレート化を使用する|dcm-object|定義ファイルの例です。

DEFINE WAREHOUSE DCM_PROJECT_WH_{{db}}
  WITH
    warehouse_size = '{{wh_size}}'
    auto_suspend = 300;

以下は、2つの構成(DEVおよびPROD)を定義する|dcm-object|マニフェストファイル(manifest.yml)の例です。

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

(ターゲットの``templating_config``を通じて自動的に、または実行時に選択された)DEV構成でこのウェアハウスの定義をレンダリングすると、次のように解決されます。

DEFINE WAREHOUSE DCM_PROJECT_WH_DEV_2
  WITH
    warehouse_size = "X-SMALL"
    auto_suspend = 300;

マクロ

マクロファイルは、:file:`macros`フォルダーとそのサブフォルダーにある任意のSQLファイルです。これらにはマクロのみを含めることができます。

マクロファイルを含む|dcm-object|のディレクトリ構造の例は次のとおりです。

My_dcm_project
 |_ manifest.yml
 |_ sources
    |_ definitions
       |_ my_definitions.sql
    |_ macros
       |_ my_global_macros.sql

通常のプログラミング言語の関数と同様に、マクロはよく使用されるコードを再利用可能な関数に整理し、反復を避けてDRY(Don't Repeat Yourself)原則に従うのに役立ちます。|dcm|のマクロは、次の例外を除いて、`Jinja2マクロ<https://jinja.palletsprojects.com/en/stable/templates/#macros>`_と同じように機能します。

  • :file:`macros`フォルダー内のマクロファイルの専用場所に配置されます。

  • マクロファイルで定義されたマクロは、他のソースファイルで自動的に表示されます。Jinjaの`import<https://jinja.palletsprojects.com/en/stable/templates/#import>`_タグの使用は許可されていません。

  • 同じ名前のマクロの重複定義は検出され、拒否されます。

グローバルマクロの自動インポート

定義ファイルのレンダリングプロセス中、ソースファイルは潜在的なマクロ呼び出しについてスキャンされます。呼び出されたマクロがマクロファイルで定義されている場合、暗黙的な`from [...] importタグ<https://jinja.palletsprojects.com/en/stable/templates/#import>`_が自動的に追加されるため、明示的なインポートは必要ありません。

`Jinja2マクロ<https://jinja.palletsprojects.com/en/stable/templates/#macros>`_と同様に、アンダースコアを前に付けることでローカルマクロを定義できます。ローカルマクロは、宣言されているファイルでのみ使用でき、他のファイルには表示されません。

テンプレートコメント

SQLコマンドでは、コードの前に``--``を追加して行をコメントアウトできます。Jinjaは引き続きSQLコード内の変数を処理しますが、SQLコメントは残します。

たとえば、次のJinjaコードは、

-- hello {{ project_owner_role }}

次のようにレンダリングされます。

-- hello DCM_DEVELOPER

コメントアウトされたコマンドはSQLでは実行されません。テンプレートコメントを使用すると、SQLコードに影響を与えずにJinjaテンプレートをデバッグできます。

次の例に示すように、レンダリング時にJinjaコードを無視するには、開始括弧と終了括弧の内側に``#``を追加します。

{# This Jinja comment will not appear in the rendered output. #}

構成

オブジェクト定義でテンプレートを使用する場合には、以下のオプションがあります。

  • 実行時、変数に値を割り当てる。

  • manifest.yml`の``templating: configurations:``でさまざまな構成プロファイルを定義する。各ターゲットは``templating_config``を通じて構成を参照できます。詳細については、 :ref:`label-dcm_projects_files_configurations をご参照ください。

    構成プロファイルが定義され、ターゲットが``templating_config``を通して1つを参照する場合、そのターゲットを使用すると構成が自動的に適用されます。例については、 |dcm-object|の計画 をご参照ください。

    |dcm|の構成プロファイルの主な使用例は、異なる環境をターゲットにすることです。構成プロファイルでは、次を実行できます。

    • 同じコードを複数の環境にデプロイできます。

    • 本番コードを非本番環境において小規模にテストできます。

    • 同じアカウントで複数の分離された環境を維持できます。

    すべてのテンプレート化構成をターゲットプロファイルから参照させる必要はありません。未使用の構成を維持したまま、ターゲットのテンプレート化構成をあるものから別のものに切り替えることができます。

  • 構成間で共通の変数の繰り返しを回避するために、``templating: defaults:``で共有デフォルト値を定義します。詳細については、 プロジェクトのテンプレート化構成 をご参照ください。

  • CLIの``--variable``フラグを使用して、実行時に特定の変数を1回限りの値で上書きします。

変数は、グローバルデフォルト < 構成変数 < ランタイム実行変数という3つの階層で解決されます。

辞書

|dcm|テンプレート化は、変数値としてのディクショナリをサポートし、複雑なマルチテナントまたはマルチリソースデプロイメントのための構造化された構成を可能にします。

関連する構成の詳細をディクショナリにグループ化すると、次のような利点があります。

  • きめ細かな制御:バリエーションごとに一意のロジックを記述することなく、個々のリソースにウェアハウスのサイズ、保持ポリシー、付与などの特定の設定を適用できます。

  • よりクリーンなコードベース:反復的なハードコードされたスクリプトを、構成に基づいて適応する動的ループに置き換えることができます。

  • スケーラビリティ:デプロイメントパイプラインをリファクタリングするのではなく、構成にエントリを追加して、新しいチームやリソースをオンボーディングします。

注釈

ディクショナリはマニフェストで定義できますが、実行時に``--variable``フラグまたはSQL``USING CONFIGURATION (...)``オーバーライドを使用して上書きすることはできません。実行時に上書きできるのはスカラー値とリストのみです。

ディクショナリの使用例:マルチテナント環境のプロビジョニング

マーケティング、財務、HRなど、コンプライアンスやコンピューティング要件が異なる複数の部門で共有されているプラットフォームを想定してみましょう。ディクショナリを使用して、各チームのニーズを反映した単一の構成を定義できます。

マニフェストの例:

templating:
  defaults:
    user: "GITHUB_ACTIONS_SERVICE_USER"
    wh_size: "X-SMALL"
  configurations:
    PROD:
      env_suffix: ""
      project_owner_role: "DCM_PROD_DEPLOYER"
      teams:
        - name: "Marketing"
          wh_size: "MEDIUM"
          data_retention_days: 14
          needs_sandbox_schema: true
        - name: "Finance"
          wh_size: "X-LARGE"
          data_retention_days: 90
          needs_sandbox_schema: false
        - name: "HR"
          data_retention_days: 30
          needs_sandbox_schema: false

定義例:

SQLテンプレートは、このディクショナリをループします。スキーマを自動的に作成し、適切な保持ポリシーを割り当て、リクエストしたチームに対してのみ追加のリソースを条件付きで作成します。

-- loop through team dictionaries
{% for team in teams %}
    {% set team_name = team.name | upper %}

    -- inject dictionary values directly into object properties
    define schema DCM_DEMO_1{{env_suffix}}.{{team_name}}
        comment = 'using JINJA dictionary values'
        data_retention_time_in_days = {{ team.data_retention_days }};

    -- pass the name to your macro
    {{ create_team_roles(team_name) }}

    define table DCM_DEMO_1{{env_suffix}}.{{team_name}}.PRODUCTS(
        ITEM_NAME varchar,
        ITEM_ID varchar,
        ITEM_CATEGORY array
    )
    data_metric_schedule = 'TRIGGER_ON_CHANGES';

    {% if team_name == 'HR' %}
        define table DCM_DEMO_1{{env_suffix}}.{{team_name}}.EMPLOYEES(
            NAME varchar,
            ID int
        )
        comment = 'This table is only created in HR';
    {% endif %}

    -- use dictionary booleans to deploy optional infrastructure
    {% if team.needs_sandbox_schema | default(false) %}
        define schema DCM_DEMO_1{{env_suffix}}.{{team_name}}_SANDBOX
            comment = 'Sandbox schema defined via dictionary flag'
            data_retention_time_in_days = 1;
    {% endif %}

{% endfor %}