外部リネージ

外部リネージにより、Snowflakeの ネイティブリネージ に外部データソースと宛先を含めて、データエコシステム全体のデータフローを可視化します。外部ETLツールおよびソースデータベースからのリネージをキャプチャし、データパイプラインを介してデータが移動する方法の統一ビューを作成します。

OpenLineage は、多様なデータツールとプラットフォーム間でデータリネージ情報をキャプチャおよび共有するためのオープン標準です。Snowflakeは、RESTエンドポイントを通じてOpenLineage互換イベントを受け入れることで、このフレームワークを活用します。dbtやApache Airflowのような外部ツールは、エンドポイントを使用して系統メタデータをSnowflakeに送信し、この情報を Snowsight で表示されるネイティブのリネージグラフに組み込むことができます。

外部リネージRESTエンドポイント
/api/v2/lineage/external-lineage
Copy
RESTエンドポイント用SnowflakeベースURL
https://<account_identifier>.snowflakecomputing.com
Copy

ここで、 account-identifier はSnowflakeアカウントの アカウント識別子 です。アカウント識別子には、アカウント名形式またはアカウントロケーター形式のいずれかを使用できます。

例えば、アカウント識別子が myorg-dev_account の場合は、外部リネージエンドポイントのベースURLは https://myorg-dev_account.snowflakecomputing.com です。

外部リネージワークフロー

データツールの外部リネージの実装は以下のタスクで構成されます。

  1. 外部リネージエンドポイントで認証するユーザーに対して 必要な権限の付与します

  2. OpenLineageイベントをSnowflakeRESTエンドポイントに送信するために データツールを構成します

  3. Snowflake REST APIsに対して動作する 認証方法を選択 を選択し、次に、外部リネージエンドポイントへのリクエストを認証するためにそれを使用するようにデータツールを構成します。

  4. 通常どおりデータツールを使用します。OpenLineageイベントは自動的にSnowflakeに送信され、 Snowsight のネイティブリネージグラフに表示されます。

OpenLineageイベントを出力するデータツールを構成する前に、外部リネージエンドポイントをテストしたい場合、 手動リクエストを送信してリネージを確立する をご参照ください。

データリネージを表示する

Snowsight でデータリネージを表示するにはの場合は、次の手順を完了します。

  1. :ref:`に必要な権限 <label-lineage_privileges>`で|sf-web-interface-link| にサインインします。

  2. ナビゲーションメニューで、Catalog » Database Explorer`を選択し、次にテーブルやビューなど :ref:`サポートされるオブジェクト <label-ui_lineage_supported_objects> を選択します。

  3. Lineage タブを選択します。

データツールがSnowflakeにリネージ情報を送信すると、外部オブジェクトが Snowsight リネージグラフに表示され、外部ノードとしてラベル付けされます。例:

外部オブジェクトを使用したSnowsightリネージグラフ

外部オブジェクトやオブジェクトを接続しているラインを選択すると、ネイティブリネージの場合と同様に追加情報を取得できます。

Snowflake権限を付与する

RESTリクエストが 認証された 後、Snowflakeは、リクエストに関連付けられたユーザーが外部リネージの使用を承認されているかどうかを確認します。リクエストに関連付けられたユーザーは、アカウントに対するINGEST LINEAGE権限を付与されたロールを持っている必要があります。

例えば、サービスユーザー dbt_integration_user から送信されたリクエストを Snowsight リネージに表示したい場合を考えます。管理者として、以下のコマンドを実行して専用ロールを作成し、必要な権限を付与し、そのロールをユーザーに付与します。

CREATE ROLE dbt_lineage_role;
GRANT INGEST LINEAGE ON ACCOUNT TO ROLE dbt_lineage_role;
GRANT ROLE dbt_lineage_role TO USER dbt_integration_user;
Copy

データツールを構成する

注釈

OpenLineage統合を持つ任意のデータツールを、リネージデータをSnowflakeに送信するように構成できます。統合を持つツールの完全なリストについては、 OpenLineage 統合 をご参照ください。

