Icebergテーブル用に外部ボリュームを構成する

このトピックでは、Icebergテーブル用に 外部ボリューム を構成するのに役立つ情報を提供します。

次のクラウドストレージサービス用に外部ボリュームを作成できます。

Amazon S3用の外部ボリュームを構成する

このセクションでは、外部ボリュームを使用してSnowflakeに独自のAmazon S3バケットへの制限付きアクセスを許可する方法について説明します。

組織の管理者が、Amazon Web Services(AWS)アカウントで IAM ユーザーに権限を付与します。

注釈

  • Snowflakeは、ドットを含むバケット名(例えば、 my.s3.bucket)を持つ外部ボリュームをサポートできません。S3内のデータにアクセスするために、Snowflakeは仮想ホストスタイルのパスと HTTPS を使用します。しかし、S3は名前にドットを含む仮想ホストスタイルのバケットでは SSL をサポートしません。

  • このセクションの手順を完了するには、 IAM ポリシーとロールを作成および管理するための AWS での権限が必要です。AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するように依頼します。

  • データ復旧をサポートするには、 外部クラウドストレージの場所のバージョン管理を有効にします

ステップ1: S3バケットのアクセス許可を構成する

AWS アクセス制御の要件

フォルダーとサブフォルダー内のファイルにアクセスするには、SnowflakeではS3バケットとフォルダーに対する次の権限が必要です。

  • s3:DeleteObject

  • s3:DeleteObjectVersion

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

  • s3:PutObject

注釈

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

ベストプラクティスとして、SnowflakeはSnowflakeにS3バケットへのアクセスを許可する指定の IAM ポリシーの作成をお勧めします。その後、ポリシーをロールに添付し、ロールのために AWS によって生成されたセキュリティ認証情報を使用して、バケット内のファイルにアクセスできます。

IAM ポリシーを作成する

AWS 管理コンソールでSnowflakeのアクセス許可を設定するには、次の手順を実行します。

  1. AWS 管理コンソールにログインします。

  2. ホームダッシュボードから、 Identity & Access Management (IAM)を選択します。

    Identity & Access Management in AWS Management Console
  3. 左側のナビゲーションペインから Account settings を選択します。

  4. Security Token Service Regions リストに、アカウントが存在するSnowflake リージョン が表示されています。ステータスが Inactive の場合は Activate を選択します。

  5. 左側のナビゲーションペインから Policies を選択します。

  6. Create Policy を選択します。

    Create Policy button on Policies page
  7. JSON タブを選択します。

  8. SnowflakeにS3バケットとフォルダーへのアクセスを許可するポリシーを追加します。

    AWS ポリシーは、さまざまなセキュリティユースケースをサポートします。次のポリシー(JSON 形式)は、単一のバケットとフォルダーパスを使用して、データの読み取りと書き込みに必要な権限をSnowflakeに提供します。

    テキストをコピーしてポリシーエディターに貼り付けます。

    注釈

    • bucketprefix を実際のバケット名とフォルダーパスプレフィックスに置き換えます。

    • 政府リージョン のバケットのAmazonリソースネーム(ARN)には、 arn:aws-us-gov:s3::: プレフィックスがあります。

    • "s3:prefix": 条件を ["*"] または ["prefix/*"] のいずれかに設定すると、指定されたバケットまたはバケットのパス内のすべてのプレフィックスへのアクセスがそれぞれ許可されます。

    {
       "Version": "2012-10-17",
       "Statement": [
             {
                "Effect": "Allow",
                "Action": [
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:GetObjectVersion",
                   "s3:DeleteObject",
                   "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket>/<prefix>/*"
             },
             {
                "Effect": "Allow",
                "Action": [
                   "s3:ListBucket",
                   "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                   "StringLike": {
                         "s3:prefix": [
                            "<prefix>/*"
                         ]
                   }
                }
             }
       ]
    }
    
    Copy
  9. Review policy を選択します。

  10. ポリシー Name (例えば、 snowflake_access)とオプションの Description を入力します。

    Create Policy button in Review Policy page
  11. Create policy を選択します。

ステップ2: AWS で IAM ロールを作成する

