Amazon S3用の外部ボリュームを構成する¶
Snowflakeの Apache Iceberg™ テーブル用の外部ボリュームを使用して、Amazon S3バケットへの制限付きアクセスをSnowflakeに付与します。Amazon S3の外部ボリュームを構成するには、 SQL を使用 するか、 Snowsightを使用 できます。
ベストプラクティスとして、S3ロケーションへのSnowflakeアクセスを許可する指定IAMポリシーを作成します。その後、ポリシーをロールに添付し、ロールのために AWS によって生成されたセキュリティ認証情報を使用して、ファイルにアクセスできます。
注釈
セキュリティ体制を強化するため、ネットワークトラフィックにパブリックインターネットではなくプライベート接続を使用するように外部ボリュームを構成できます。詳細については、 Amazon Web Services の外部ボリュームへのプライベート接続 をご参照ください。
前提条件¶
外部ボリュームを構成する前に、以下のものが必要です。
S3ストレージバケット。
外部管理Icebergテーブルに外部ボリュームを使用するには、すべてのテーブルデータとメタデータファイルをSnowflakeアカウントをホストするバケットに配置する必要があります。
Snowflakeは、ドットを含むS3バケット名を持つ外部ボリュームをサポートできません(例えば、
my.s3.bucket)。S3は、名前にドットが含まれる仮想ホスト形式のバケットの SSL をサポートしておらず、Snowflakeは仮想ホスト形式のパスと HTTPS を使用してS3のデータにアクセスします。データ復旧をサポートするには、 外部クラウドストレージの場所のバージョン管理を有効にします。
IAM ポリシーとロールの作成および管理のための AWS での権限。AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するように依頼します。
Configure an external volume by using SQL¶
ステップ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.
Configure an external volume in Snowsight¶
ステップ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リソース名)値を探して記録します。
Step 3: Create an external volume in Snowsight¶
Snowsight を使用してSnowflakeで外部ボリュームを作成するには、次のステップに従います。
Snowsight にサインインします。
左下隅にある自身の名前 » Switch role を選択し、次に ACCOUNTADMIN または CREATE EXTERNAL VOLUME 権限を持つロールを選択します。
詳細については、 プライマリロールの変更 をご参照ください。
ナビゲーションメニューで Catalog » External data を選択します。
Select the External volumes tab.
Select + Create.
Select AWS S3 and then select Next.
注釈
S3の場所へのアクセス権を付与する IAM ポリシーを作成し 、 IAM ロールを作成した ときにすでにクラウドプロバイダーを構成しています。
Grant storage access ページの Trust policy フィールドから、信頼ポリシーをテキストエディターにコピーします。
次のステップでは、この信頼ポリシーを AWS に貼り付けます。
ストレージへのアクセス権を付与するには、以下の手順に従います。
In AWS, log in to the AWS Management Console.
ホームダッシュボードから、 IAM を検索して選択します。
左側のナビゲーションペインから Roles を選択します。
外部ボリューム用に作成したIAMロールを選択します。
Trust relationships タブを選択します。
Edit trust policy を選択します。
IAM ロールの信頼ポリシーを、 Snowsight でコピーしたポリシーに置き換えます。
Update policy を選択して変更を保存します。
Snowsight で、 Next を選択します。
Snowsight で、 Next を選択します。
外部ボリュームを構成するには、 Configure external volume ページで次のフィールドに入力します。
フィールド
説明
External volume name
Enter a name for your external volume.
Region type
データファイルを保存するクラウドストレージプロバイダーを指定します。
Standard (default):中国国外のパブリック AWS リージョンにあるS3ストレージ。
Government (GovCloud):AWS 政府リージョン のS3ストレージ。
S3 role ARN
Specifies the case-sensitive Amazon Resource Name (ARN) of the AWS identity and access management (IAM) role that grants privileges on the S3 bucket containing your data files.
この値は、 IAM ロールを作成した ときに記録しました。
Encryption (optional)
使用される暗号化タイプを指定します。可能な値は次のとおりです。
None (default):暗号化なし。
SSE-S3:S3が管理する暗号化キーを使ったサーバー側の暗号化。詳細については、 Amazon S3が管理する暗号化キー(SSE-S3)を使用したサーバー側暗号化の使用 をご覧ください。
SSE-KMS (enter key):KMS に格納されたキーを使用したサーバー側の暗号化。詳細については、 AWS キー管理サービス(SSE-KMS)を使用したサーバー側暗号化の使用 をご覧ください。
Scope
この外部ボリュームを、将来のIcebergテーブルのデフォルト保存先として設定する場所を選んでください。可能な値は次のとおりです。
Do not set a default:外部ボリュームをどこでもデフォルトとして設定しないでください。
Account:アカウント全体の下で作成されるIcebergテーブルのデフォルトとして外部ボリュームを設定します。
Specific database:指定したデータベース下に作成されるIcebergテーブルのデフォルトとして外部ボリュームを設定します。このデータベースを指定するには、 Specific database を選択したときに表示される Database ドロップダウンを使用します。
Specific schema:指定したスキーマ下に作成されるIcebergテーブルのデフォルトとして外部ボリュームを設定します。このスキーマを指定するには、表示される Database ドロップダウンを使用して、最初にスキーマの親データベースを選択してからスキーマを選択します。
Comment (optional)
外部ボリュームのコメントを指定します。
Connectivity
セキュリティ体制を強化するためにアウトバウンドプライベート接続を使用するかどうかを指定します。このパラメーターの使用に関する情報については、 Amazon Web Services の外部ボリュームへのプライベート接続 をご参照ください。可能な値は次のとおりです。
Public (default):公共のインターネットを使用します。
Private (AWS PrivateLink):アウトバウンドプライベート接続を使用します。
Storage base URL
クラウドストレージの場所のベース URL を指定します。
Access scope
外部ボリュームに対して書き込み操作を許可するかどうかを指定します。次のテーブルの場合 Allow writes に設定する必要があります。
Snowflakeをカタログとして使用するIcebergテーブル。
外部カタログを使用し、書き込み可能なIcebergテーブル。外部で管理されているIcebergテーブルは、 ALLOWED_WRITE_OPERATIONS パラメーターが TRUE に設定された、カタログにリンクされたデータベースを通じてアクセスすると書き込み可能です。
Deltaテーブルファイルから作成されたIcebergテーブルの場合、このパラメーターを Allow writes に設定すると、SnowflakeがIcebergメタデータを外部ストレージに書き込めるようになります。詳細については、 Deltaベーステーブル をご参照ください。
このフィールドの値は、指定した各ストレージの場所のクラウドストレージアカウントに設定した権限と一致する必要があります。
注釈
外部管理Icebergテーブルの読み取りに外部ボリュームを使用する場合は、このフィールドをOffに設定します。外部Icebergカタログのテーブルを読み取る場合、SnowflakeはデータやIcebergメタデータファイルをクラウドストレージに書き込みません。
Select Next.
Verify connection & create volume ページでは、Snowflakeは AWS への接続を確認し、「正常に接続されました」メッセージを表示します。
注釈
Snowflakeが接続を確認できない場合は、権限または外部ボリュームの構成を確認して、 Verify again を選択してください。
Select Create.
次のステップ¶
外部ボリュームを構成したら、Icebergテーブルを作成できます。
外部カタログを使用する読み取り専用のIcebergテーブルを作成するには、 カタログ統合の構成 をご参照ください。
SnowflakeプラットフォームをフルサポートするIcebergテーブルを作成するには、 Snowflake管理のテーブルを作成する を参照してください。