Apache Iceberg™ テーブルのストレージ

Snowflakeテーブルは通常、Snowflakeが管理するストレージを使用します。対照的に、Snowflakeの Apache Iceberg™ テーブルでは、外部ストレージを使用し、それを構成して維持します。

このトピックでは、Icebergテーブルストレージの概念情報とベストプラクティスについて説明します。

Snowflakeにストレージへのアクセスを付与する

IcebergテーブルのストレージロケーションへのアクセスをSnowflakeに許可するには、クラウドプロバイダーのIDおよびアクセス管理サービスを使用します。ID(プリンシパル)に対して、秘密を交換することなく、ストレージへの限定的なアクセスを許可します。これは、Snowflakeがストレージ統合を含む他の統合に使用しているのと同じアクセスモデルです。

Snowflakeは、 外部ボリューム を作成するときに、Snowflakeアカウント全体のプリンシパルをプロビジョニングします。クラウドプロバイダーによって異なりますが、主な方法は以下の通りです。

クラウドプロバイダー

Snowflakeプロビジョニングプリンシパル

Amazon Web Services(AWS)

IAMユーザー

Google Cloud

サービスアカウント

Azure

サービスプリンシパル

Snowflakeはストレージプロバイダーと直接認証コードし、Snowflakeがプロビジョニングしたプリンシパルは、指定した役割を引き受けます。このロールには、ストレージロケーションに対して操作を実行する権限が必要です。例えば、Snowflakeは、ロールにそのストレージロケーションからの読み取り権限がある場合にのみ、ストレージロケーションから読み取ることができます。

Snowflakeでは、Icebergテーブルに対して以下のアクションを実行する権限が必要です。

Snowflake管理テーブル

外部Icebergカタログを使用するテーブル

Amazon S3

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:ListBucket

  • s3:PutObject

  • s3:DeleteObject

  • s3:GetObjectVersion

  • s3:DeleteObjectVersion

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:ListBucket

  • s3:GetObjectVersion

Google Cloud Storage

  • storage.objects.create

  • storage.objects.delete

  • storage.objects.get

  • storage.objects.list

  • storage.buckets.get

  • storage.objects.get

  • storage.objects.list

Azure Storage

Storageブロブデータコントリビューターロールで許可されるすべてのアクション

ストレージブロブデータリーダーロールで許可されるすべてのアクション

注釈

s3:PutObject 権限は外部ボリュームの場所への書き込みアクセスを許可します。書き込みアクセスを完全に構成するには、外部ボリュームの ALLOW_WRITES パラメーターを TRUE (デフォルト値)に設定する必要があります。

各外部ボリュームは特定の アクティブなストレージの場所 に関連付けられており、1つの外部ボリュームで複数のIcebergテーブルをサポートできます。しかし、必要な外部ボリュームの数は、テーブルデータをどのように保存、整理、保護するかによって異なります。

Snowflake-Icebergテーブルの すべての データとメタデータを同じストレージ場所(たとえば、同じS3バケット)のサブディレクトリに格納したい場合は、単一の外部ボリュームを使用できます。Snowflakeが管理するテーブル用にこれらのディレクトリを設定するには、 データとメタデータのディレクトリ を参照してください。

あるいは、複数の外部ボリュームを作成し、さまざまなストレージ場所を異なる方法で保護することもできます。例えば、以下のような外部ボリュームを作成します。

  • 外部で管理されるIcebergテーブル用の読み取り専用外部ボリューム。

  • Snowflakeで管理されたテーブルの読み取り/書き込みアクセスが設定された外部ボリューム。

IcebergテーブルのストレージにSnowflakeのアクセスを許可する詳細な手順については、以下のトピックをご参照ください。

アクティブなストレージの場所