AWS 管理コンソールで、 AWS IAM ロールを作成して、データファイルを含むS3バケットに対する権限を付与します。

  1. AWS 管理コンソールにログインします。

  2. ホームダッシュボードから、 Identity & Access Management (IAM)を選択します。

    Identity & Access Management in AWS Management Console
  3. 左側のナビゲーションペインから Roles を選択します。

  4. Create role を選択します。

    Select Trusted Entity Page in AWS Management Console
  5. 信頼できるエンティティタイプでは、 Another AWS account を選択します。

  6. Account ID フィールドに、自分の AWS アカウント ID を入力します。後のステップで、信頼関係を変更し、Snowflake にアクセスを許可します。

  7. Require external ID オプションを選択します。 0000 などのプレースホルダー ID を入力します。後のステップで、信頼関係を変更し、外部ボリュームに外部 ID を指定します。外部 ID は、Snowflakeなどのサードパーティに AWS リソース(S3バケットなど)へのアクセスを許可するために必要です。

  8. Next を選択します。

  9. ステップ1: S3バケットのアクセス許可を構成する で作成したポリシーを探し、このポリシーを選択します。

  10. Next を選択します。

    Review Page in AWS Management Console
  11. ロールの名前と説明を入力し、 Create role を選択します。これで、バケットの IAM ポリシー、および IAM ロールを作成し、ロールにポリシーを添付しました。

  12. ロールの概要ページにある Role ARN 値を見つけて記録します。次のステップでこの値を使用して、このロールを参照するSnowflake外部ボリュームを作成します。

    IAM Role

ステップ3: SSE-KMS 暗号化に必要な権限を IAM ロールに付与する(オプション)

AWS KMS キーで暗号化されたオブジェクトをAmazon S3にアップロードするには、 ステップ2: AWS で IAM ロールを作成する で作成した IAM ロールにキーに対する kms:GenerateDataKey 権限が必要です。AWS KMS キーで暗号化されたオブジェクトをダウンロードするには、 IAM ロールにキーに対する kms:Decrypt 権限が必要です。

サーバー側の暗号化に KMS キーを使う場合、これらのステップに従ってキーを作成し、参照します。

  1. AWS 管理コンソールで、 KMS サービスに移動します。左のナビゲーションから Customer managed keys を選択し、次に Create key を選択します。バケットと同じリージョンにキーを作成する必要があります。

  2. 対称キー型を作成します。キーの使い方に、 Encrypt and decrypt を選択します。 Next を選択します。

  3. Alias ボックスでキーの名前を作成し、 Next を選択します。

  4. 必要であれば、キーの管理者を指定し、 Next を選択します。

  5. Define key usage permissions ステップで、 IAM ロールの名前を入力します。ロールの横にあるチェックボックスを選択し、 Next を選択します。

  6. Finish を選択してキーを作成します。

  7. 顧客管理キーのリストからキーを見つけて選択し、その ARN を記録します。以下はキーの ARN の例です: arn:aws:kms:us-west-2:111111122222:key/1a1a11aa-aa1a-aaa1a-a1a1-000000000000

    外部ボリュームを作成する際に、 KMS_KEY_ID 値をキーの ARN に設定します。

ステップ4: Snowflakeで外部ボリュームを作成する

CREATE EXTERNAL VOLUME コマンドを使用して外部ボリュームを作成します。

注釈

アカウント管理者(ACCOUNTADMIN ロールを持つユーザー)のみが、この SQL コマンドを実行できます。

次の例は、暗号化されたAmazon S3ストレージの場所を定義する外部ボリュームを作成しています。

CREATE OR REPLACE EXTERNAL VOLUME exvol
   STORAGE_LOCATIONS =
      (
         (
            NAME = 'my-s3-us-west-2'
            STORAGE_PROVIDER = 'S3'
            STORAGE_BASE_URL = 's3://MY_EXAMPLE_BUCKET/'
            STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/myrole'
            ENCRYPTION=(TYPE='AWS_SSE_KMS' KMS_KEY_ID='arn:aws:kms:us-west-2:111111122222:key/1a1a11aa-aa1a-aaa1a-a1a1-000000000000')
         )
      );
Copy

ステップ5: Snowflakeアカウントの AWS IAM ユーザーを取得する

  1. Snowflakeアカウント用に自動的に作成された AWS IAM ユーザーの ARN を取得するには、 DESCRIBE EXTERNAL VOLUME コマンドを使用します。以前に作成した外部ボリュームの名前を指定します。

    例:

    DESC EXTERNAL VOLUME exvol;
    
    Copy
  2. 次のプロパティの値を記録します。

    プロパティ

    説明

    STORAGE_AWS_IAM_USER_ARN

    Snowflakeアカウント用に作成された AWS IAM ユーザー。例えば、 arn:aws:iam::123456789001:user/abc1-b-self1234。Snowflakeは、Snowflakeアカウント全体用に単一の IAM ユーザーをプロビジョニングします。アカウント内のすべてのS3外部ボリュームは、その IAM ユーザーを使用します。

    STORAGE_AWS_EXTERNAL_ID

    信頼関係を確立するために必要な外部 ID 。

    これらの値は次のステップで提供します。

