注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Foundry を Snowflake に接続して、Snowflake と Foundry の間でデータを読み取り、同期します。
Snowflake を Foundry の Iceberg カタログに接続することもできます。これにより、Snowflake は Apache Iceberg REST カタログ統合を通じて、Foundry が管理する Iceberg テーブルを直接読み書きできます。セットアップ手順については、Foundry の Iceberg カタログを Snowflake に接続するを参照してください。
| 機能 | ステータス |
|---|---|
| 探索 | 🟢 一般提供 |
| 一括インポート | 🟢 一般提供 |
| インクリメンタル(差分連携) | 🟢 一般提供 |
| Iceberg 同期 | 🟢 一般提供 |
| 仮想テーブル | 🟢 一般提供 |
| コンピュートプッシュダウン | 🟢 一般提供 |
| エクスポートタスク | 🟡 サンセット |
| テーブルエクスポート | 🟢 一般提供 |
Foundry でのコネクターのセットアップについて詳しくはこちら。
アンダースコア(_)を含む Snowflake アカウントでは、アンダースコアをダッシュ(-)に置き換えることが必須です。たとえば、my_account_prod は my-account-prod にする必要があります。置き換えないと、ネットワークの問題が発生します。
| オプション | 必須? | 説明 |
|---|---|---|
| アカウント識別子 | はい | 「.snowflakecomputing.com」の前に付く識別子です。詳細については、Snowflake の公式ドキュメント ↗を参照してください。 |
| ロール | いいえ | 指定した資格情報で複数のロールにアクセスできる場合に、接続で使用するデフォルトロールです。 |
| データベース | はい | 接続後に使用するデフォルトのデータベースを指定します。 |
| スキーマ | いいえ | 接続後に使用するデフォルトのスキーマを指定するオプションです。値を指定しない場合は、資格情報でアクセスできるすべてのスキーマが利用可能になります。 |
| ウェアハウス | いいえ* | 接続後に使用する仮想ウェアハウスです。登録済みの仮想テーブルの場合、ソース側のすべての計算に使用されます。 |
| 資格情報 | はい | 詳細については、以下の認証セクションを参照してください。 |
| ネットワーク接続 | はい | 詳細については、以下のネットワークセクションを参照してください。 |
* ウェアハウス情報は、Foundry データセットの同期では任意ですが、仮想テーブルの登録では必須です。
Snowflake では、次の方法で認証できます。
| 方法 | 説明 | ドキュメント |
|---|---|---|
| ユーザー名とパスワード [レガシー] | ユーザー名とパスワードを使用してユーザーアカウントで認証します。基本認証はレガシーであり、本番環境では推奨されません。 | パスワードの使用 ↗ |
| キーペア認証 | ユーザー名と秘密鍵を指定します。暗号化されていない秘密鍵のみがサポートされます。Foundry は秘密鍵を暗号化し、安全に保存します。 | キーペア認証とキーペアローテーション ↗ |
| 外部 OAuth (OIDC) [推奨] | ワークロード ID フェデレーションを使用してユーザーとして認証します。ワークロード ID フェデレーションにより、Foundry で実行されるワークロードは Snowflake のシークレットを必要とせずに Snowflake にアクセスできます。表示されるソースシステムの設定手順に従って、外部 OAuth をセットアップします。 | ワークロード ID フェデレーション ↗ Foundry での OpenID Connect (OIDC) のサポートの概要については、OIDC ドキュメントを参照してください。 |
| 外部 IDプロバイダー OAuth | OAuth2 クライアント資格情報フローを通じて、外部 IDプロバイダー(Entra ID、Okta、PingFederate など)を使用して認証します。接続を確立するには、トークンエンドポイント、クライアントID、クライアントシークレット、OAuth スコープ、ユーザークレームを設定します。この方法は、Snowflake の資格情報を直接使用するのではなく、外部プロバイダーを通じて属性を管理する組織に適しています。 | 外部 OAuth の概要 ↗ |
| プログラム アクセス トークン | プログラム アクセス トークンを使用してユーザーとして認証します。 | プログラム アクセス トークン ↗ |
すべての認証オプションで、指定したユーザーとロールが、対象のデータベースとスキーマに対する使用権限、および対象のテーブルに対する選択権限を持っていることを確認してください。
仮想テーブルを登録する場合は、ユーザーとそのロールにウェアハウスの使用権限も必要です。
Snowflake は、パスワードを使用する人間のユーザーに多要素認証(MFA)を必須とし、すべてのサービスユーザーでパスワードを禁止する変更を順次導入しています。そのため、ユーザー名とパスワードは適切な認証方式ではなくなります。追加情報および移行に関するガイダンスについては、Snowflake の公式ドキュメント ↗を参照してください。
Foundry ワーカーで実行される接続では、Data Connection アプリケーションでソースをセットアップする際に、適切なエグレスポリシーを適用する必要があります。
許可リストに追加する Snowflake アカウントのホスト名とポート番号を特定するには、Snowflake コンソールで次のコマンドを実行できます。少なくとも SNOWFLAKE_DEPLOYMENT と STAGE のエントリーが Foundry にエグレスポリシーとして追加されていることを確認してください。
Copied!1 2 3 4SELECT t.VALUE:type::VARCHAR as type, t.VALUE:host::VARCHAR as host, t.VALUE:port as port FROM TABLE(FLATTEN(input => PARSE_JSON(SYSTEM$ALLOWLIST()))) AS t;
許可リストに追加するホスト名とポート番号の特定について詳しくは、Snowflake の公式ドキュメント ↗を参照してください。
Foundry から Snowflake への接続は通常、環境のデフォルトのパブリックゲートウェイ IP から行われます。ただし、同じクラウドプロバイダー内のトラフィック(たとえば、AWS-AWS または Azure-Azure)では、異なるルーティングが使用され、PrivateLink 経由の接続を確立する必要がある場合があります。クラウドプロバイダーごとに必要な追加のセットアップについては、以下を参照するか、Palantir 担当者にお問い合わせください。
Snowflake インスタンスが内部 S3 ステージのトラフィックを VPCE ↗ 経由でルーティングするように設定されている場合は、カスタム VPCE ドメインを使用しないように Snowflake JDBC ドライバーを手動で設定する必要があります。そうしないと、ドライバーはカスタム VPCE ドメイン(Foundry の VPC からはアクセスできません)にルーティングされ、<bucketname>.bucket.vpce-<vpceid>.s3.<region>.vpce.amazonaws.com 形式の URL への接続に失敗します。
この設定は、インスタンスの接続情報で JDBC 接続プロパティを追加し、キーを S3_STAGE_VPCE_DNS_NAME、値の項目を空欄(null に設定することに相当)にすることで、手動で行えます。
これにより、S3 ステージのトラフィックは AWS S3 Gateway Endpoint(<bucketname>.bucket.s3.<region>.vpce.amazonaws.com)経由でルーティングされます。このエンドポイントはプライベート接続を維持するため、トラフィックがパブリックインターネット経由でルーティングされることはありません。
詳しくは、PrivateLink エグレスのドキュメント ↗を参照してください。
Foundry インスタンスと同じリージョンの S3 バケットに依存するエグレスポリシーについては、対象のバケットに対して、Amazon S3 バケットポリシーのドキュメントに記載されている追加の設定手順を完了していることを確認してください。
Foundry の Snowflake コネクターで使用される Snowflake JDBC ドライバーは、データを取得する際に、基盤となる「内部ステージ」のストレージバケットに直接接続を試みる場合があります。Azure でホストされる Snowflake では、Azure でホストされる Foundry エンロールメントが Azure サービスエンドポイント経由でトラフィックをルーティングするため、以下の手順に従って、Foundry から基盤となるステージバケットへのネットワーク接続を明示的に許可リストに追加する必要があります。
Foundry へのネットワーク接続を確立するには、Azure でホストされる Snowflake ウェアハウスに関する次の情報が必要です。
SYSTEM$ALLOWLIST コマンドを使用して、接続を成功させるために必要となる可能性のあるドメインの完全なリストを取得します。
SYSTEM$ALLOWLIST コマンドで返された Azure ストレージバケットについては、ストレージアカウント識別子も取得する必要があります。
ENABLE_INTERNAL_STAGES_PRIVATELINK ↗ パラメーターを TRUE に設定します。SYSTEM$GET_PRIVATELINK_CONFIG() ↗ 関数を呼び出します。この関数は、Azure ストレージアカウントのリソース識別子を含む privatelink-internal-stage というフィールドを返します。
Azure Storage アカウントの完全なリソース識別子は、次の形式になります。
/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}
Azure コンソールで Azure Storage アカウントのリソース ID を直接確認する方法について詳しくは、Azure ドキュメント ↗を参照してください。VNET ルールとストレージアカウント識別子を使用してアカウント間のネットワークトラフィックを制限することは、Microsoft が公開しているベストプラクティス ↗に沿った方法です。Azure コンピューティングインスタンス内から、Azure でホストされる Snowflake ウェアハウスへのすべての接続で使用することを推奨します。
Snowflake ウェアハウスに関する必要な情報を収集したら、Foundry が Snowflake データにアクセスできるようにするために必要なポリシーを作成できます。
Azure ストレージの内部ステージ用に標準のエグレスポリシーを作成し、Snowflake ソースにアタッチします。
SYSTEM$ALLOWLIST コマンドで返されたすべての項目に対してポリシーを追加する必要があります。ストレージアカウントのリソース識別子を貼り付けて、Azure ストレージポリシーを作成します。
Data Connection の Snowflake ソースに戻り、ソースを探索して同期を実行できることを確認します。
このドキュメントの仮想テーブルセクションでは、Snowflake Horizon Catalog に登録された Iceberg テーブルの統合について詳しく説明しています。この機能には、Iceberg テーブルが保存されている外部ボリュームへのネットワーク接続が必要です。Foundry は Snowflake のコンピュートウェアハウスを使用してテーブルをクエリするのではなく、保存場所に直接読み書きするため、外部ボリュームごとにネットワークエグレスポリシーを作成する必要があります。
外部ボリュームおよびテーブルの保存場所を特定する方法の詳細については、Snowflake の公式ドキュメント ↗を参照してください。
外部ボリュームのエグレスポリシーを設定すると、Foundry からその保存場所へのネットワーク通信が許可されます。ネットワーク制御はクラウドプロバイダーによって異なる場合があるため、保存場所のネットワーク制御で Foundry からのネットワーク通信が許可されていることを確認してください。Foundry の通信元 IP アドレスの特定について詳しくはこちら。
また、このドキュメントのネットワークに関するほかのセクションを参照し、Foundry インスタンスと同じクラウドリージョンでホストされている外部ボリュームへの接続を正しく設定してください。
このセクションでは、Snowflake ソースで仮想テーブルを使用する場合について詳しく説明します。このセクションは、Foundry データセットへの同期には適用されません。
Snowflake コネクターでは、仮想テーブルを使用して Horizon Catalog に登録された Iceberg テーブルにアクセスする際の機能が強化されました。Foundry は Horizon Catalog で公開されている Iceberg REST API を使用してテーブルにアクセスし、基盤となる保存場所のデータを読み書きします。これらの保存場所は、Snowflake で外部ボリュームとして設定されています。また、Foundry は Horizon Catalog の資格情報払い出し機能を使用して、クラウドオブジェクトストレージへの安全なアクセスを確保します。これにより、これらのテーブルへの読み書きのパフォーマンスも向上する可能性があります。
次の条件を満たすと、コネクターで Iceberg の機能が自動的に利用可能になります。
Foundry は Iceberg クライアントを使用して接続を確立し、Snowflake のコンピュートを使用せずに、保存場所にあるテーブルに直接読み書きします。ただし、アクセス対象のテーブルの種類を特定するなど、一部のメタデータクエリには、引き続きソースに設定されたウェアハウスを使用します。
Snowflake Horizon Catalog を介して外部エンジンで Iceberg テーブルをクエリする方法の詳細については、Snowflake の公式ドキュメント ↗を参照してください。Horizon Catalog への書き込みは、現在 Snowflake の_プライベートプレビュー_機能です。外部ボリュームへのネットワークアクセスを有効にする方法の詳細については、このドキュメントのネットワークセクションを参照してください。
上記の要件が1つでも満たされない場合、Foundry は Iceberg テーブルを通常の Snowflake テーブルとして扱います。Snowflake への接続には、ほかの Snowflake データ(テーブル、ビュー、マテリアライズドビューなど)と同じ仕組みが使用され、テーブルへの読み書きには Snowflake のコンピュートウェアハウスを使用します。
次のテーブルは、Snowflake でサポートされている仮想テーブルの機能を示しています。
| 機能 | ステータス |
|---|---|
| 一括登録 | 🟢 一般提供 |
| 自動登録 | 🟢 一般提供 |
| テーブル入力 | 🟢 一般提供:Code Repositories、Pipeline Builder のテーブル、ビュー、マテリアライズドビュー |
| テーブル出力 | 🟢 一般提供:Code Repositories、Pipeline Builder のテーブル |
| インクリメンタル(差分処理)パイプライン | 🟢 一般提供:APPEND のみ、テーブルのみ [1] |
| コンピュートプッシュダウン | 🟢 一般提供:Python トランスフォーム、Pipeline Builder |
Snowflake テーブルを入力または出力として使用できる、サポート対象の Foundry ワークフローの詳細については、仮想テーブルのドキュメントを参照してください。
[1] インクリメンタルパイプラインは、テーブルのみでサポートされています。ビューはバージョン管理されないため、インクリメンタルパイプラインでは利用できません。Snowflake 仮想テーブルに基づくパイプラインでインクリメンタル処理を有効にするには、適切な保持期間で Change Tracking ↗ と Time Travel ↗ が有効になっていることを確認してください。この機能は CHANGES ↗ に依存します。Python トランスフォームの current および added 読み取りモードがサポートされています。これらのモードでは、METADATA$ACTION 列に基づいて、変更フィードの該当する行が公開されます。METADATA$ACTION、METADATA$ISUPDATE、METADATA$ROW_ID 列は Python トランスフォームで利用可能になります。
すべての機能を利用するには、ソース接続に設定された資格情報に次の権限を付与してください。必要な継承モデルに応じて、データベース、スキーマ、またはテーブルのいずれかにこれらの権限を適用してください。
| カテゴリー | 権限 | 備考 |
|---|---|---|
| 前提条件 | USAGE | Foundry で使用する Snowflake のデータベースおよびスキーマに付与する必要があります。 |
| 読み取り | SELECT | 同期または仮想テーブル入力を使用して Snowflake テーブルを読み取るために必要です。 |
| 編集 | DELETE, INSERT, TRUNCATE, UPDATE | 仮想テーブル出力を使用して Snowflake テーブルを変更するために必要です。 |
| 作成 | CREATE SCHEMA, CREATE TABLE | 仮想テーブル出力を使用して Snowflake テーブルを作成するために必要です。 |
Iceberg テーブルを使用する場合は、テーブルが保存されている外部ボリュームに対する USAGE 権限が必要です。
また、指定する資格情報には、ソース設定で指定したウェアハウスに対する使用権限が必要です。
Snowflake のアクセス制御権限の詳細については、Snowflake の公式ドキュメント ↗を参照してください。
仮想テーブルを使用する際は、次のソース設定の要件に留意してください。
詳細については、上記の接続情報セクションを参照してください。
このソースから Foundry の Iceberg テーブルに直接データを同期できます。Iceberg 同期は、非インクリメンタルおよびインクリメンタル(差分連携)のバッチ取り込みと複数の書き込みモードをサポートし、Foundry ワーカーのランタイムで実行されます。設定の詳細とサポートされる書き込みモードについては、Iceberg 同期のドキュメントを参照してください。
Iceberg 同期は、仮想テーブル機能とは異なります。同期では Snowflake ソースのデータを Foundry が管理する Iceberg テーブルに書き込みます。一方、仮想テーブルでは、Snowflake Horizon Catalog に保存されている Iceberg テーブルを登録し、データをコピーせずに Foundry で使用します。
Foundry では、仮想テーブルを使用する場合に計算を Snowflake にプッシュダウンできます。仮想テーブルの入力には、述語プッシュダウンを標準でサポートする Snowflake Spark コネクター ↗を使用します。
同じソースに登録された Snowflake 仮想テーブルをパイプラインの入力と出力として使用すると、計算をすべて Snowflake に委譲できます。計算を Snowflake にプッシュダウンする方法の詳細については、Python のドキュメントを参照してください。Pipeline Builder で計算を Snowflake にプッシュダウンする方法については、外部パイプラインのドキュメントを参照してください。
より複雑なシナリオでは、プロコードの代替アプリケーションを使用して Snowflake ソースに接続できます。
以下の例では、外部トランスフォームで Snowflake Connector for Python ↗(snowflake-connector-python)を使用して Snowflake ソースに接続する方法を示します。認証には OIDCを使用します。これにより、固定の Snowflake 資格情報を必要とせずに、有効期間の短い OAuth トークンが提供されます。OIDC が有効なソースでセッション資格情報を使用する方法の詳細については、Python でのソースの使用のドキュメントを参照してください。
この例では、OIDC ベースの OAuth 資格情報を使用して Snowflake テーブルからデータを読み取ります。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32import polars as pl from transforms.api import transform, Output, LightweightOutput from transforms.external.systems import ResolvedSource, external_systems, Source import snowflake.connector @external_systems( snowflake_source=Source("<source_rid>") ) @transform.using( output=Output("<output_dataset_rid>") ) def read_from_snowflake(output: LightweightOutput, snowflake_source: ResolvedSource): conn = snowflake.connector.connect( authenticator="oauth", token=snowflake_source.get_session_credentials().get().access_token, account="<account_identifier>", warehouse="<warehouse_name>", database="<database_name>", ) cursor = conn.cursor() try: cursor.execute("SELECT * FROM my_table LIMIT 100") columns = [col[0] for col in cursor.description] rows = cursor.fetchall() finally: cursor.close() conn.close() df = pl.DataFrame(rows, schema=columns) output.write_table(df)
この例では、Foundry データセットから Snowflake テーブルにデータをエクスポートします。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35import polars as pl from transforms.api import transform, Input, Output, LightweightOutput from transforms.external.systems import ResolvedSource, external_systems, Source import snowflake.connector @external_systems( snowflake_source=Source("<source_rid>") ) @transform.using( output=Output("<output_dataset_rid>"), source_data=Input("<input_dataset_rid>"), ) def write_to_snowflake(output: LightweightOutput, snowflake_source: ResolvedSource, source_data): conn = snowflake.connector.connect( authenticator="oauth", token=snowflake_source.get_session_credentials().get().access_token, account="<account_identifier>", warehouse="<warehouse_name>", database="<database_name>", ) cursor = conn.cursor() try: df = source_data.dataframe() for row in df.iter_rows(named=True): cursor.execute( "INSERT INTO my_table (col1, col2) VALUES (%s, %s)", (row["col1"], row["col2"]), ) finally: cursor.close() conn.close() output.write_table(df)
データ型が array ↗、object ↗、variant ↗ の列は、Foundry によって string 型としてパースされます。これは、ソースのデータ型が可変であるためです。
たとえば、Snowflake の配列 [ 1, 2, 3 ] は、Foundry では文字列 "[1,2,3]" として解釈されます。
詳細については、Snowflake の公式ドキュメント ↗を参照してください。