オプション1: Amazon S3にアクセスするためのSnowflakeストレージ統合の構成¶
このトピックでは、ストレージ統合を使用して、Snowflakeが外部(つまり、S3)ステージで参照されるAmazon S3バケットに対してデータを読み書きできるようにする方法について説明します。統合は、名前付きのファーストクラスのSnowflakeオブジェクトであり、秘密キーまたはアクセストークンといった、クラウドプロバイダーの明示的な認証情報を渡す必要がありません。統合オブジェクトには、 AWS IDおよびアクセス管理(IAM)ユーザー IDが保存されます。組織の管理者が、 AWS アカウントの統合 IAM ユーザー権限を付与します。
統合では、統合を使用する外部ステージを作成するときにユーザーが指定できる場所を制限するバケット(およびオプションのパス)もリストできます。
注釈
- このセクションの手順を完了するには、 IAM ポリシーおよびロールの作成および管理のための AWS の権限が必要です。AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するように依頼します。 
- ストレージ統合を使用した 政府リージョン のS3ストレージへのアクセスは、同じ政府リージョンの AWS でホストされているSnowflakeアカウントに限定されていることに注意してください。 
- Snowflakeが、ストレージがホストされているAWSリージョンをサポートしていることを確認します。詳細については、 サポートされているクラウドリージョン をご参照ください。 
次の図は、S3ステージの統合フローを示しています。
 
- 外部(つまり、S3)ステージは、その定義でストレージ統合オブジェクトを参照します。 
- Snowflakeは、ストレージ統合をアカウント用に作成されたS3 IAM ユーザーに自動的に関連付けます。Snowflakeは、SnowflakeアカウントのすべてのS3ストレージ統合によって参照される単一の IAM ユーザーを作成します。 
- 組織の AWS 管理者は、 IAM ユーザーにステージ定義で参照されているバケットにアクセスする権限を付与します。多数の外部ステージオブジェクトでは、異なるバケットとパスを参照し、認証に同じストレージ統合を使用できます。 
ユーザーがステージに対してデータをロードまたはアンロードすると、Snowflakeは、アクセスを許可または拒否する前に、バケット上の IAM ユーザーに付与された権限を確認します。
このトピックの内容:
クラウドストレージへの安全なアクセスの構成¶
このセクションでは、Snowflakeストレージ統合オブジェクトを構成して、クラウドストレージの認証責任をSnowflake IDおよびアクセス管理(IAM)エンティティに委任する方法について説明します。
ステップ1: S3バケットのアクセス許可を構成する¶
AWS アクセス制御の要件¶
Snowflakeでは、フォルダー(およびサブフォルダー)内のファイルにアクセスできるようにするために、S3バケットおよびフォルダーに対する次の権限が必要です。
- s3:GetBucketLocation
- s3:GetObject
- s3:GetObjectVersion
- s3:ListBucket
注釈
追加の SQL アクションを実行するには、次の追加の許可が必要です。
| 許可 | SQL アクション | 
|---|---|
| 
 | ファイルをバケットにアンロードします。 | 
| 
 | ロードが成功した後、ステージからファイルを自動的にパージする、 または REMOVE ステートメントを実行して、ファイルを手動で削除します。 | 