ステップ6: バケットオブジェクトにアクセスするために IAM ユーザー権限を付与する

このステップでは、Snowflakeアカウントの IAM ユーザーがS3バケットのオブジェクトにアクセスできるように権限を設定します。

  1. AWS 管理コンソールにログインします。

  2. Identity & Access Management (IAM)を選択します。

    Identity & Access Management in AWS Management Console
  3. 左側のナビゲーションペインから Roles を選択します。

  4. ステップ2: AWS で IAM ロールを作成する で作成したロールを選択します。

  5. Trust relationships タブを選択します。

  6. Edit trust relationship を選択します。

  7. ポリシードキュメントを ステップ5: Snowflakeアカウントの AWS IAM ユーザーを取得する に記録した出力値で変更します。

    IAM ロールのポリシードキュメント

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<snowflake_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<snowflake_external_id>"
            }
          }
        }
      ]
    }
    
    Copy

    条件:

    • snowflake_user_arn は、記録した STORAGE_AWS_IAM_USER_ARN 値です。

    • snowflake_external_id は、記録した STORAGE_AWS_EXTERNAL_ID 値です。

    注釈

    新しい外部ボリュームを作成する(または CREATE OR REPLACE EXTERNAL VOLUME 構文を使用して既存の外部ボリュームを再作成する)場合は、このポリシードキュメントを更新する必要があります。セキュリティ上の理由から、新規または再作成された外部ボリュームは異なる外部 ID を持ち、この信頼ポリシーを更新しない限り、信頼関係を解決できません。

  8. Update Trust Policy を選択します。変更が保存されます。

注釈

権限が正しく設定されていることを確認するために、この外部ボリュームを使用して Icebergテーブルを作成 します。この外部ボリュームを参照する最初のIcebergテーブルを作成するまで、Snowflakeは権限が正しく設定されているかどうかを確認しません。

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

このセクションでは、外部ボリュームを使用してSnowflakeにGoogle Cloud Storage(GCS)バケットへの制限付きアクセスを許可する方法について説明します。

組織の管理者がGoogle Cloudアカウントで IAM ユーザーに権限を付与します。

注釈

ステップ1: Snowflakeで外部ボリュームを作成する

CREATE EXTERNAL VOLUME コマンドを使用して外部ボリュームを作成します。

注釈

アカウント管理者(ACCOUNTADMIN ロールを持つユーザー)のみが、この SQL コマンドを実行できます。

次の例は、暗号化された GCS ストレージの場所を定義する外部ボリュームを作成しています。

CREATE EXTERNAL VOLUME exvol
  STORAGE_LOCATIONS =
    (
      (
        NAME = 'my-us-east-1'
        STORAGE_PROVIDER = 'GCS'
        STORAGE_BASE_URL = 'gcs://mybucket1/path1/'
        ENCRYPTION=(TYPE='GCS_SSE_KMS' KMS_KEY_ID = '1234abcd-12ab-34cd-56ef-1234567890ab')
      )
    );
Copy

ステップ2: Snowflakeアカウント用のCloud Storageサービスアカウントを取得する

Snowflakeアカウント用に自動的に作成されたCloud Storageサービスアカウントの ID を取得するには、 DESCRIBE EXTERNAL VOLUME コマンドを使用します。以前に作成した外部ボリュームの名前を指定します。

例:

DESC EXTERNAL VOLUME exvol;
Copy

出力に STORAGE_GCP_SERVICE_ACCOUNT プロパティの値を記録します(例えば、 service-account-id@project1-123456.iam.gserviceaccount.com)。

Snowflakeは、Snowflakeアカウント全体に単一のCloud Storageサービスアカウントをプロビジョニングします。すべてのGoogle Cloud Storage外部ボリュームは、そのサービスアカウントを使用します。

ステップ3: バケットオブジェクトにアクセスするためのサービスアカウント権限を付与する

このステップでは、Google Cloud Platform ConsoleでSnowflakeの IAM アクセス許可を構成します。

カスタム IAM ロールを作成する

バケットにアクセスしてオブジェクトを取得するために必要な権限を持つカスタムロールを作成します。

  1. プロジェクトエディターとしてGoogle Cloud Platform Consoleにログインします。

  2. ホームダッシュボードから、 IAM & admin » Roles を選択します。

  3. Create Role を選択します。

  4. カスタムロールの名前と説明を入力します。

  5. Add Permissions を選択します。

  6. 権限のリストをフィルターし、リストから次を追加します。

    • storage.buckets.get

    • storage.objects.create

    • storage.objects.delete

    • storage.objects.get

    • storage.objects.list

  7. Create を選択します。

