Amazon S3用の外部ボリュームを構成する¶
Snowflakeの Apache Iceberg™ テーブル用の外部ボリュームを使用して、Amazon S3バケットへの制限付きアクセスをSnowflakeに付与します。
ベストプラクティスとして、S3ロケーションへのSnowflakeアクセスを許可する指定IAMポリシーを作成します。その後、ポリシーをロールに添付し、ロールのために AWS によって生成されたセキュリティ認証情報を使用して、ファイルにアクセスできます。
注釈
セキュリティ体制を強化するため、ネットワークトラフィックにパブリックインターネットではなくプライベート接続を使用するように外部ボリュームを構成できます。詳細については、 AWS の外部ボリュームへのプライベート接続 をご参照ください。
前提条件¶
外部ボリュームを構成する前に、以下のものが必要です。
- S3ストレージバケット。 - 外部管理Icebergテーブルに外部ボリュームを使用するには、すべてのテーブルデータとメタデータファイルをSnowflakeアカウントをホストするバケットに配置する必要があります。 
- Snowflakeは、ドットを含むS3バケット名を持つ外部ボリュームをサポートできません(例えば、 - my.s3.bucket)。S3は、名前にドットが含まれる仮想ホスト形式のバケットの SSL をサポートしておらず、Snowflakeは仮想ホスト形式のパスと HTTPS を使用してS3のデータにアクセスします。
- データ復旧をサポートするには、 外部クラウドストレージの場所のバージョン管理を有効にします。 
 
