Apache Iceberg™ テーブルのストレージ¶
Snowflakeテーブルは通常、Snowflakeが管理するストレージを使用します。対照的に、Snowflakeの Apache Iceberg™ テーブルでは、外部ストレージを使用し、それを構成して維持します。
このトピックでは、Icebergテーブルストレージの概念情報とベストプラクティスについて説明します。
外部ボリューム¶
外部ボリュームは名前付きのアカウントレベルのSnowflakeオブジェクトで、SnowflakeをIcebergテーブル用の外部クラウドストレージに接続するために使用します。外部ボリュームには、ストレージ場所のIDおよびアクセス管理(IAM)エンティティが格納されます。Snowflakeは IAM エンティティを使用して、テーブルデータ、Icebergメタデータ、およびテーブルスキーマ、パーティション、その他のメタデータを格納するマニフェストファイルにアクセスするために、ストレージにセキュアに接続します。
1つの外部ボリュームで1つまたは複数のIcebergテーブルをサポートできます。
各外部ボリュームは特定の アクティブなストレージの場所 に関連付けられており、1つの外部ボリュームで複数のIcebergテーブルをサポートできます。しかし、必要な外部ボリュームの数は、テーブルデータをどのように保存、整理、保護するかによって異なります。
Snowflake-Icebergテーブルの すべての データとメタデータを同じストレージ場所(たとえば、同じS3バケット)のサブディレクトリに格納したい場合は、単一の外部ボリュームを使用できます。Snowflakeが管理するテーブル用にこれらのディレクトリを設定するには、 データとメタデータのディレクトリ を参照してください。
あるいは、複数の外部ボリュームを作成し、さまざまなストレージ場所を異なる方法で保護することもできます。例えば、以下のような外部ボリュームを作成します。
外部で管理されるIcebergテーブル用の読み取り専用外部ボリューム。
Snowflakeで管理されたテーブルの読み取り/書き込みアクセスが設定された外部ボリューム。
Snowflakeにストレージへのアクセスを付与する¶
クラウドプロバイダーのストレージ¶
Icebergテーブル用のクラウドストレージの場所へのアクセスをSnowflakeに付与するには、クラウドプロバイダーのIDおよびアクセス管理サービスを使用します。ID(プリンシパル)に対して、秘密を交換することなく、ストレージへの限定的なアクセスを許可します。これは、Snowflakeがストレージ統合を含む他の統合に使用しているのと同じアクセスモデルです。
Snowflakeは、 外部ボリューム を作成するときに、Snowflakeアカウント全体のプリンシパルをプロビジョニングします。クラウドプロバイダーによって異なりますが、主な方法は以下の通りです。
クラウドプロバイダー |
Snowflakeプロビジョニングプリンシパル |
---|---|
Amazon Web Services(AWS) |
|
Google Cloud |
|
Azure |
Snowflakeはストレージプロバイダーと直接認証コードし、Snowflakeがプロビジョニングしたプリンシパルは、指定した役割を引き受けます。このロールには、ストレージロケーションに対して操作を実行する権限が必要です。例えば、Snowflakeは、ロールにそのストレージロケーションからの読み取り権限がある場合にのみ、ストレージロケーションから読み取ることができます。
Snowflakeでは、Icebergテーブルに対して以下のアクションを実行する権限が必要です。
Snowflake管理テーブル |
外部Icebergカタログを使用するテーブル |
|
---|---|---|
Amazon S3 |
|
|
Google Cloud Storage |
|
|
Azure Storage |
注釈
s3:PutObject
権限は外部ボリュームの場所への書き込みアクセスを許可します。書き込みアクセスを完全に構成するには、外部ボリュームの ALLOW_WRITES
パラメーターを TRUE
(デフォルト値)に設定する必要があります。
IcebergテーブルのストレージにSnowflakeのアクセスを許可する詳細な手順については、以下のトピックをご参照ください。
S3互換ストレージ¶
Iceberg テーブル用の S3互換ストレージロケーション への Snowflake アクセスを付与するには、外部ボリュームを作成するときに、 S3 互換ストレージエンドポイント を認証情報とともに指定します。
手順については、 S3互換ストレージ用の外部ボリュームの構成 をご参照ください。
アクティブなストレージの場所¶
各外部ボリュームは1つのアクティブなストレージの場所をサポートします。 CREATE EXTERNAL VOLUME ステートメントで複数のストレージロケーションを指定した場合、Snowflakeは1つのロケーションをアクティブロケーションとして割り当てます。アクティブな場所は、外部ボリュームの有効期間中、同じままです。
CREATEICEBERGTABLEステートメントで初めて外部ボリュームを使用するときに割り当てが発生します。Snowflakeは、以下のロジックを使用してアクティブな場所を選択します。
STORAGE_LOCATIONS
リストに1つ以上の ローカル ストレージの場所が含まれている場合、Snowflakeはリストで最初に表示されるローカルストレージの場所を使用します。ローカルストレージの場所とは、Snowflakeアカウントと同じクラウドプロバイダーで、同じリージョンにあるもののことです。STORAGE_LOCATIONS
リストにローカルストレージの場所が含まれていない場合、Snowflakeはリストに最初に表示されている場所を選択します。
注釈
Snowflakeバージョン7.44より前に作成された外部ボリュームは、アクティブな場所を選択するために異なるロジックを使用していた可能性があります。
ストレージへのアクセスの確認¶
Snowflakeがストレージプロバイダーに正常に認証できることを確認するには、 SYSTEM$VERIFY_EXTERNAL_VOLUME 関数を呼び出します。
SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('my_external_volume');
Snowflakeが管理するテーブルの場合、Snowflakeは以下の状況で外部ボリューム上の アクティブなストレージ場所 へのアクセスを自動的に検証します。
Snowflakeが管理するテーブルのCREATEICEBERGTABLEステートメントで初めて外部ボリュームを指定します。
初めてテーブルを変換してSnowflakeをIcebergカタログとして使用します。
外部ボリュームの ALLOW_WRITES
プロパティを TRUE
に設定する必要があります。
Snowflakeは、ストレージの場所を確認するために、以下のストレージ操作を試みます。
テストファイルの書き込み。
ファイルの読み込み。
ファイルのパスの内容の一覧表示。
ファイルの削除。
いずれかの操作に失敗すると、 CREATE ICEBERG TABLE (または ALTER ICEBERG TABLE ... CONVERT TO MANAGED)ステートメントが失敗し、エラーメッセージが表示されます。
ファイル管理¶
Icebergテーブルの種類別に、ストレージ内のIcebergテーブルファイルの管理方法を説明します。
Snowflake管理テーブル¶
重要
Snowflakeが管理するIcebergテーブルに関連付けられたオブジェクトの削除や上書きを他のツールに許可しないようにします。
Snowflakeプリンシパルがテーブルストレージにアクセスできるようにします。詳細については、 Snowflakeにストレージへのアクセスを付与する をご参照ください。
Icebergテーブルのストレージロケーションを構成および管理するのは あなた ですが、Snowflakeは、Snowflakeが管理するテーブルに属するストレージ内のオブジェクト(データおよびメタデータファイル)に対してのみ動作します。Snowflakeは、クエリのパフォーマンスを最適化し、削除されたデータをクリーンアップするために、これらのテーブルオブジェクトに対して定期的なメンテナンスを実行します。
他のツールがSnowflakeが管理するテーブルオブジェクトを削除または上書きした場合、クエリが失敗することがあります。同様に、Snowflakeプリンシパルのストレージへのアクセスを取り消すと、テーブルへのクエリやSnowflakeのテーブルメンテナンス操作は失敗します。
Snowflakeは、Snowflakeが管理するテーブルのデータが削除されるか、テーブルがドロップされると、テーブルの保持期間が終了した後にオブジェクトを削除します。
データとメタデータのディレクトリ¶
注釈
Iceberg テーブルのデータとメタデータのディレクトリを検索するには、 SHOW ICEBERG TABLES コマンドを使用します。コマンド出力には、各テーブルのデータファイルとメタデータファイルの場所を示す base_location
プロパティが含まれます。
Snowflakeが管理するテーブルの場合、SnowflakeはParquetデータファイルとテーブルメタデータを外部クラウドストレージに書き込みます。Snowflakeは、 Deltaベーステーブル のメタデータも書き込みます。
Snowflakeは、 BASE_LOCATION または BASE_LOCATION_PREFIX パラメーターに指定された値に応じて、以下のパターンを使用してパスを構築します。 BASE_LOCATION
を指定した場合、Snowflake はパスの BASE_LOCATION_PREFIX を使用しません。
条件:
STORAGE_BASE_URL
は、外部ボリュームに関連付けられているアクティブなストレージの場所のベース URL です。BASE_LOCATION
は、Snowflakeがテーブルファイル (CREATE ICEBERG TABLE で指定)を書き込むディレクトリのパスで、外部ボリュームの場所からの相対パスです。Deltaベーステーブルでは、 BASE_LOCATION の指定が必要です。randomId
はランダムにSnowflakeが生成した8文字の文字列です。
BASE_LOCATION 定義済み |
BASE_LOCATION_PREFIX 定義済み |
パス |
---|---|---|
無し |
無し |
|
無し |
有り |
|
有り |
該当なし(無視) |
|
'' (空の文字列) |
該当なし(無視) |
|
BASE_LOCATIONによるテーブル収納の整理
注釈
将来的にテーブル名を変更する予定がある場合は、このオプションはお勧めしません。
Snowflake管理テーブルを作成した後、外部ストレージ内のファイルへのパスは、テーブル名を変更しても変更され ません。
同じ STORAGE_BASE_URL
の下にある複数のIcebergテーブルのストレージ内のファイルを整理するには、CREATE ICEBERG TABLE ステートメントでテーブル名を BASE_LOCATION
として使用することを検討します。この方法で、Snowflakeはテーブル名を含むディレクトリにデータとメタデータを書き込みます。
例:
CREATE OR REPLACE ICEBERG TABLE iceberg_table_1 (
col_1 int,
col_2 string
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'iceberg_external_volume'
BASE_LOCATION = 'iceberg_table_1';
CREATE OR REPLACE ICEBERG TABLE iceberg_table_2 (
col_1 int,
col_2 string
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'iceberg_external_volume'
BASE_LOCATION = 'iceberg_table_2';
このステートメントの結果、外部クラウドストレージのディレクトリ構造は以下のようになります。
STORAGE_BASE_URL
|-- iceberg_table_1.<randomId>
| |-- data/
| |-- metadata/
|-- iceberg_table_2.<randomId>
| |-- data/
| |-- metadata/
外部カタログを使用するテーブル¶
Snowflakeは、外部で管理されているIcebergテーブル、また ALLOW_WRITES
プロパティが FALSE
に設定されている外部ボリューム上のストレージオブジェクトの書き込みや削除を行いません。
テーブルデータとメタデータにアクセスするために、Snowflakeは外部ボリュームに設定したアクセス制御ロールを想定します。ロールに、(バケットやコンテナ内の)ストレージの場所へのアクセス許可を与えます。テーブルデータとメタデータのファイルは、すべてその場所になければなりません。例えば、ストレージの場所がS3バケットである場合、すべてのデータとメタデータファイルはそのバケットのどこかに存在する必要があります。
さらに、 テーブルを変換 しても、データファイルやメタデータファイルは書き換えられません。SnowflakeがIcebergテーブルに書き込むのは、Snowflakeをカタログとして使用するようにテーブルを変換した後です。
ストレージアクセスログの有効化¶
問題を診断し、外部ボリュームに関連付けられたストレージロケーションへのアクセスを監査するには、ストレージログを有効にします。ストレージログは、ファイルの紛失や破損の原因を特定するのに役立ちます。
ストレージプロバイダーでログを有効にします。Icebergテーブルのストレージを所有し管理しているため、SnowflakeはIcebergストレージロケーションのログや監査を有効にすることはできません。
ストレージプロバイダーのストレージアクセスログについては、以下の外部トピックをご参照ください。
バージョン管理とオブジェクト保持によるファイルの保護¶
Icebergテーブルデータが複数のツールやサービスによって操作されるセントラルデータリポジトリ(またはデータレイク)にある場合、偶発的な削除や破損が発生する可能性があります。Icebergテーブルのデータを保護し、誤って削除または上書きされたデータを確実に復元するには、データプロバイダーが提供するストレージライフサイクル管理とバージョニングを使用します。
ライフサイクル管理では、ストレージオブジェクトの保持と追跡ルールを設定できます。ストレージプロバイダーのライフサイクル管理については、以下の外部トピックをご参照ください。
オブジェクトの復旧をサポートするために、外部クラウドストレージのバージョン管理を有効にすることもできます。
Amazon S3でバージョン管理を有効にするには、 バケットでのバージョン管理の有効化 をご参照ください。
Google Cloud Storageのバージョン管理を有効にするには、 オブジェクトのバージョン管理を使用する をご参照ください。
Azureのバージョン管理を有効にするには、 blob のバージョン管理を有効にする をご参照ください。
テーブルファイルの暗号化¶
Snowflake は、一般的なサーバー側暗号化(SSE)スキームを使用して暗号化したストレージ内のIcebergテーブルファイルを読み込むことができます。暗号化キーの管理にはクラウドサービスプロバイダを使用し、顧客が管理するキーを使用する場合は、Snowflakeプリンシパルにキーへのアクセスを許可する必要があります。
Amazon S3 では、Snowflake は以下のSSEオプションをサポートしています。
SSEオプション |
設定 |
---|---|
SSEAmazon S3マネージドキー(SSE-S3)を使用します。 |
CREATE EXTERNAL VOLUME コマンドで |
SSEAWSKMSキー付き (SSE-KMS) |
CREATE EXTERNAL VOLUME コマンドで SSE-KMS暗号化に必要な権限も付与する必要があります。手順については、 Amazon S3用の外部ボリュームを構成する のステップ3をご参照ください。 |
Google Cloud Storageでは、Snowflakeが以下のSSEオプションをサポートしています。
SSEオプション |
設定 |
---|---|
SSE Google Cloudに保存されたキーを使用KMS |
CREATE EXTERNAL VOLUME コマンドで また、 Google Cloud Key Management Serviceの鍵について、GCSサービスアカウントに権限を付与します。 も必要です。 |