Cloud Storage Serviceアカウントにカスタムロールを割り当てる

  1. プロジェクトエディターとしてGoogle Cloud Platform Consoleにログインします。

  2. ホームダッシュボードから、 Storage » Browser を選択します。

    Bucket List in Google Cloud Platform Console
  3. アクセス用に構成するバケットを選択します。

  4. 右上隅の SHOW INFO PANEL を選択します。バケットの情報パネルが表示されます。

  5. Add members フィールドで、 ステップ2: Snowflakeアカウント用のCloud Storageサービスアカウントを取得する の出力からサービスアカウント名を検索します。

    Bucket Information Panel in Google Cloud Platform Console
  6. Select a role ドロップダウンから、 Storage » Custom » <ロール> を選択します。 <ロール>カスタム IAM ロールを作成する で作成したカスタムCloud Storageロールです。

  7. Add を選択します。サービスアカウント名は、情報パネルの Storage Object Viewer ロールドロップダウンに追加されます。

    Storage Object Viewer role list in Google Cloud Platform Console

注釈

権限が正しく設定されていることを確認するために、この外部ボリュームを使用して Icebergテーブルを作成 します。この外部ボリュームを参照する最初のIcebergテーブルを作成するまで、Snowflakeは権限が正しく設定されているかどうかを確認しません。

Cloud StorageサービスアカウントにCloud Key Management Serviceの暗号化キーに対するアクセス権限を付与する

注釈

この手順は、Google Cloud Key Management Service(Cloud KMS)に保存されているキーを使用して GCS バケットが暗号化されている 場合にのみ 必要です。

  1. プロジェクトエディターとしてGoogle Cloud Platform Consoleにログインします。

  2. ホームダッシュボードから、 Security » Cryptographic keys を選択します。

  3. GCS バケットに割り当てられているキーリングを選択します。

  4. 右上隅の SHOW INFO PANEL を選択します。キーリングの情報パネルが表示されます。

  5. Add members フィールドで、 ステップ2: Snowflakeアカウント用のCloud Storageサービスアカウントを取得する の DESCRIBE EXTERNAL VOLUME 出力からサービスアカウント名を検索します。

  6. Select a role ドロップダウンから、 Cloud KMS CryptoKey Encrypter/Decrypter ロールを選択します。

  7. Add を選択します。サービスアカウント名は、情報パネルの Cloud KMS CryptoKey Encrypter/Decrypter ロールドロップダウンに追加されます。

Azure Storageの外部ボリュームを構成する

このセクションでは、外部ボリュームを使用してSnowflakeに独自のMicrosoft Azure(Azure)コンテナへ制限付きアクセスを許可する方法について説明します。Snowflakeは、外部ボリュームで次のAzureクラウドストレージサービスをサポートしています。

  • BLOBストレージ

  • Data Lake Storage Gen2

  • 汎用v1

  • 汎用v2

組織の管理者がAzureアカウントで IAM ユーザーに権限を付与します。

注釈

ステップ1: Snowflakeで外部ボリュームを作成する

CREATE EXTERNAL VOLUME コマンドを使用して外部ボリュームを作成します。

注釈

アカウント管理者(ACCOUNTADMIN ロールを持つユーザー)のみが、この SQL コマンドを実行できます。

次の例は、暗号化されたAzureストレージの場所を定義する外部ボリュームを作成しています。

CREATE EXTERNAL VOLUME exvol
  STORAGE_LOCATIONS =
    (
      (
        NAME = 'my-azure-northeurope'
        STORAGE_PROVIDER = 'AZURE'
        STORAGE_BASE_URL = 'azure://exampleacct.blob.core.windows.net/my_container_northeurope/'
        AZURE_TENANT_ID = 'a123b4c5-1234-123a-a12b-1a23b45678c9'
      )
    );
Copy

