Snowflake管理 Apache Iceberg™ テーブルの複製を設定する

この機能を使用すると、Snowflake管理のApache Iceberg™テーブル をソースアカウントから同じ組織内にある1つ以上のターゲットアカウントに複製できます。

Icebergテーブルの複製は、通常のSnowflakeテーブルの複製と同様に機能します。親データベースをフェールオーバーグループまたは複製グループに追加すると、SnowflakeはIcebergテーブルを複製します。

ただし、Snowflake管理のIcebergテーブルは外部ボリュームに依存しています。これはアカウントレベルのオブジェクトであり、外部クラウドストレージに接続するために追加の構成が必要です。Icebergテーブルの複製を作成する前に、外部ボリュームの複製を構成する必要があります。

Snowflake管理のIcebergテーブルの複製のパブリックプレビューにオプトイン

このパブリックプレビューにオプトインするには、ソースアカウントとターゲットアカウントの両方でオプトインする必要があります。

  1. ソースアカウントをオプトインするには、アカウントで プレビュー機能を有効化 した後、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;
    
    Copy
  2. ターゲットアカウントについて前のステップを繰り返します。

複製を有効化

ORGADMIN ロールを持つユーザーは、組織内のソースとターゲットの各アカウントで複製を有効にする必要があります。

USE ROLE ORGADMIN;
SELECT SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER(
    '<organization_name>.<account_name>',
    'ENABLE_ACCOUNT_DATABASE_REPLICATION',
    'true');
Copy

詳しくは、 組織内のアカウントで複製を有効にする を参照してください。

複製について詳しくは、 複数のアカウント間にわたる複製とフェールオーバーの概要 をご覧ください。

フェールオーバーグループを使用した外部ボリュームの複製

これらの手順は、フェールオーバーグループを使用して、外部ボリュームとそれが依存するIcebergテーブルをターゲットアカウントに複製するためのサンプルワークフローを提供します。

重要

ソースアカウントのフェールオーバーグループに外部ボリュームが含まれている場合、Snowflakeはリフレッシュ操作中に、ターゲットアカウントから ターゲット アカウント内の既存の外部ボリュームをドロップします。

例:

  • ソースアカウントには、ext_vol_1 という名前の外部ボリュームが1つあります。

  • ターゲットアカウントには、ext_vol_2 および ext_vol_3 という名前の2つの外部ボリュームがあります。

リフレッシュ操作中に、Snowflakeはターゲットアカウント上で ext_vol_1 のレプリカを作成または同期しますが、ターゲットアカウントから ext_vol_2 および ext_vol_3 がドロップされます。

注釈

まだ外部ボリュームをお持ちでない場合は、ターゲットアカウントと 同じリージョン にある場所を含め、希望のストレージ場所で外部ボリュームを作成できます。各場所のストレージアクセスを構成した後、外部ボリュームを参照するIcebergテーブルを作成し、複製できます。

