外部ボリュームの構成¶
外部ボリュームは名前付きのアカウントレベルのSnowflakeオブジェクトで、SnowflakeをIcebergテーブル用の外部クラウドストレージに接続するために使用します。外部ボリュームには、ストレージ場所のIDおよびアクセス管理(IAM)エンティティが格納されます。Snowflakeは IAM エンティティを使用して、テーブルデータ、Icebergメタデータ、およびテーブルスキーマ、パーティション、その他のメタデータを格納するマニフェストファイルにアクセスするために、ストレージにセキュアに接続します。
1つの外部ボリュームで1つまたは複数のIcebergテーブルをサポートできます。
Snowflakeで Apache Iceberg™ テーブルを作成する前に、外部ボリュームを作成する必要があります。
外部ボリュームを作成する¶
外部ボリュームを作成する手順は、クラウドストレージプロバイダーによって異なります。
手順については、以下のトピックをご参照ください。
各外部ボリュームは特定の アクティブなストレージの場所 に関連付けられており、1つの外部ボリュームで複数のIcebergテーブルをサポートできます。しかし、必要な外部ボリュームの数は、テーブルデータをどのように保存、整理、保護するかによって異なります。
Snowflake-Icebergテーブルの すべての データとメタデータを同じストレージ場所(たとえば、同じS3バケット)のサブディレクトリに格納したい場合は、単一の外部ボリュームを使用できます。Snowflakeが管理するテーブル用にこれらのディレクトリを設定するには、 データとメタデータのディレクトリ を参照してください。
あるいは、複数の外部ボリュームを作成し、さまざまなストレージ場所を異なる方法で保護することもできます。例えば、以下のような外部ボリュームを作成します。
外部で管理されるIcebergテーブル用の読み取り専用外部ボリューム。
Snowflakeで管理されたテーブルの読み取り/書き込みアクセスが設定された外部ボリューム。
外部ボリュームの検証¶
設定した外部ボリュームを使用して、Snowflakeがストレージプロバイダーに正常に認証できることを確認するには、 SYSTEM$VERIFY_EXTERNAL_VOLUME 関数を呼び出します。
検証する外部ボリュームの名前を指定します。
SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('my_s3_external_volume');
アカウント、データベース、またはスキーマレベルでデフォルトの外部ボリュームを設定する¶
既存の外部ボリュームをIcebergテーブルに使用するデフォルトとして設定するには、 EXTERNAL_VOLUME パラメーターを以下のレベルで設定します。
- アカウント:
アカウント管理者は ALTER ACCOUNT コマンドを使用して、アカウントのパラメーターを設定できます。この値がアカウントに設定されている場合、そのアカウントで作成されたすべてのIcebergテーブルはデフォルトでこの外部ボリュームを読み取り、書き込みます。
- オブジェクト:
ユーザーは適切な CREATE <オブジェクト> または ALTER <オブジェクト> コマンドを実行して、データベースまたはスキーマレベルで EXTERNAL_VOLUME パラメーター値を上書きできます。宣言の有効範囲が最も低いもの(スキーマ > データベース > アカウント)が使用されます。
適切な ALTER <object_type> コマンドを使用してオブジェクトを変更するために必要な最小権限に加えて、ロールには外部ボリュームに対して USAGE 権限が必要です。
注釈
EXTERNAL_VOLUME パラメーターの変更は、変更 後 に作成されたテーブルにのみ適用されます。既存のテーブルは、作成時に指定された外部ボリュームを引き続き使用します。
例¶
次のステートメントは、 my_database_1
という名前のデータベース用に外部ボリューム(my_s3_vol
)を設定します。
ALTER DATABASE my_database_1
SET EXTERNAL_VOLUME = 'my_s3_vol';
データベースレベルで外部ボリュームを設定した後、外部ボリュームを指定せずにそのデータベースにIcebergテーブルを作成できます。次のステートメントは、カタログとしてSnowflakeを使用し、データベースに設定されたデフォルトの外部ボリューム(my_s3_vol
)を使用するIcebergテーブルを my_database_1
に作成します。
CREATE ICEBERG TABLE iceberg_reviews_table (
id STRING,
product_name STRING,
product_id STRING,
reviewer_name STRING,
review_date DATE,
review STRING
)
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'my/product_reviews/';