オプション3:Amazon S3にアクセスするための AWS IAM ユーザー認証情報の設定

このセクションでは、S3バケットのセキュリティポリシーを構成し、特定の IAM ユーザーの認証情報にアクセスして、安全に外部ステージにアクセスする方法を説明します。

このトピックの内容:

ステップ1:S3バケットアクセスポリシーを構成する

AWS アクセス制御の要件

Snowflakeでは、フォルダー(および任意のサブフォルダー)内のファイルにアクセスできるようにするために、S3バケットおよびフォルダーに対する次の権限が必要です。

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

注釈

追加の SQL アクションを実行するには、次の追加の許可が必要です。

許可

SQL アクション

s3:PutObject

ファイルをバケットにアンロードします。

s3:DeleteObject

ロードが成功した後、ステージからファイルを自動的にパージする、 または REMOVE ステートメントを実行して、ファイルを手動で削除します。

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

IAM ポリシーの作成

次の詳細な手順では、S3バケットを使用してデータをロードおよびアンロードできるように、AWS 管理コンソールでSnowflakeのアクセス許可を構成する方法について説明します。

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

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

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

  4. Security Token Service Regions リストを展開し、アカウントがある 地域 に対応する AWS 地域を見つけ、ステータスが Inactive の場合は Activate を選択します。

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

  6. Create Policy をクリックします。

    Create Policy button on Policies page
  7. JSON タブをクリックします。

  8. SnowflakeがS3バケットとフォルダーにアクセスできるようにするポリシードキュメントを追加します。

    次のポリシー( JSON 形式)は、指定されたバケットとフォルダーパスに必要なアクセス許可をSnowflakeに提供します。テキストをコピーしてポリシーエディターに貼り付けることができます。

    注釈

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

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

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                  "s3:PutObject",
                  "s3:GetObject",
                  "s3:GetObjectVersion",
                  "s3:DeleteObject",
                  "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<bucket_name>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::<bucket_name>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy

    注釈

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

  9. Review policy をクリックします。

  10. ポリシー名(例: snowflake_access)とオプションの説明を入力します。次に、 Create policy をクリックしてポリシーを作成します。

    Create Policy button in Review Policy page

ステップ2: AWSIAM ユーザーを作成する

  1. 左側のナビゲーションペインから Users を選択し、 Add user をクリックします。

  2. Add user ページで、新しいユーザー名(例: snowflake1)を入力します。アクセスタイプとして Programmatic access を選択し、 Next をクリックします。

    Add user page
  3. Attach existing policies directly をクリックして、前に作成したポリシーを選択します。次に、 Next をクリックします。

    Set permissions page
  4. ユーザーの詳細を確認して、 Create user をクリックします。

    Review user details page
  5. アクセス認証情報を記録します。それらを記録する最も簡単な方法は、 Download Credentials をクリックしてファイルに書き込むことです(例: credentials.csv

    Attach policy on the user details page

    注意

    このページを離れると、シークレットアクセスキーは AWS コンソールのどこからも 利用できなくなります 。キーを紛失した場合、ユーザーの認証情報の 新しい セットを生成する必要があります。

現時点での完了事項:

  • バケットの IAM ポリシーを作成しました。

  • IAM ユーザーを作成し、ユーザーのアクセス認証情報を生成しました。

  • ユーザーにポリシーを添付しました。

S3バケットのAWSキーと秘密キーを使用すると、外部ステージを使用してSnowflakeのS3バケットにアクセスするために必要な認証情報を取得できます。

注釈

Snowflakeは、一時的な認証情報を一定期間キャッシュしますが、60分の有効期限を越えることができません。Snowflakeからのアクセスを取り消すと、ユーザーはキャッシュの有効期限が切れるまでファイルを一覧表示し、クラウドストレージの場所からデータを読み込むことができる場合があります。

ステップ3: 外部(つまり、S3)ステージを作成する

作成した AWS 認証情報を参照する外部ステージを作成します。

CREATE STAGE コマンドを使用してステージを作成するか、既存の外部ステージを変更して CREDENTIALS オプションを設定することを選択できます。

注釈

認証情報は、 ENCRYPTION や FILE_FORMAT などの他のステージパラメーターとは別に処理されます。これらの他のパラメーターのサポートは、外部S3バケットへのアクセスに使用する認証情報に関係なく同じです。

例えば、 mydb.public をユーザーセッションの現在のデータベースおよびスキーマとして設定し、 my_S3_stage という名前のステージを作成します。この例では、ステージはS3バケットとパス mybucket/load/files を参照します。S3バケット内のファイルはサーバー側の暗号化(AWS_SSE_KMS)で暗号化されています。

USE SCHEMA mydb.public;

CREATE OR REPLACE STAGE my_S3_stage
  URL='s3://mybucket/load/files/'
  CREDENTIALS=(AWS_KEY_ID='1a2b3c' AWS_SECRET_KEY='4x5y6z')
  ENCRYPTION=(TYPE='AWS_SSE_KMS' KMS_KEY_ID = 'aws/key');
Copy

次: AWS データファイルの暗号化