オプション2: Amazon S3にアクセスするための AWS IAM ロールの設定 --- 廃止¶
注釈
非推奨の認証方法を使用すると、 assumeRole
エラーが発生する場合があります。
このセクションでは、S3バケット、IAM ロール、およびSnowflakeアカウント内における1人以上の個別ユーザーに代わって、安全な方法でSnowflakeが外部ステージにアクセスするためのポリシーを構成する方法について説明します。
ベストプラクティスとして、S3バケットアクセスを、最小限必要な権限で特定の IAM ロールに制限します。S3バケットへのアクセス許可とSnowflakeが IAM ロールを引き継ぐことを許可する信頼ポリシーとともに、 AWS アカウントに IAM ロールが作成されます。
Snowflakeアカウント用に作成された AWS IAM ユーザーは、信頼関係を介して構成した IAM ロールに関連付けられています。
ロールには、構成した IAM ポリシーを介してS3バケットへの制限付きアクセスが許可されます。
注釈
このトピックの手順を完了するには、 AWS への管理アクセスが必要です。 AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するよう依頼します。
このトピックの内容:
ステップ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 管理コンソールにログインします。
ホームダッシュボードから、 Identity & Access Management (IAM)を選択します。
左側のナビゲーションペインから Account settings を選択します。
Security Token Service Regions リストを展開し、アカウントがある 地域 に対応する AWS 地域を見つけ、ステータスが Inactive の場合は Activate を選択します。
左側のナビゲーションペインから Policies を選択します。
Create Policy をクリックします。
JSON タブをクリックします。
SnowflakeがS3バケットとフォルダーにアクセスできるようにするポリシードキュメントを追加します。
次のポリシー( JSON 形式)は、単一のバケットとフォルダーパスを使用してデータをロードまたはアンロードするために必要な権限をSnowflakeに提供します。 PURGE コピーオプションを使用してデータファイルをパージすることもできます。
テキストをコピーしてポリシーエディターに貼り付けます。
注釈
bucket
と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>/*" ] } } } ] }
注釈
"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>/*" ] } } } ] }
Review policy をクリックします。
ポリシー名(例:
snowflake_access
)とオプションの説明を入力します。次に、 Create policy をクリックしてポリシーを作成します。
ステップ2: AWS IAM ロールを作成する¶
AWS 管理コンソールで、データファイルを含むS3バケットに対する権限を付与する AWS IAM ロールを作成します。
AWS 管理コンソールにログインします。
ホームダッシュボードから、 Identity & Access Management (IAM)を選択します。
左側のナビゲーションペインから Roles を選択します。
Create role ボタンをクリックします。
信頼できるエンティティタイプとして Another AWS account を選択します。
Account ID フィールドに、自分の AWS アカウント ID を入力します。後で、信頼関係を変更し、Snowflakeへのアクセスを許可します。AWS リソース(つまり、S3)へのアクセスをサードパーティ(つまり、Snowflake)に対して許可するには、外部 ID が必要です。
Require external ID オプションを選択します。
0000
などのダミーの ID を入力します。後で信頼関係を変更し、Snowflakeステージの外部 ID を指定します。Next ボタンをクリックします。
ステップ1:S3バケットアクセス許可を構成する (このトピック内)で作成したポリシーを検索し、このポリシーを選択します。
Next ボタンをクリックします。
ロールの名前と説明を入力し、 Create role ボタンをクリックします。
これで、バケットの IAM ポリシー、および IAM ロールを作成し、ロールにポリシーを添付しました。
役割の概要ページにある Role ARN 値を記録します。次の手順では、このロールをセキュリティ認証情報として参照するSnowflakeステージを作成します。
注釈
Snowflakeは、一時的な認証情報を一定期間キャッシュしますが、60分の有効期限を越えることができません。Snowflakeからのアクセスを取り消すと、ユーザーはキャッシュの有効期限が切れるまでファイルを一覧表示し、クラウドストレージの場所からデータを読み込むことができる場合があります。
ステップ3: 外部ステージを作成する¶
作成した AWS ロールを参照する外部(つまり、S3)ステージを作成します。
CREATE STAGE コマンドを使用して外部ステージを作成するか、既存の外部ステージを変更して CREDENTIALS オプションを設定することを選択できます。
注釈
認証情報は、 ENCRYPTION や FILE_FORMAT などの他のステージパラメーターとは別に処理されます。これらの他のパラメーターのサポートは、外部S3バケットへのアクセスに使用する認証情報に関係なく同じです。
URL 値にスラッシュ(
/
)を追加して、指定したフォルダーパスにフィルターをかけます。スラッシュを省略すると、指定したパスのプレフィックスで始まるすべてのファイルとフォルダーが含まれます。ステージ内の非構造化データファイルにアクセスして取得するには、スラッシュが 必須 であることに注意してください。
たとえば、
mydb.public
をユーザーセッションの現在のデータベースおよびスキーマとして設定し、my_S3_stage
という名前のステージを作成します。この例では、ステージはS3バケットとパスmybucket/load/files
を参照します。S3バケット内のファイルはサーバー側の暗号化(AWS_SSE_KMS)で暗号化されています。USE SCHEMA mydb.public; CREATE STAGE my_s3_stage URL='s3://mybucket/load/files' CREDENTIALS = (AWS_ROLE = 'arn:aws:iam::001234567890:role/mysnowflakerole') ENCRYPTION=(TYPE='AWS_SSE_KMS' KMS_KEY_ID = 'aws/key');
DESCRIBE STAGE コマンドを実行して、ステージのプロパティを表示します。
DESC STAGE my_S3_stage; +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+ | parent_property | property | property_type | property_value | property_default | |--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------| ... | STAGE_CREDENTIALS | AWS_ROLE | String | arn:aws:iam::001234567890:role/mysnowflakerole | | | STAGE_CREDENTIALS | AWS_EXTERNAL_ID | String | MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw= | | | STAGE_CREDENTIALS | SNOWFLAKE_IAM_USER | String | arn:aws:iam::123456789001:user/vj4g-a-abcd1234 | | +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
SNOWFLAKE_IAM_USER および AWS_EXTERNAL_ID プロパティの値を記録します。ここでは、
- SNOWFLAKE_IAM_USER:
Snowflakeアカウント用に作成された AWS IAM ユーザー。このユーザーは、アカウントで作成されたすべての外部S3ステージで同じです。
- AWS_EXTERNAL_ID:
特定のステージに割り当てられた一意の ID 。ID の形式は次のとおりです。
snowflakeAccount_SFCRole=snowflakeRoleId_randomId
この例で使用されている AWS_ROLE、 AWS_EXTERNAL_ID、および SNOWFLAKE_IAM_USER の値は、説明のみを目的としています。
次のステップでは、生成された AWS 外部 IDを使用してSnowflake IAM ユーザーにアクセスを許可するように AWS IAM ロールを構成します。
ステップ4: ステージへのアクセスを許可するための AWS IAM ロールを構成する¶
AWS 管理コンソールで、 ステップ3:外部ステージのロールを作成する (このトピック内)で記録したステージプロパティを使用して、 IAM ロールを構成します。
AWS 管理コンソールにログインします。
ホームダッシュボードから、 Identity & Access Management (IAM)を選択します。
左側のナビゲーションペインから Roles を選択し、 ステップ2: AWS IAM ロールを作成する (このトピック内)で作成したロールをクリックします。
Trust relationships タブをクリックして、 Edit trust relationship ボタンをクリックします。
Policy Document フィールドで、ステージのプロパティ値でポリシーを更新します。
AWS: SNOWFLAKE_IAM_USER ステージプロパティの ARN を入力します。つまり、この例では、
arn:aws:iam::123456789001:user/vj4g-a-abcd1234
です。sts:ExternalId: 生成された外部 ID、つまり、
MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw=
を入力します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789001:user/vj4g-a-abcd1234" ] }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "MYACCOUNT_SFCRole=2_jYfRf+gT0xSH7G2q0RAODp00Cqw=" } } } ] }
注釈
上記の信頼ポリシーにより、Snowflakeアカウントの単一の外部ステージは IAM ロールを引き受けることができます。これは最も制限の厳しい信頼ポリシーであるため、最も安全です。
IAM ロールを引き受ける許可は、外部 IDに関連付けられています。外部 ID の形式は次のとおりです。
snowflake_account_SFCRole=snowflake_role_id_random_id
条件:
snowflake_account
は、Snowflakeアカウントに割り当てられた名前です。snowflake_role_id
は、 ステップ3:外部ステージのロールを作成する (このトピック内)で、ステージを作成したSnowflakeロールに割り当てられた ID です。現在の例では、
snowflake_role_id
の値は2
です。この ID は、Snowflakeアカウントの単一のロールに関連付けられています。この ID の目的は、外部ステージの信頼ポリシーに限定されています。そのため、Snowflakeロールの IDs へのマッピングは使用できません。特定のロールのロール ID は、 DESCRIBE STAGE 出力の AWS_EXTERNAL_ID 値でのみ公開されます。ベストプラクティスとして、外部S3ステージを作成する機能を単一のSnowflakeロールに制限します。ステージを作成するロールは、必ずしもステージの所有者(つまり、ステージで OWNERSHIP 権限を持つロール)と同じではありません。ステージの所有権は、後で信頼ポリシーに対応する変更を必要とせずに、別のロールに譲渡できます。
セキュリティ上の理由から、新しいストレージ統合を作成する(または CREATE OR REPLACE STORAGE INTEGRATION 構文を使用して既存のストレージ統合を再作成する)と、その統合は異なる外部 ID を持つため、信頼ポリシーが変更されなければ IAM ロールを引き受けることはできません。
安全性の低い一連の制限を持つ信頼ポリシー(つまり、アカウントのすべての外部ステージをサポートするポリシー)が必要な場合は、外部 ID の
random_id
をワイルドカード文字(*
)に置き換えます。snowflake_account_SFCRole=snowflake_role_id_*
、たとえば現在の例ではMYACCOUNT_SFCRole=2_*
。この外部 ID の形式では、同じSnowflakeロール(つまり、 SYSADMIN)を持つアカウントのユーザーが作成した外部S3ステージを許可して IAM ロールを引き継ぎ、さらに IAM ロールがアクセスするS3バケットを引き受けます。この安全性の低いタイプの信頼ポリシーを実装する場合は、
Condition
をStringEquals
からStringLike
に変更する必要があります。
Update Trust Policy ボタンをクリックします。
これで、 AWS ロールを使用してS3バケットにアクセスするための1回限りの設定が完了しました。