Snowflake管理 Apache Iceberg™ テーブルの複製を設定する¶
この機能を使用すると、Snowflake管理のApache Iceberg™テーブル をソースアカウントから同じ組織内にある1つ以上のターゲットアカウントに複製できます。
Icebergテーブルの複製は、通常のSnowflakeテーブルの複製と同様に機能します。親データベースをフェールオーバーグループまたは複製グループに追加すると、SnowflakeはIcebergテーブルを複製します。
ただし、Snowflake管理のIcebergテーブルは外部ボリュームに依存しています。これはアカウントレベルのオブジェクトであり、外部クラウドストレージに接続するために追加の構成が必要です。Icebergテーブルの複製を作成する前に、外部ボリュームの複製を構成する必要があります。
Snowflake管理のIcebergテーブルの複製のパブリックプレビューにオプトイン¶
このパブリックプレビューにオプトインするには、ソースアカウントとターゲットアカウントの両方でオプトインする必要があります。
ソースアカウントをオプトインするには、アカウントで プレビュー機能を有効化 した後、ALTER ACCOUNT コマンドを使用してアカウントレベルで次のパラメーターを有効にします。
ENABLE_ICEBERG_MANAGED_TABLE_REPLICATION
注釈
このパラメーターは、フェールオーバーグループレベルでも有効にすることもできます。
ENABLE_SELECTIVE_EXTERNAL_VOLUME_REPLICATION_PUPR
例:
ALTER ACCOUNT SET ENABLE_ICEBERG_MANAGED_TABLE_REPLICATION = TRUE ENABLE_SELECTIVE_EXTERNAL_VOLUME_REPLICATION_PUPR = TRUE;
ターゲットアカウントについて前のステップを繰り返します。
複製を有効化¶
ORGADMIN ロールを持つユーザーは、組織内のソースとターゲットの各アカウントで複製を有効にする必要があります。
USE ROLE ORGADMIN;
SELECT SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER(
'<organization_name>.<account_name>',
'ENABLE_ACCOUNT_DATABASE_REPLICATION',
'true');
詳しくは、 組織内のアカウントで複製を有効にする を参照してください。
複製について詳しくは、 複数のアカウント間にわたる複製とフェールオーバーの概要 をご覧ください。
フェールオーバーグループを使用した外部ボリュームの複製¶
これらの手順は、フェールオーバーグループを使用して、外部ボリュームとそれが依存するIcebergテーブルをターゲットアカウントに複製するためのサンプルワークフローを提供します。
重要
ソースアカウントのフェールオーバーグループに外部ボリュームが含まれている場合、Snowflakeはリフレッシュ操作中に、ターゲットアカウントから ターゲット アカウント内の既存の外部ボリュームをドロップします。
例:
ソースアカウントには、
ext_vol_1という名前の外部ボリュームが1つあります。ターゲットアカウントには、
ext_vol_2およびext_vol_3という名前の2つの外部ボリュームがあります。
リフレッシュ操作中に、Snowflakeはターゲットアカウント上で ext_vol_1 のレプリカを作成または同期しますが、ターゲットアカウントから ext_vol_2 および ext_vol_3 がドロップされます。
注釈
まだ外部ボリュームをお持ちでない場合は、ターゲットアカウントと 同じリージョン にある場所を含め、希望のストレージ場所で外部ボリュームを作成できます。各場所のストレージアクセスを構成した後、外部ボリュームを参照するIcebergテーブルを作成し、複製できます。
外部ボリュームを作成するには、 外部ボリュームの構成 をご参照ください。
ソースアカウントで、外部ボリュームを更新して、ターゲットアカウントと 同じリージョン にあるストレージの場所を追加します。
例:
ALTER EXTERNAL VOLUME exvol1 ADD STORAGE_LOCATION = ( NAME = 'my-s3-us-central-2' STORAGE_PROVIDER = 'S3' STORAGE_BASE_URL = 's3://my_bucket_us_central-2/' STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/myrole' STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id' );
重要
S3ストレージで自分の
STORAGE_AWS_EXTERNAL_IDを指定しない場合、Snowflakeが生成した外部 ID を取得するために、新しいストレージの場所を追加した後に DESCRIBE EXTERNAL VOLUME を呼び出す必要があります。次のステップでS3へのアクセスを構成するために外部 ID が必要です。Snowflakeは、この新しい場所をセカンダリ外部ボリュームの アクティブなストレージの場所 として設定します。
ソースアカウントで、追加のストレージ場所で更新した外部ボリュームを使用する、Snowflake管理のIcebergテーブルを作成します。
例:
CREATE ICEBERG TABLE my_iceberg_table (amount int) CATALOG = 'SNOWFLAKE' EXTERNAL_VOLUME = 'exvol1' BASE_LOCATION = 'my_iceberg_table';
ソースアカウントで、ターゲットアカウント の Snowflakeサービスプリンシパル に関する情報を取得するには、次のステップに従います。
SHOW REPLICATION ACCOUNTS コマンドを使用して、ターゲットアカウントの名前(
account_name)を取得します。SHOW REPLICATION ACCOUNTS LIKE 'my_target_account%';
SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY システム関数を呼び出します。ターゲットストレージの場所のクラウドプロバイダーと、SHOWREPLICATIONACCOUNTS 出力の
account_name列に表示されるとおりにターゲットアカウントの名前を 正確に 指定します。例:
SELECT SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY('S3', 'MY_TARGET_ACCOUNT_1');
ターゲットアカウントに関連付けられたストレージ場所へのSnowflakeアクセスを構成します。ターゲットアカウントのサービスプリンシパル用に取得した情報を使って、クラウドプロバイダーの手順に従います。
:doc:`/user-guide/tables-iceberg-configure-external-volume-s3`ターゲットアカウントのストレージ場所に関連付けられた外部 ID を使用します。
/user-guide/tables-iceberg-configure-external-volume-azure`SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY によって返される :code:`AZURE_CONSENT_URL TEMPLATE で、
your_tenant_idをストレージの場所が属するテナントの ID に置き換えます。
ソースアカウントで、CREATE FAILOVER GROUP コマンドを使用してフェールオーバーグループを作成します。
OBJECT_TYPESリストでEXTERNAL VOLUMESを指定します。ALLOWED_DATABASESリストに、複製するIcebergテーブルを含むデータベースを含めます。ALLOWED_EXTERNAL_VOLUMESリストに、複製するIcebergテーブルへのアクセスを提供する外部ボリュームを含めます。CREATE FAILOVER GROUP my_iceberg_fg OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES ALLOWED_DATABASES = my_iceberg_database ALLOWED_EXTERNAL_VOLUMES = my_external_volume ALLOWED_ACCOUNTS = myorg.my_account_1;
注釈
SQL パーサーエラーを受け取った場合、許可された外部ボリュームのリストが長すぎる可能性があります。このエラーが表示された場合は、CREATEFAILOVERGROUP ステートメントでリストを短くしてから、ALTER FAILOVER GROUP コマンドを使用してフェールオーバーグループに追加の許可された外部ボリュームを追加します。
既存のグループを更新するには、ALTER FAILOVER GROUP コマンドを使用して
EXTERNAL VOLUMESをOBJECT_TYPESリストに追加します。ターゲットアカウントでこれらのオブジェクトのドロップを回避するために、他の既存のオブジェクトもOBJECT_TYPESリストに含めます。たとえば、
EXTERNAL VOLUMESを既にDATABASESを含むフェールオーバーグループに追加します。ALTER FAILOVER GROUP my_iceberg_rg SET OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES ALLOWED_EXTERNAL_VOLUMES = my_external_volume;
ターゲットアカウントで、ソースアカウントのグループのレプリカとしてフェールオーバーグループを作成します(
my_source_account)CREATE FAILOVER GROUP my_iceberg_fg AS REPLICA OF myorg.my_source_account.my_iceberg_fg;
ソースアカウントのグループを複製するセカンダリグループがすでにある場合は、この手順をスキップしてください。
ターゲットアカウントで、更新コマンドを実行します。
ALTER FAILOVER GROUP my_iceberg_fg REFRESH;
Snowflake管理のIcebergテーブルを含むデータベースを複製し、ターゲットアカウントのクラウドストレージへのアクセスを構成している限り、Snowflakeはターゲットアカウントのテーブルを複製します。
注釈
Snowflakeがターゲットアカウント用に構成されたストレージの場所にアクセスできない場合は、リフレッシュ操作に失敗します。これが発生した場合は、アクセス制御設定を再確認するか、ストレージへのアクセスの確認 を試してください。
複製グループを使用した外部ボリュームの複製¶
これらの手順は、複製グループを使用して、外部ボリュームとそれを依存するIcebergテーブルをターゲットアカウントに複製するためのサンプルワークフローを提供します。
重要
ソースアカウントの複製グループに外部ボリュームが含まれている場合、Snowflakeはリフレッシュ操作中に、ターゲットアカウントから ターゲット アカウント内の既存の外部ボリュームをドロップします。
例:
ソースアカウントには、
ext_vol_1という名前の外部ボリュームが1つあります。ターゲットアカウントには、
ext_vol_2およびext_vol_3という名前の2つの外部ボリュームがあります。
リフレッシュ操作中に、Snowflakeはターゲットアカウント上で ext_vol_1 のレプリカを作成または同期しますが、ターゲットアカウントから ext_vol_2 および ext_vol_3 がドロップされます。
注釈
まだ外部ボリュームをお持ちでない場合は、ターゲットアカウントと 同じリージョン にある場所を含め、希望のストレージ場所で外部ボリュームを作成できます。各場所のストレージアクセスを構成した後、外部ボリュームを参照するIcebergテーブルを作成し、複製できます。
外部ボリュームを作成するには、 外部ボリュームの構成 をご参照ください。
ソースアカウントで、外部ボリュームを更新して、ターゲットアカウントと 同じリージョン にあるストレージの場所を追加します。
例:
ALTER EXTERNAL VOLUME exvol1 ADD STORAGE_LOCATION = ( NAME = 'my-s3-us-central-2' STORAGE_PROVIDER = 'S3' STORAGE_BASE_URL = 's3://my_bucket_us_central-2/' STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/myrole' STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id' );
重要
S3ストレージで自分の
STORAGE_AWS_EXTERNAL_IDを指定しない場合、Snowflakeが生成した外部 ID を取得するために、新しいストレージの場所を追加した後に DESCRIBE EXTERNAL VOLUME を呼び出す必要があります。次のステップでS3へのアクセスを構成するために外部 ID が必要です。Snowflakeは、この新しい場所をセカンダリ外部ボリュームの アクティブなストレージの場所 として設定します。
ソースアカウントで、追加のストレージ場所で更新した外部ボリュームを使用する、Snowflake管理のIcebergテーブルを作成します。
例:
CREATE ICEBERG TABLE my_iceberg_table (amount int) CATALOG = 'SNOWFLAKE' EXTERNAL_VOLUME = 'exvol1' BASE_LOCATION = 'my_iceberg_table';
ソースアカウントで、ターゲットアカウント の Snowflakeサービスプリンシパル に関する情報を取得するには、次のステップに従います。
SHOW REPLICATION ACCOUNTS コマンドを使用して、ターゲットアカウントの名前(
account_name)を取得します。SHOW REPLICATION ACCOUNTS LIKE 'my_target_account%';
SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY システム関数を呼び出します。ターゲットストレージの場所のクラウドプロバイダーと、SHOWREPLICATIONACCOUNTS 出力の
account_name列に表示されるとおりにターゲットアカウントの名前を 正確に 指定します。例:
SELECT SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY('S3', 'MY_TARGET_ACCOUNT_1');
ターゲットアカウントに関連付けられたストレージ場所へのSnowflakeアクセスを構成します。ターゲットアカウントのサービスプリンシパル用に取得した情報を使って、クラウドプロバイダーの手順に従います。
:doc:`/user-guide/tables-iceberg-configure-external-volume-s3`ターゲットアカウントのストレージ場所に関連付けられた外部 ID を使用します。
/user-guide/tables-iceberg-configure-external-volume-azure`SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY によって返される :code:`AZURE_CONSENT_URL TEMPLATE で、
your_tenant_idをストレージの場所が属するテナントの ID に置き換えます。
ソースアカウントで、CREATE REPLICATION GROUP コマンドを使用して複製グループを作成します。
OBJECT_TYPESリストでEXTERNAL VOLUMESを指定します。ALLOWED_DATABASESリストに、複製するIcebergテーブルを含むデータベースを含めます。ALLOWED_EXTERNAL_VOLUMESリストに、複製するIcebergテーブルへのアクセスを提供する外部ボリュームを含めます。CREATE REPLICATION GROUP my_iceberg_rg OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES ALLOWED_DATABASES = my_iceberg_database ALLOWED_EXTERNAL_VOLUMES = my_external_volume ALLOWED_ACCOUNTS = myorg.my_account_1;
注釈
SQL パーサーエラーを受け取った場合、許可された外部ボリュームのリストが長すぎる可能性があります。このエラーが表示された場合は、CREATE REPLICATION GROUP ステートメントでリストを短くしてから、ALTER REPLICATION GROUP コマンドを使用して複製グループに追加の許可された外部ボリュームを追加します。
既存のグループを更新するには、ALTER REPLICATION GROUP コマンドを使用して
EXTERNAL VOLUMESをOBJECT_TYPESリストに追加します。ターゲットアカウントでこれらのオブジェクトのドロップを回避するために、他の既存のオブジェクトもOBJECT_TYPESリストに含めます。たとえば、
EXTERNAL VOLUMESを既にDATABASESを含む複製グループに追加します。ALTER REPLICATION GROUP my_iceberg_rg SET OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES ALLOWED_EXTERNAL_VOLUMES = my_external_volume;
ターゲットアカウントで、ソースアカウントのグループのレプリカとして複製グループを作成します(
my_source_account)CREATE REPLICATION GROUP my_iceberg_rg AS REPLICA OF myorg.my_source_account.my_iceberg_rg;
ソースアカウントのグループを複製するセカンダリグループがすでにある場合は、この手順をスキップしてください。
ターゲットアカウントで、更新コマンドを実行します。
ALTER REPLICATION GROUP my_iceberg_rg REFRESH;
Snowflake管理のIcebergテーブルを含むデータベースを複製し、ターゲットアカウントのクラウドストレージへのアクセスを構成している限り、Snowflakeはターゲットアカウントのテーブルを複製します。
注釈
Snowflakeがターゲットアカウント用に構成されたストレージの場所にアクセスできない場合は、リフレッシュ操作に失敗します。これが発生した場合は、アクセス制御設定を再確認するか、ストレージへのアクセスの確認 を試してください。
考慮事項と制約¶
Icebergテーブルの複製を使用する場合は、次の点に留意してください。
Snowflakeは現在、Snowflake管理テーブルの複製のみをサポートしています。
変換されたIcebergテーブルの複製はサポートされていません。Snowflakeは、リフレッシュ操作中に変換されたテーブルをスキップします。
複製されたテーブルの場合は、ターゲットアカウントと 同じリージョン にあるストレージの場所へのアクセスを構成する必要があります。
プライマリ外部ボリュームで複製に使用されているストレージの場所をドロップまたは変更すると、リフレッシュ操作に失敗する可能性があります。
ターゲットアカウントのセカンダリテーブルは、ターゲットアカウントをソースアカウントとして機能するように昇格させるまで読み取り専用です。
Snowflakeは、プライマリIcebergテーブルの ディレクトリ階層 をセカンダリテーブル用に維持します。
この機能には、複製コストが適用されます。詳細については、 複製コストについて をご参照ください。
複製グループとフェールオーバーグループのアカウントオブジェクトに関する考慮事項については、 アカウントオブジェクト をご参照ください。