各外部ボリュームは1つのアクティブなストレージの場所をサポートします。 CREATE EXTERNAL VOLUME ステートメントで複数のストレージロケーションを指定した場合、Snowflakeは1つのロケーションをアクティブロケーションとして割り当てます。アクティブな場所は、外部ボリュームの有効期間中、同じままです。

CREATEICEBERGTABLEステートメントで初めて外部ボリュームを使用するときに割り当てが発生します。Snowflakeは、以下のロジックを使用してアクティブな場所を選択します。

  • STORAGE_LOCATIONS リストに1つ以上の ローカル ストレージの場所が含まれている場合、Snowflakeはリストで最初に表示されるローカルストレージの場所を使用します。ローカルストレージの場所とは、Snowflakeアカウントと同じクラウドプロバイダーで、同じリージョンにあるもののことです。

  • STORAGE_LOCATIONS リストにローカルストレージの場所が含まれていない場合、Snowflakeはリストに最初に表示されている場所を選択します。

注釈

  • クロスクラウド/クロスリージョンのIcebergテーブルは、外部Icebergカタログを使用する場合にのみサポートされます。詳細については、 クロスクラウド/クロスリージョンのサポート をご参照ください。

  • Snowflakeバージョン7.44より前に作成された外部ボリュームは、アクティブな場所を選択するために異なるロジックを使用していた可能性があります。

ストレージへのアクセスの確認

Snowflakeがストレージプロバイダーに正常に認証できることを確認するには、 SYSTEM$VERIFY_EXTERNAL_VOLUME 関数を呼び出します。

SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('my_s3_external_volume');
Copy

Snowflakeが管理するテーブルの場合、Snowflakeは以下の状況で外部ボリューム上の アクティブなストレージ場所 へのアクセスを自動的に検証します。

  • Snowflakeが管理するテーブルのCREATEICEBERGTABLEステートメントで初めて外部ボリュームを指定します。

  • 初めてテーブルを変換してSnowflakeをIcebergカタログとして使用します。

外部ボリュームの ALLOW_WRITES プロパティを TRUE に設定する必要があります。

Snowflakeは、ストレージの場所を確認するために、以下のストレージ操作を試みます。

  1. テストファイルの書き込み。

  2. ファイルの読み込み。

  3. ファイルのパスの内容の一覧表示。

  4. ファイルの削除。

いずれかの操作に失敗すると、 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が管理するテーブルのデータが削除されるか、テーブルがドロップされると、テーブルの保持期間が終了した後にオブジェクトを削除します。

データとメタデータのディレクトリ

Snowflakeが管理するテーブルの場合、Snowflakeは外部クラウドストレージの以下のパスにParquetデータファイルとテーブルメタデータを書き込みます。

  • STORAGE_BASE_URL/BASE_LOCATION/data/

  • STORAGE_BASE_URL/BASE_LOCATION/metadata/

条件:

  • STORAGE_BASE_URL は、外部ボリュームに関連付けられているアクティブなストレージの場所のベース URL です。

  • BASE_LOCATION は、外部ボリューム(CREATE ICEBERG TABLE ステートメントで指定)からの相対パスの下にあるディレクトリの名前です。

BASE_LOCATIONに空文字列を指定

BASE_LOCATION に空の文字列('')を指定すると、Snowflakeは STORAGE_BASE_URL のすぐ下に data/metadata/ のディレクトリを作成します。

例: STORAGE_BASE_URL/data/

複数のテーブルに同じ場所を使用する場合

同じストレージロケーションを使用し、複数のテーブルに同じベースロケーションを指定すると、Snowflakeはそれらのテーブルの すべて のデータを同じ data/ ディレクトリに書き込みます。同様に、Snowflakeはこれらすべてのテーブルのメタデータを同じ metadata/ ディレクトリに書き込みます。

BASE_LOCATIONによるテーブル収納の整理

同じ 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';
Copy

このステートメントの結果、外部クラウドストレージのディレクトリ構造は以下のようになります。