外部ボリュームを作成するには、 外部ボリュームの構成 をご参照ください。

  1. ソースアカウントで、外部ボリュームを更新して、ターゲットアカウントと 同じリージョン にあるストレージの場所を追加します。

    例:

    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'
     );
    
    Copy

    重要

    S3ストレージで自分の STORAGE_AWS_EXTERNAL_ID を指定しない場合、Snowflakeが生成した外部 ID を取得するために、新しいストレージの場所を追加した後に DESCRIBE EXTERNAL VOLUME を呼び出す必要があります。次のステップでS3へのアクセスを構成するために外部 ID が必要です。

    Snowflakeは、この新しい場所をセカンダリ外部ボリュームの アクティブなストレージの場所 として設定します。

  2. ソースアカウントで、追加のストレージ場所で更新した外部ボリュームを使用する、Snowflake管理のIcebergテーブルを作成します。

    例:

    CREATE ICEBERG TABLE my_iceberg_table (amount int)
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'exvol1'
      BASE_LOCATION = 'my_iceberg_table';
    
    Copy
  3. ソースアカウントで、ターゲットアカウントSnowflakeサービスプリンシパル に関する情報を取得するには、次のステップに従います。

    1. SHOW REPLICATION ACCOUNTS コマンドを使用して、ターゲットアカウントの名前(account_name)を取得します。

      SHOW REPLICATION ACCOUNTS LIKE 'my_target_account%';
      
      Copy
    2. SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY システム関数を呼び出します。ターゲットストレージの場所のクラウドプロバイダーと、SHOWREPLICATIONACCOUNTS 出力の account_name 列に表示されるとおりにターゲットアカウントの名前を 正確に 指定します。

      例:

      SELECT SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY('S3', 'MY_TARGET_ACCOUNT_1');
      
      Copy
  4. ターゲットアカウントに関連付けられたストレージ場所へのSnowflakeアクセスを構成します。ターゲットアカウントのサービスプリンシパル用に取得した情報を使って、クラウドプロバイダーの手順に従います。

    • :doc:`/user-guide/tables-iceberg-configure-external-volume-s3`ターゲットアカウントのストレージ場所に関連付けられた外部 ID を使用します。

    • Google Cloud Storageの外部ボリュームを構成する

    • /user-guide/tables-iceberg-configure-external-volume-azure`SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY によって返される :code:`AZURE_CONSENT_URL TEMPLATE で、your_tenant_id をストレージの場所が属するテナントの ID に置き換えます。

  5. ソースアカウントで、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;
    
    Copy

    注釈

    SQL パーサーエラーを受け取った場合、許可された外部ボリュームのリストが長すぎる可能性があります。このエラーが表示された場合は、CREATEFAILOVERGROUP ステートメントでリストを短くしてから、ALTER FAILOVER GROUP コマンドを使用してフェールオーバーグループに追加の許可された外部ボリュームを追加します。

    既存のグループを更新するには、ALTER FAILOVER GROUP コマンドを使用して EXTERNAL VOLUMESOBJECT_TYPES リストに追加します。ターゲットアカウントでこれらのオブジェクトのドロップを回避するために、他の既存のオブジェクトも OBJECT_TYPES リストに含めます。

    たとえば、EXTERNAL VOLUMES を既に DATABASES を含むフェールオーバーグループに追加します。

    ALTER FAILOVER GROUP my_iceberg_rg SET
      OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES
      ALLOWED_EXTERNAL_VOLUMES = my_external_volume;
    
    Copy
  6. ターゲットアカウントで、ソースアカウントのグループのレプリカとしてフェールオーバーグループを作成します(my_source_account

    CREATE FAILOVER GROUP my_iceberg_fg
      AS REPLICA OF myorg.my_source_account.my_iceberg_fg;
    
    Copy

    ソースアカウントのグループを複製するセカンダリグループがすでにある場合は、この手順をスキップしてください。

  7. ターゲットアカウントで、更新コマンドを実行します。

    ALTER FAILOVER GROUP my_iceberg_fg REFRESH;
    
    Copy

    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テーブルを作成し、複製できます。

外部ボリュームを作成するには、 外部ボリュームの構成 をご参照ください。

  1. ソースアカウントで、外部ボリュームを更新して、ターゲットアカウントと 同じリージョン にあるストレージの場所を追加します。

    例:

    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'
     );
    
    Copy

    重要

    S3ストレージで自分の STORAGE_AWS_EXTERNAL_ID を指定しない場合、Snowflakeが生成した外部 ID を取得するために、新しいストレージの場所を追加した後に DESCRIBE EXTERNAL VOLUME を呼び出す必要があります。次のステップでS3へのアクセスを構成するために外部 ID が必要です。

    Snowflakeは、この新しい場所をセカンダリ外部ボリュームの アクティブなストレージの場所 として設定します。

  2. ソースアカウントで、追加のストレージ場所で更新した外部ボリュームを使用する、Snowflake管理のIcebergテーブルを作成します。

    例:

    CREATE ICEBERG TABLE my_iceberg_table (amount int)
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'exvol1'
      BASE_LOCATION = 'my_iceberg_table';
    
    Copy
  3. ソースアカウントで、ターゲットアカウントSnowflakeサービスプリンシパル に関する情報を取得するには、次のステップに従います。

    1. SHOW REPLICATION ACCOUNTS コマンドを使用して、ターゲットアカウントの名前(account_name)を取得します。

      SHOW REPLICATION ACCOUNTS LIKE 'my_target_account%';
      
      Copy
    2. SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY システム関数を呼び出します。ターゲットストレージの場所のクラウドプロバイダーと、SHOWREPLICATIONACCOUNTS 出力の account_name 列に表示されるとおりにターゲットアカウントの名前を 正確に 指定します。

      例:

      SELECT SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY('S3', 'MY_TARGET_ACCOUNT_1');
      
      Copy
  4. ターゲットアカウントに関連付けられたストレージ場所へのSnowflakeアクセスを構成します。ターゲットアカウントのサービスプリンシパル用に取得した情報を使って、クラウドプロバイダーの手順に従います。

    • :doc:`/user-guide/tables-iceberg-configure-external-volume-s3`ターゲットアカウントのストレージ場所に関連付けられた外部 ID を使用します。

    • Google Cloud Storageの外部ボリュームを構成する

    • /user-guide/tables-iceberg-configure-external-volume-azure`SYSTEM$DESC_ICEBERG_ACCESS_IDENTITY によって返される :code:`AZURE_CONSENT_URL TEMPLATE で、your_tenant_id をストレージの場所が属するテナントの ID に置き換えます。

  5. ソースアカウントで、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;
    
    Copy

    注釈

    SQL パーサーエラーを受け取った場合、許可された外部ボリュームのリストが長すぎる可能性があります。このエラーが表示された場合は、CREATE REPLICATION GROUP ステートメントでリストを短くしてから、ALTER REPLICATION GROUP コマンドを使用して複製グループに追加の許可された外部ボリュームを追加します。

    既存のグループを更新するには、ALTER REPLICATION GROUP コマンドを使用して EXTERNAL VOLUMESOBJECT_TYPES リストに追加します。ターゲットアカウントでこれらのオブジェクトのドロップを回避するために、他の既存のオブジェクトも OBJECT_TYPES リストに含めます。

    たとえば、EXTERNAL VOLUMES を既に DATABASES を含む複製グループに追加します。

    ALTER REPLICATION GROUP my_iceberg_rg SET
      OBJECT_TYPES = DATABASES, EXTERNAL VOLUMES
      ALLOWED_EXTERNAL_VOLUMES = my_external_volume;
    
    Copy
  6. ターゲットアカウントで、ソースアカウントのグループのレプリカとして複製グループを作成します(my_source_account

    CREATE REPLICATION GROUP my_iceberg_rg
      AS REPLICA OF myorg.my_source_account.my_iceberg_rg;
    
    Copy

    ソースアカウントのグループを複製するセカンダリグループがすでにある場合は、この手順をスキップしてください。

  7. ターゲットアカウントで、更新コマンドを実行します。

    ALTER REPLICATION GROUP my_iceberg_rg REFRESH;
    
    Copy

    Snowflake管理のIcebergテーブルを含むデータベースを複製し、ターゲットアカウントのクラウドストレージへのアクセスを構成している限り、Snowflakeはターゲットアカウントのテーブルを複製します。

    注釈

    Snowflakeがターゲットアカウント用に構成されたストレージの場所にアクセスできない場合は、リフレッシュ操作に失敗します。これが発生した場合は、アクセス制御設定を再確認するか、ストレージへのアクセスの確認 を試してください。

考慮事項と制約

Icebergテーブルの複製を使用する場合は、次の点に留意してください。

  • Snowflakeは現在、Snowflake管理テーブルの複製のみをサポートしています。

  • 変換されたIcebergテーブルの複製はサポートされていません。Snowflakeは、リフレッシュ操作中に変換されたテーブルをスキップします。

  • 複製されたテーブルの場合は、ターゲットアカウントと 同じリージョン にあるストレージの場所へのアクセスを構成する必要があります。

  • プライマリ外部ボリュームで複製に使用されているストレージの場所をドロップまたは変更すると、リフレッシュ操作に失敗する可能性があります。

  • ターゲットアカウントのセカンダリテーブルは、ターゲットアカウントをソースアカウントとして機能するように昇格させるまで読み取り専用です。

  • Snowflakeは、プライマリIcebergテーブルの ディレクトリ階層 をセカンダリテーブル用に維持します。

  • この機能には、複製コストが適用されます。詳細については、 複製コストについて をご参照ください。

  • 複製グループとフェールオーバーグループのアカウントオブジェクトに関する考慮事項については、 アカウントオブジェクト をご参照ください。