以下のセクションでは、dbtとApache AirFlowで外部リネージを使用するための基本的な手順を説明します。

リネージデータをSnowflakeに送信するようにdbtを構成する

注釈

OpenLineageイベントを出力するためのdbtの構成は、Snowflakeに固有のものではありません。Snowflakeに固有のものは、外部リネージのエンドポイントとベースURLのみです。

以下のステップでは、dbt環境をセットアップするために必要な最小限の構成を提供します。OpenLineage dbtドキュメント および OpenLineage 仕様 を参照して、OpenLineage-dbt統合を構成してください。

  1. OpenLineage-dbt統合 をインストールします。

    pip3 install openlineage-dbt
    
    Copy
  2. トランスポート変数を設定して、外部リネージの ベース URLエンドポイント 、および セキュリティトークン を指定します。

    例えば、アカウントのアカウント識別子が MYORG-DEV_ACCOUNT の場合、YAML 構成ファイルで次のコードを定義します。

    transport:
       type: http
       url: https://MYORG-DEV_ACCOUNT.snowflakecomputing.com
       endpoint: /api/v2/lineage/external-lineage
       auth:
          type: api_key
          apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
       compression: gzip
    
    Copy
  3. dbt コマンドを dbt-ol に置き換えます。例えば、 dbt run コマンドを dbt-ol run に変更します。

    これらの dbt-ol コマンドは OpenLineage-dbt統合に必要とされ、Snowflake固有のものではありません。

変数を設定する他の方法を含むOpenLineage-dpt統合の詳細については、 OpenLineagedbtドキュメント をご参照ください。

リネージデータをSnowflakeに送信するようにAirflowを構成する

注釈

OpenLineageイベントを出力するためのApache Airflowの構成は、Snowflakeに固有のものではありません。Snowflakeに固有のものは、外部リネージのエンドポイントとベースURLのみです。

次のステップは、OpenLineageの優先バージョンであるAirflowバージョン2.7+用のAirflow環境を設定するために必要な最小構成を提供します。OpenLineage Airflowドキュメント および OpenLineage 仕様 を参照して、OpenLineage-Airflow統合を構成してください。

  1. OpenLineage Airflow統合 バージョン2.7+のインストール:

    pip install apache-airflow-providers-openlineage
    
    Copy

    Airflowの古いバージョンを使用している場合は、代わりに openlineage-airflow をインストールしてください。

  2. トランスポート変数を設定して、外部リネージの ベース URLエンドポイント 、および セキュリティトークン を指定します。

    例えば、アカウントのアカウント識別子が MYORG-DEV_ACCOUNT の場合、YAML 構成ファイルで次のコードを定義します。

    transport:
       type: http
       url: https://MYORG-DEV_ACCOUNT.snowflakecomputing.com
       endpoint: /api/v2/lineage/external-lineage
       auth:
          type: api_key
          apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
       compression: gzip
    
    Copy

変数を設定する他の方法を含むOpenLineage-Airflow統合の詳細については、 OpenLineage Airflowドキュメント を参照してください。

認証方法を選択する

Snowflakeは、外部リネージで使用されるものと同様に、SnowflakeRESTエンドポイントへのリクエストを認証する複数の方法を提供します。認証方法の完全なリストについては、 Snowflakeでの Snowflake REST APIs 認証 をご参照ください。

希望する認証方法を選択した後、特定のユーザーのセキュリティトークンを生成する必要があります。トークンは、ユーザーをRESTリクエストに関連付けるために使用され、Snowflakeがユーザーを認証し、ユーザーが 外部リネージの使用を許可済み であることを確認できるようにします。

Snowflakeでセキュリティトークンにユーザーを正常に関連付けた後、このトークンでリクエストを認証するようにデータツールを構成する必要があります。例えば、YAML構成ファイルを使用してOpenLineageトランスポート変数を設定する場合は、次のコードを使用して、リクエストの ヘッダーで送信されるセキュリティトークンを指定します。