ベストプラクティスとして、Snowflakeは、S3バケットへのSnowflakeアクセス用の IAM ポリシーを作成することをお勧めします。その後、ポリシーをロールに添付し、ロールのために AWS によって生成されたセキュリティ認証情報を使用して、バケット内のファイルにアクセスできます。
IAM ポリシーの作成¶
次の詳細な手順では、S3バケットを使用してデータをロードおよびアンロードできるように、AWS 管理コンソールでSnowflakeのアクセス許可を構成する方法について説明します。
- AWS 管理コンソールにログインします。 
- ホームダッシュボードから、 IAM を検索して選択します。 
- 左側のナビゲーションペインから Account settings を選択します。 
- Endpoints リストの Security Token Service (STS) で、ご使用のアカウントが存在するSnowflake リージョン を見つけます。 STS status がアクティブでない場合は、トグルを Active に動かします。 
- 左側のナビゲーションペインから Policies を選択します。 
- Create Policy を選択します。 
- Policy editor には、 JSON を選択します。 
- SnowflakeがS3バケットとフォルダーにアクセスできるようにするポリシードキュメントを追加します。 - 次のポリシー( JSON 形式)は、単一のバケットとフォルダーパスを使用してデータをロードまたはアンロードするために必要な権限をSnowflakeに提供します。 PURGE コピーオプションを使用してデータファイルをパージすることもできます。 - テキストをコピーしてポリシーエディターに貼り付けます。 - 注釈 - bucketと- prefixを実際のバケット名とフォルダーパスプレフィックスに確実に置き換えます。
- 政府リージョン のバケットのAmazonリソースネーム(ARN)には、 - arn:aws-us-gov:s3:::プレフィックスがあります。
- 中国のパブリック AWS リージョンにあるバケットの ARN は、 - arn:aws-cn: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:::<bucket>/<prefix>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<bucket>", "Condition": { "StringLike": { "s3:prefix": [ "<prefix>/*" ] } } } ] } - 注釈 - "s3:prefix":条件を- ["*"]または- ["< パス>/*"]に設定すると、指定されたバケット内のすべてのプレフィックスまたはバケット内のパスへのアクセスがそれぞれ許可されます。- AWS ポリシーは、さまざまなセキュリティユースケースをサポートします。 - 次のポリシーは、単一の 読み取り専用 バケットとフォルダーパスからデータをロードするために必要な権限をSnowflakeに提供します。ポリシーには、 - s3:GetBucketLocation、- s3:GetObject、- s3:GetObjectVersion、および- s3:ListBucketの権限が含まれます。- 代替ポリシー: 読み取り専用S3バケットからのロード - { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::<bucket>/<prefix>/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::<bucket>", "Condition": { "StringLike": { "s3:prefix": [ "<prefix>/*" ] } } } ] } 
- Next を選択します。 
- Policy name (例: - snowflake_access)とオプションの Description を入力します。
- Create policy を選択します。 
ステップ2: IAM ロールを AWS で作成する¶
AWS 管理コンソールでSnowflakeのアクセス許可を設定するには、次の手順を実行します。
- IDおよびアクセス管理(IAM)ダッシュボードの左側のナビゲーションペインから、 Roles を選択します。 
- Create role を選択します。 
- 信頼できるエンティティタイプとして AWS account を選択します。 
- Another AWS account の選択 
- Account ID フィールドに、自分の AWS アカウント ID を一時的に入力します。後で、信頼関係を変更し、Snowflakeへのアクセスを許可します。 
- Require external ID オプションを選択します。外部 ID は、Snowflakeなどのサードパーティに AWS リソース(S3バケットなど)へのアクセスを許可するために使用されます。 - 0000などのプレースホルダー ID を入力します。後のステップで、 IAM ロールの信頼関係を変更し、ストレージ統合の外部 ID を指定します。
- Next を選択します。 
- ステップ1: S3バケットのアクセス許可を構成する (このトピック内) で作成したポリシーを選択します。 
- Next を選択します。 
- ロールの名前と説明を入力し、 Create role を選択します。 - これで、バケットの IAM ポリシー、および IAM ロールを作成し、ロールにポリシーを添付しました。 
- ロールの概要ページにある Role ARN 値を見つけて記録します。次のステップでは、このロールを参照するSnowflake統合を作成します。 
注釈
Snowflakeは、60分の有効期限を超えることができない期間、仮の認証情報をキャッシュします。Snowflakeからのアクセスを取り消すと、ユーザーはキャッシュの有効期限が切れるまでファイルをリストし、クラウドストレージの場所からデータにアクセスできる場合があります。
ステップ3: Snowflakeでクラウドストレージ統合を作成する¶
CREATE STORAGE INTEGRATION コマンドを使用してストレージ統合を作成します。ストレージ統合は、S3クラウドストレージ用に生成されたIDおよびアクセス管理 (IAM) ユーザーを、許可またはブロックされたストレージロケーション(つまりバケット)のオプションセットとともに格納するSnowflakeオブジェクトです。組織のクラウドプロバイダー管理者は、生成されたユーザーにストレージの場所に対するアクセス許可を付与します。このオプションにより、ユーザーはステージの作成時またはデータのロード時に認証情報の提供を回避できます。
1つのストレージ統合で複数の外部ステージ (つまりS3) をサポートできます。ステージ定義にある URL は、 STORAGE_ALLOWED_LOCATIONS パラメーターのために指定されたS3バケット(およびオプションのパス)に合わせる必要があります。
注釈
この SQL コマンドを実行できるのは、アカウント管理者( ACCOUNTADMIN ロールを持つユーザー)またはグローバル CREATE INTEGRATION 権限を持つロールのみです。
CREATE STORAGE INTEGRATION <integration_name>
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'S3'
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = '<iam_role>'
  STORAGE_ALLOWED_LOCATIONS = ('<protocol>://<bucket>/<path>/', '<protocol>://<bucket>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('<protocol>://<bucket>/<path>/', '<protocol>://<bucket>/<path>/') ]
条件:
- integration_nameは、新しい統合の名前です。
- iam_roleは、作成したロールのAmazonリソースネーム (ARN) です。 ステップ2: IAM ロールを AWS (このトピック内) で作成します。
- protocolは以下のいずれかです。- s3プレフィックスは、中国以外のパブリック AWS リージョンのS3ストレージを参照します。
- s3chinaプレフィックスは、中国のパブリック AWS リージョンのS3ストレージを参照します。
- s3govプレフィックスは、 政府リージョン のS3ストレージを参照します。
 
- bucketは、データファイルを保存するS3バケットの名前です (例えば、- mybucket)。必須の STORAGE_ALLOWED_LOCATIONS パラメーターおよびオプションの STORAGE_BLOCKED_LOCATIONS パラメーターは、この統合を参照するステージが作成または変更されたときに、それぞれこれらのバケットへのアクセスを制限またはブロックします。
- pathは、バケット内のオブジェクトを細かく制御するために使用できるオプションのパスです。
次の例では、アカウント内のすべてのバケットへのアクセスを許可し、定義された sensitivedata フォルダーへのアクセスをブロックする統合を作成します。
この統合も使用する追加の外部ステージは、許可されたバケットとパスを参照できます。
CREATE STORAGE INTEGRATION s3_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'S3'
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole'
  STORAGE_ALLOWED_LOCATIONS = ('*')
  STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');
注釈
オプションで、 STORAGE_AWS_EXTERNAL_ID パラメーターを使用して、独自の外部 ID を指定します。複数の外部ボリュームやストレージ統合で同じ外部 ID を使用する場合は、このオプションを選択します。
ステップ4: AWS IAM ユーザーをSnowflakeアカウントのために取得する¶
- Snowflakeアカウント用に自動的に作成された IAM ユーザーの ARN を取得するには、 DESCRIBE INTEGRATION を使用します。 - DESC INTEGRATION <integration_name>; - 条件: - integration_nameは、 ステップ3: Snowflakeでクラウドストレージ統合を作成する (このトピック内)で作成した統合の名前です。
 - 例: - DESC INTEGRATION s3_int; - +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+ | property | property_type | property_value | property_default | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------| | ENABLED | Boolean | true | false | | STORAGE_ALLOWED_LOCATIONS | List | s3://mybucket1/mypath1/,s3://mybucket2/mypath2/ | [] | | STORAGE_BLOCKED_LOCATIONS | List | s3://mybucket1/mypath1/sensitivedata/,s3://mybucket2/mypath2/sensitivedata/ | [] | | STORAGE_AWS_IAM_USER_ARN | String | arn:aws:iam::123456789001:user/abc1-b-self1234 | | | STORAGE_AWS_ROLE_ARN | String | arn:aws:iam::001234567890:role/myrole | | | STORAGE_AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+ 
- 次のプロパティの値を記録します。 - プロパティ - 説明 - 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- Snowflakeが AWS との信頼関係を確立するために使用する外部 ID。ストレージ統合の作成時に外部 ID ( - STORAGE_AWS_EXTERNAL_ID)を指定しなかった場合、Snowflakeは ID を生成して使用します。- これらの値は次のセクションで提供します。 
ステップ5: バケットオブジェクトにアクセスするために IAM ユーザー権限を付与する¶
次の手順では、S3バケットを使用してデータをロードおよびアンロードできるように、 AWS 管理コンソールでSnowflakeの IAM アクセス許可を構成する方法を説明します。
- AWS 管理コンソールにサインインします。 
- IAM を選択します。 
- 左側のナビゲーションペインから Roles を選択します。 
- 選択したロールを ステップ2: IAM ロールを AWS (このトピック内) で作成します。 
- Trust relationships タブを選択します。 
- Edit trust policy を選択します。 
- ポリシードキュメントを、 DESC STORAGE INTEGRATION 出力値で変更します。 ステップ4: 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>" } } } ] } - 条件: - snowflake_user_arnは、記録した STORAGE_AWS_IAM_USER_ARN 値です。
- snowflake_external_idは、記録した STORAGE_AWS_EXTERNAL_ID 値です。- この例では、 - snowflake_external_idの値は- MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=です。- 注釈 - セキュリティ上の理由から、外部 ID を指定せずに新しいストレージ統合を作成した場合(または CREATE OR REPLACE STORAGE INTEGRATION 構文を使用して既存のストレージ統合を再作成した場合)、新しい統合には 異なる 外部 ID が含まれるため、信頼ポリシーを更新しない限り信頼関係を解決できません。 
 
- Update policy を選択して変更を保存します。 
注釈
Snowflakeは、60分の有効期限を超えることができない期間、仮の認証情報をキャッシュします。Snowflakeからのアクセスを取り消すと、ユーザーはキャッシュの有効期限が切れるまでファイルを一覧表示し、クラウドストレージの場所からデータを読み込むことができる場合があります。
注釈
SYSTEM$VALIDATE_STORAGE_INTEGRATION 関数を使用して、ストレージ統合の構成を検証することができます。
ステップ6: 外部ステージを作成する¶
ステップ3:Snowflakeでクラウドストレージ統合を作成する (このトピック内)で作成したストレージ統合を参照する、外部(つまり、S3)ステージを作成します。
注釈
ストレージ統合を使用するステージを作成するには、スキーマの CREATE STAGE 権限とストレージ統合の USAGE 権限を持つロールが必要です。例:
GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole;
GRANT USAGE ON INTEGRATION s3_int TO ROLE myrole;
CREATE STAGE コマンドを使用してステージを作成します。
例えば、 mydb.public をユーザーセッションの現在のデータベースおよびスキーマとして設定し、 my_s3_stage という名前のステージを作成します。この例では、ステージは、統合でサポートされているS3バケットとパス mybucket1/path1 を参照します。ステージは、 my_csv_format という名前のファイル形式オブジェクトも参照します。
USE SCHEMA mydb.public; CREATE STAGE my_s3_stage STORAGE_INTEGRATION = s3_int URL = 's3://bucket1/path1/' FILE_FORMAT = my_csv_format;
注釈
- ステージの所有者(つまり、ステージに対する OWNERSHIP 権限を持つロール)には、ストレージ統合に対する USAGE 権限が必要です。 
- URL 値にスラッシュ( - /)を追加して、指定したフォルダーパスにフィルターをかけます。スラッシュを省略すると、指定したパスのプレフィックスで始まるすべてのファイルとフォルダーが含まれます。- ステージ内の非構造化データファイルにアクセスして取得するには、スラッシュが 必須 であることに注意してください。 
- 統合を使用するステージから、またはステージにデータをロードまたはアンロードするには、ステージに対する USAGE 権限がロールに必要です。ストレージ統合に対する USAGE 権限も、必要 ありません。 
- STORAGE_INTEGRATION パラメーターは、 FILE_FORMAT などの他のステージパラメーターとは別に処理されます。これらの他のパラメーターのサポートは、S3バケットへのアクセスに使用される統合に関係なく同じです。 