- IAM ポリシーとロールの作成および管理のための AWS での権限。AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するように依頼します。 
ステップ1:S3ロケーションへのアクセスを許可するIAMポリシーを作成します。¶
AWS 管理コンソールでSnowflakeのアクセス許可を設定するには、次の手順を実行します。
- AWS 管理コンソールにログインします。 
- ホームダッシュボードから、 IAM を検索して選択します。 
- 左側のナビゲーションペインから Account settings を選択します。 
- Endpoints リストの Security Token Service (STS) で、ご使用のアカウントが存在するSnowflake リージョン を見つけます。STS status がアクティブでない場合は、トグルを Active に動かします。 
- 左側のナビゲーションペインから Policies を選択します。 
- Create Policy を選択します。   
- Policy editor には、 JSON を選択します。 
- S3ロケーションへのデータの読み取りと書き込みに必要なアクセス許可をSnowflakeに提供するポリシーを追加します。 - 次のポリシー例は、指定したバケット内のすべての場所へのアクセスを許可します。 - 注釈 - my_bucketを実際のバケット名に置き換えてください。バケット内のパスを指定することもできます。例:- my_bucket/path。
- "s3:prefix":条件を- ["*"]に設定すると、指定したバケット内のすべてのプレフィックスへのアクセスを許可し、- ["path/*"]に設定すると、バケット内の指定したパスへのアクセスを許可します。
- 政府リージョン のバケットについては、ARNs のバケットは - arn:aws-us-gov:s3:::のプレフィックスを使います。
- S3アクセスポイントを使用している場合は、バケット ARN の代わりにアクセスポイント ARN を指定します。詳細情報については、 アクセスポイントを使用するための IAM ポリシーの構成 を参照してください。 
 - { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::<my_bucket>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<my_bucket>", "Condition": { "StringLike": { "s3:prefix": [ "*" ] } } } ] } 
- Next を選択します。 
- Policy name (例: - snowflake_access)とオプションの Description を入力します。
- Create policy を選択します。 
ステップ2:IAM ロールを作成する¶
AWS IAMロールを作成して、データファイルを含むS3バケットに対する権限を付与します。
- IDおよびアクセス管理(IAM)ダッシュボードの左側のナビゲーションペインから、 Roles を選択します。 
- Create role を選択します。 
- 信頼できるエンティティタイプでは、 AWS account を選択します。 
- An AWS account の下で、 This account を選択します。後のステップで、信頼関係を変更し、Snowflake にアクセスを許可します。 
- Require external ID オプションを選択します。好きな 外部 ID を入力します。例: - iceberg_table_external_id。- 外部 ID は、Snowflakeなどのサードパーティに AWS リソース(S3バケットなど)へのアクセスを許可するために使用されます。   
- Next を選択します。 
- 外部ボリューム用に作成したポリシーを選択し、 Next を選択します。 
- ロールの Role name と説明を入力し、 Create role を選択します。 - これで、S3ロケーションのIAMポリシー、およびIAMロールを作成し、ロールにポリシーを添付しました。 
- View role を選択すると、ロールの概要ページが表示されます。ロールの ARN (Amazonリソース名)値を探して記録します。   
ステップ3: SSE-KMS 暗号化に必要な権限を IAM ロールに付与する(オプション)¶
AWS KMS キーで暗号化されたオブジェクトをAmazon S3にアップロードする場合、外部ボリュームに対して作成した IAM ロールには、キーの対する kms:GenerateDataKey 権限が必要です。AWS KMS キーで暗号化されたオブジェクトをダウンロードするには、 IAM ロールにキーに対する kms:Decrypt 権限が必要です。
サーバー側の暗号化に KMS キーを使う場合、これらのステップに従ってキーを作成し、参照します。
- AWS管理コンソールで、キー管理サービス(KMS)に移動します。左のナビゲーションから Customer managed keys を選択し、次に Create key を選択します。バケットと同じリージョンにキーを作成する必要があります。 
- Symmetric キータイプを作成します。キーの使い方に、 Encrypt and decrypt を選択します。Next を選択します。 
- Alias の場合、キーの名前を入力し、 Next を選択します。 
- 必要であれば、キーの管理者を指定し、 Next を選択します。 
- Define key usage permissions では、IAM ロールを選択し、 Next を選択します。 
- キー設定の詳細を確認し、 Finish を選択してキーを作成します。 
- 顧客管理キーのリストからキーを見つけて選択し、その ARN を記録します。以下はキーの ARN の例です: - arn:aws:kms:us-west-2:111111122222:key/1a1a11aa-aa1a-aaa1a-a1a1-000000000000。- 外部ボリュームを作成する際に、 - KMS_KEY_ID値をキーの ARN に設定します。
ステップ4:Snowflakeで外部ボリュームを作成する¶
CREATE EXTERNAL VOLUME コマンドを使用して外部ボリュームを作成します。次の例は、暗号を使って単一Amazon S3ストレージロケーションを定義する iceberg_external_volume という名前の外部ボリュームを作成しています。
CREATE OR REPLACE EXTERNAL VOLUME iceberg_external_volume
   STORAGE_LOCATIONS =
      (
         (
            NAME = 'my-s3-us-west-2'
            STORAGE_PROVIDER = 'S3'
            STORAGE_BASE_URL = 's3://<my_bucket>/'
            STORAGE_AWS_ROLE_ARN = '<arn:aws:iam::123456789012:role/myrole>'
            STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id'
         )
      )
      ALLOW_WRITES = TRUE;
この例では、外部ボリューム用に作成したIAMロールに関連付けられた外部ID(iceberg_table_external_id)を指定しています。外部IDを指定すると、複数の外部ボリュームで同じIAMロール(および外部ID)を使用できます。
注釈
ARNsは、AWSが提供するのと同じように指定します。ARNsでは大文字と小文字が区別されます。
ステップ5:Snowflakeアカウントの AWS IAM ユーザーを取得する¶
- DESCRIBE EXTERNAL VOLUME コマンドを使用して、Snowflakeアカウント用に自動的に作成された AWS IAM ユーザーの ARN を取得します。外部ボリュームの名前を指定します。 - 次の例は、 - iceberg_external_volumeという名前の外部ボリュームを説明します。- DESC EXTERNAL VOLUME iceberg_external_volume; 
- STORAGE_AWS_IAM_USER_ARNプロパティの値を記録します。これは、Snowflakeアカウント用に作成された AWS IAM ユーザーです(例:- arn:aws:iam::123456789001:user/abc1-b-self1234)。- Snowflakeは、Snowflakeアカウント全体用に単一の IAM ユーザーをプロビジョニングします。アカウント内のすべてのS3外部ボリュームは、その IAM ユーザーを使用します。 - 注釈 - 外部ボリュームの作成時に外部ID( - STORAGE_AWS_EXTERNAL_ID)を指定しなかった場合、Snowflakeがお客様が使用するIDを生成します。生成された外部IDでIAMのロール信頼ポリシーを更新できるように値を記録してください。
ステップ6: バケットオブジェクトにアクセスするために IAM ユーザー権限を付与する¶
このステップでは、Snowflakeアカウントの IAM ユーザーがS3バケットのオブジェクトにアクセスできるように権限を設定します。
- AWS 管理コンソールにログインします。 
- ホームダッシュボードから、 IAM を検索して選択します。 
- 左側のナビゲーションペインから Roles を選択します。 
- 外部ボリューム用に作成したIAMロールを選択します。 
- Trust relationships タブを選択します。 
- Edit trust policy を選択します。 
- ポリシードキュメントをDESC EXTERNAL VOLUMEに記録した出力値で変更します。   - IAM ロールのポリシードキュメント - { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "<snowflake_user_arn>" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "<iceberg_table_external_id>" } } } ] } - 条件: - snowflake_user_arnは、記録した STORAGE_AWS_IAM_USER_ARN 値です。
- iceberg_table_external_idは外部 ID です。ロールの作成時に すでに 外部IDを指定し、同じIDを使用して外部ボリュームを作成した場合は、値をそのままにしてください。そうでない場合は、記録した値で- sts:ExternalIdを更新します。
 - 注釈 - 新しい外部ボリュームを作成する場合(またはCREATE OR REPLACE EXTERNAL VOLUME構文を使用して既存の外部ボリュームを再作成する場合)に、独自の外部IDを提供しない場合は、このポリシードキュメントを更新する必要があります。セキュリティ上の理由から、新規または再作成された外部ボリュームは異なる外部 ID を持ち、この信頼ポリシーを更新しない限り、信頼関係を解決できません。 
- Update policy を選択して変更を保存します。 
ステップ7: ストレージへのアクセスを確認する¶
Snowflakeがストレージプロバイダーに正常に認証できることを確認するには、 SYSTEM$VERIFY_EXTERNAL_VOLUME 関数を呼び出します。
SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('my_external_volume');
注釈
次のエラーを受け取った場合は、アカウント管理者がSnowflakeデプロイメントリージョンで AWS STS をアクティブ化する必要があります。手順については、AWS ドキュメントで AWS リージョンで AWS STS を管理する をご参照ください。
Error assuming AWS_ROLE:
STS is not activated in this region for account:<external volume id>. Your account administrator can activate STS in this region using the IAM Console.
次のステップ¶
外部ボリュームを構成したら、Icebergテーブルを作成できます。
- 外部カタログを使用する読み取り専用のIcebergテーブルを作成するには、 カタログ統合の構成 をご参照ください。 
- SnowflakeプラットフォームをフルサポートするIcebergテーブルを作成するには、 Snowflake管理のテーブルを作成する を参照してください。