transport:
   auth:
      type: api_key
      apiKey: eyJ0eXAiOiJKV1QiLsecuritytoken...
Copy

セキュリティトークンを指定する他の方法については、データツールのOpenLineageドキュメントをご参照ください。

手動リクエストを送信してリネージを確立する

外部リネージは、COMPLETEイベントのOpenLineageに準拠するJSONペイロード仕様を受け入れることで機能します。データツールと統合すると、ツールはこれらのCOMPLETEイベントを出力します。ただし、COMPLETEイベントを構築し、エンドポイントにPOSTリクエストを送信できるツールまたは言語を使用して、エンドポイントに送信することもできます。

有効なリクエストは、次のメソッド、 ベースURL 、および エンドポイント で構成されます。

POST https://<account_identifier>.snowflakecomputing.com/api/v2/lineage/external-lineage
Copy

ここで、 account_identifier はSnowflakeアカウントの アカウント識別子 です。

次の例は、curlを使用してリネージ情報を外部リネージに送信する方法を示しています。

curl -i -X POST \
 -H "Content-Type: application/json" \
 -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLsecuritytoken..." \
 -H "Accept: application/json" \
 -H "User-Agent: myApplicationName/1.0" \
 -H "X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT" \
 -d "@request_body.json" \
 "https://MYORG-DEV_ACCOUNT.snowflakecomputing.com/api/v2/lineage/external-lineage"
Copy

ここで、 request_body.json はCOMPLETEイベントのOpenLineage仕様に準拠します。このJSONペイロードの詳細については、 ペイロード要件 をご参照ください。

手動リクエストの認証と承認

外部リネージエンドポイントに送信される手動リクエストの認証と承認は、データツールから送信されるリクエストと同じです。

  • リクエストのヘッダーには、Snowflake RESTエンドポイントでサポートされる 認証の形式 の、次のいずれかのセキュリティトークンが含まれている必要があります。

  • セキュリティトークンに関連付けられたユーザーは、 適切な権限 を持っている必要があります。

ペイロード要件

手動リクエストのJSONペイロードを外部リネージエンドポイントに送信する場合、ペイロードは以下の要件を満たしている必要があります。

  • OpenLineage 仕様 に準拠している必要があります。

  • COMPLETEイベントである必要があります。つまり、 eventType プロパティは COMPLETE である必要があります。他のタイプのイベントは無視されます。

  • inputs プロパティおよび outputs プロパティはSnowflakeと外部オブジェクトの組み合わせである必要があります。外部リネージを使用して、2つの外部オブジェクト間または2つのSnowflakeオブジェクト間のリネージを確立することはできません。両方のプロパティが同じタイプのオブジェクト(Snowflakeまたは外部)を指定している場合、リクエストは404 HTTPステータスコードを返します。

  • 次のプロパティを含める必要があります。

    • inputs

    • outputs

    • eventType

    • eventTime

    • job

    オプションで、ジョブの識別に役立つ run プロパティを含めることができます。ペイロードには追加のプロパティを含めることができますが、Snowflakeはそれらを無視します。

最小ペイロードの例

次の例は、外部リネージエンドポイントに送信できる最小限のペイロードを示しています。

{
   "eventType": "COMPLETE",
   "eventTime": "2025-03-12T06:51:12.000Z",
   "job": {"namespace": "exampleNamespace", "name": "exampleJob"},
   "run": {"runId": "123e4567-e89b-12d3-a456-426614174000"},
   "producer": "https://github.com/OpenLineage/OpenLineage/blob/v1-0-0/client",
   "schemaURL": "https://openlineage.io/spec/0-0-1/OpenLineage.json",
   "inputs": [{"namespace": "snowflake://AXORG-AX_TEST_PP8", "name": "OL_TEST.OL_TEST_SCH.TEST_DEMO"}],
   "outputs": [{"namespace": "postgres://localhost:5432", "name": "PDB.SCH.OUTPUT"}]
}
Copy