ステップ2: Snowflakeにストレージの場所へのアクセスを許可する

  1. Microsoftの許可リクエストページへの URL を取得するには、 DESCRIBE EXTERNAL VOLUME コマンドを使用します。以前に作成した外部ボリュームの名前を指定します。

    DESC EXTERNAL VOLUME exvol;
    
    Copy

    次のプロパティの値を記録します。

    プロパティ

    説明

    AZURE_CONSENT_URL

    Microsoftのアクセス許可リクエストページへの URL。

    AZURE_MULTI_TENANT_APP_NAME

    アカウント用に作成されたSnowflakeクライアントアプリケーションの名前。このセクションの後半のステップでは、このアプリケーションに許可されたストレージの場所でアクセストークンを取得するための権限を付与します。

    これらの値は次のステップで使用します。

  2. ウェブブラウザーで、Microsoftの許可リクエストページ(AZURE_CONSENT_URL)に移動します。

  3. Accept を選択します。このアクションにより、Snowflakeアカウント用に作成されたAzureサービスプリンシパルは、テナント内のリソースでアクセストークンを取得できます。アクセストークンの取得は、コンテナーに対する適切なアクセス許可をサービスプリンシパルに付与した場合にのみ成功します(次のステップを参照)。

    Microsoftの権限リクエストページは、Snowflakeの企業サイト(snowflake.com)にリダイレクトされます。

  4. Microsoft Azureポータルにログインします。

  5. Azure Services » Storage Accounts に移動します。Snowflakeサービスプリンシパルにアクセスを許可するストレージアカウント名を選択します。

    注釈

    外部ボリュームの IAM 権限はコンテナレベルではなく、ストレージアカウントレベルで設定する必要があります。

  6. Access Control (IAM) » Add role assignment を選択します。

  7. Storage Blob Data Contributor ロールを選択して、Snowflakeサービスプリンシパルに読み取りと書き込みのアクセスを許可します。

    注釈

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

  8. Snowflakeサービスプリンシパルを検索します。これは DESC EXTERNAL VOLUME 出力(ステップ1)の AZURE_MULTI_TENANT_APP_NAME プロパティにあるIDです。AZURE_MULTI_TENANT_APP_NAME プロパティで、アンダースコアの 前にある 文字列を検索します。

    重要

    • このセクションのMicrosoftリクエストページでリクエストされたSnowflakeサービスプリンシパルをAzureが作成するのに、1時間以上かかる場合があります。サービスプリンシパルがすぐに利用できない場合は、1~2時間待ってから、もう一度検索してください。

    • サービスプリンシパルを削除すると、外部ボリュームは機能しなくなります。

    Add role assignment in Azure Storage Console
  9. Review + assign を選択します。

    注釈

    ロールを割り当てると、変更が有効になるまで最大10分かかることがあります。詳細については、Microsoft Azureドキュメントの 症状 - ロールの割り当て変更が検出されない をご参照ください。

注釈

権限が正しく設定されていることを確認するために、この外部ボリュームを使用して Icebergテーブルを作成 します。この外部ボリュームを参照する最初のIcebergテーブルを作成するまで、Snowflakeは権限が正しく設定されているかどうかを確認しません。

外部クラウドストレージのバージョン管理を有効にする

Icebergテーブルのデータは、お客様が管理する外部クラウドストレージに保管されます。データが複数のツールやサービスによって操作されるセントラルデータリポジトリ(またはデータレイク)にある場合、偶発的な削除や破損が発生する可能性があります。

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

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

プレビュー期間中、各外部ボリュームは1つのアクティブなストレージの場所をサポートします。アクティブな場所は、外部ボリュームの有効期間中、同じままです。

外部ボリュームを作成する 際に複数のストレージの場所を指定する場合、Snowflakeは1つの場所を外部ボリュームのアクティブな場所として割り当てます。

割り当てが発生するのは、外部ボリュームを使用する最初のテーブルが作成されたときです。Snowflakeは、以下のロジックを使用してアクティブな場所を選択します。

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

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

注釈

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

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

アカウントまたはオブジェクトレベルで外部ボリュームを設定する

Icebergテーブルに使用する既存の外部ボリュームを定義するには、 EXTERNAL_VOLUME パラメーターを次のレベルで設定することができます。

アカウント

アカウント管理者は ALTER ACCOUNT コマンドを使用して、アカウントのパラメーターを設定できます。この値がアカウントに設定されている場合、そのアカウントで作成されたすべてのIcebergテーブルはデフォルトでこの外部ボリュームを読み取り、書き込みます。

オブジェクト

ユーザーは適切な CREATE <オブジェクト> または ALTER <オブジェクト> コマンドを実行して、データベース、スキーマ、またはIcebergテーブルレベルで EXTERNAL_VOLUME パラメーター値を上書きできます。宣言の有効範囲が最も低いもの(テーブル > スキーマ > データベース > アカウント)が使用されます。

適切な ALTER <object_type_> コマンドを使用してオブジェクトを変更するために必要な最小権限に加えて、ロールには外部ボリュームに対して USAGE 権限が必要です。