STORAGE_BASE_URL
|-- iceberg_table_1
|   |-- data/
|   |-- metadata/
|-- iceberg_table_2
|   |-- data/
|   |-- metadata/
Copy

外部カタログを使用するテーブル

Snowflakeは、外部で管理されているIcebergテーブル、また ALLOW_WRITES プロパティが FALSE に設定されている外部ボリューム上のストレージオブジェクトの書き込みや削除を行いません。

テーブルデータとメタデータにアクセスするために、Snowflakeは外部ボリュームに設定したアクセス制御ロールを想定します。ロールに、(バケットやコンテナ内の)ストレージの場所へのアクセス許可を与えます。テーブルデータとメタデータのファイルは、すべてその場所になければなりません。例えば、ストレージの場所がS3バケットである場合、すべてのデータとメタデータファイルはそのバケットのどこかに存在する必要があります。

さらに、 テーブルを変換 しても、データファイルやメタデータファイルは書き換えられません。SnowflakeがIcebergテーブルに書き込むのは、Snowflakeをカタログとして使用するようにテーブルを変換した後です。

ストレージアクセスログの有効化

問題を診断し、外部ボリュームに関連付けられたストレージロケーションへのアクセスを監査するには、ストレージログを有効にします。ストレージログは、ファイルの紛失や破損の原因を特定するのに役立ちます。

ストレージプロバイダーでログを有効にします。Icebergテーブルのストレージを所有し管理しているため、SnowflakeはIcebergストレージロケーションのログや監査を有効にすることはできません。

ストレージプロバイダーのストレージアクセスログについては、以下の外部トピックをご参照ください。

バージョン管理とオブジェクト保持によるファイルの保護

Icebergテーブルデータが複数のツールやサービスによって操作されるセントラルデータリポジトリ(またはデータレイク)にある場合、偶発的な削除や破損が発生する可能性があります。Icebergテーブルのデータを保護し、誤って削除または上書きされたデータを確実に復元するには、データプロバイダーが提供するストレージライフサイクル管理とバージョニングを使用します。

ライフサイクル管理では、ストレージオブジェクトの保持と追跡ルールを設定できます。ストレージプロバイダーのライフサイクル管理については、以下の外部トピックをご参照ください。

オブジェクトの復旧をサポートするために、外部クラウドストレージのバージョン管理を有効にすることもできます。

テーブルファイルの暗号化

Snowflake は、一般的なサーバー側暗号化(SSE)スキームを使用して暗号化したストレージ内のIcebergテーブルファイルを読み込むことができます。暗号化キーの管理にはクラウドサービスプロバイダを使用し、顧客が管理するキーを使用する場合は、Snowflakeプリンシパルにキーへのアクセスを許可する必要があります。

Amazon S3 では、Snowflake は以下のSSEオプションをサポートしています。

SSEオプション

設定

SSEAmazon S3マネージドキー(SSE-S3)を使用します。

CREATE EXTERNAL VOLUME コマンドで ENCRYPTION = ( TYPE = 'AWS_SSE_S3' ) を指定します。

SSEAWSKMSキー付き (SSE-KMS)

CREATE EXTERNAL VOLUME コマンドで ENCRYPTION = ( TYPE = 'AWS_SSE_KMS' KMS_KEY_ID='my_key' ) を指定します。

SSE-KMS暗号化に必要な権限も付与する必要があります。手順については、 Amazon S3用の外部ボリュームを構成する のステップ3をご参照ください。

Google Cloud Storageでは、Snowflakeが以下のSSEオプションをサポートしています。

SSEオプション

設定

SSE Google Cloudに保存されたキーを使用KMS

CREATE EXTERNAL VOLUME コマンドで ENCRYPTION = ( TYPE = 'GCS_SSE_KMS' KMS_KEY_ID = 'my_key' ) を指定します。

また、 Google Cloud Key Management Serviceの鍵について、GCSサービスアカウントに権限を付与します。 も必要です。