オブジェクト型の指定

ペイロードの outputs 配列では、 facets フィールドを使用して、任意のユーザー定義の文字列のオブジェクトの型を指定することができます。例えば、次のペイロードのスニペットは、オブジェクトのタイプがVIEWであることを指定します。

"outputs": [
    {
        "namespace": "postgres://db.company.com:5432",
        "name": "db.schema.view",
        "facets": {"datasetType": {"datasetType": "VIEW"}},
    },
],
Copy

facets フィールドを指定しない場合、オブジェクトの型はデフォルトで External Node になります。

複数の入力の指定

ペイロードに複数の入力が含まれている場合、結果のリネージは出力を両方の入力の下流オブジェクトとして表示します。たとえば、ペイロードに入力AとBがあり、出力Cもある場合、リネージはACとBCの両方を表示します。

リネージの削除をリクエストする

Snowflakeオブジェクトと外部オブジェクトの間に確立されたリネージを削除するために、外部リネージエンドポイントにDELETEリクエストを送信できます。

  • ソースオブジェクトとターゲットオブジェクト間のリネージを分けるには、URLクエリパラメーターを使用して、2つのオブジェクトに関する詳細を指定します。

  • オブジェクトとその下流のすべてのオブジェクトの間でリネージを分割するには、ターゲットオブジェクトを指定せずにソースオブジェクトを指定します。

  • 上流にあるオブジェクトの数に関係なく、リネージグラフからターゲットオブジェクトを削除するには、ソースオブジェクトを指定せずにターゲットオブジェクトを指定します。

リネージを削除する有効なリクエストは、次のメソッド、 ベースURL 、および エンドポイント で構成されます。

DELETE https://<account_identifier>.snowflakecomputing.com/api/v2/lineage/external-lineage
Copy

クエリパラメーター

説明

sourceNamespace={namespace}

ソースデータセットの名前空間。

sourceName={FQN}

ソースデータセットの完全修飾名。

sourceDatasetType={dataset type}

ソースデータセットの型(例: TABLE、VIEW、DATASET)。デフォルトでは、値は外部ノードである必要があります。リネージ確立のリクエストを送信したときに、ペイロードの facets フィールドに値を指定した場合、外部ノードではなく、ペイロードで送信した値を指定します。

targetNamespace={namespace}

ターゲットデータセットの名前空間。

targetName={FQN}

ターゲットデータセットの完全修飾名。

targetDatasetType={dataset type}

ターゲットデータセットの型(例: TABLE、VIEW、DATASET)。 デフォルトでは、値は外部ノードである必要があります。リネージ確立のリクエストを送信したときに、ペイロードの facets フィールドに値を指定した場合、外部ノードではなく、ペイロードで送信した値を指定します。

系列を削除するためのアクセス制御

オブジェクト間のリネージを削除するリクエストを送信するユーザーは、アカウントに対するDELETE LINEAGE権限を持っている必要があります。

制限と考慮事項

  • Snowflakeオブジェクトは、COMPLETEイベントのINPUTまたはOUTPUTのいずれかである必要があります。つまり、入力データも出力データもSnowflakeオブジェクトでない場合、外部リネージイベントはリネージイベントをインジェストしません。

  • SnowflakeはOpenLineageバージョン2をサポートしていません。

  • 外部リネージイベントの保持期間は1年間です。

  • SnowflakeはCOMPLETEリネージイベントのみを認識します。データツールによって発行された他のすべてのイベントは無視されます。

  • 外部ソースのリネージは、GET_LINEAGE関数の出力に表示されません。

  • 外部リネージは列のリネージをサポートしていません。

  • データセットの完全修飾名 --- つまり、入力または出力 --- は1000文字を超えることはできません。

  • 同じアカウントに10,000個を超えるイベントを保存することはできません。この制限に達すると、新しいイベントを追加する前にイベントを削除する必要があります。