オプション1: Amazon S3にアクセスするためのSnowflakeストレージ統合の構成

このトピックでは、ストレージ統合を使用して、Snowflakeが外部(つまり、S3)ステージで参照されるAmazon S3バケットに対してデータを読み書きできるようにする方法について説明します。統合は、名前付きのファーストクラスのSnowflakeオブジェクトであり、秘密キーまたはアクセストークンといった、クラウドプロバイダーの明示的な認証情報を渡す必要がありません。統合オブジェクトには、 AWS IDおよびアクセス管理(IAM)ユーザー IDが保存されます。組織の管理者が、 AWS アカウントの統合 IAM ユーザー権限を付与します。

統合では、統合を使用する外部ステージを作成するときにユーザーが指定できる場所を制限するバケット(およびオプションのパス)もリストできます。

注釈

  • このセクションの手順を完了するには、 IAM ポリシーおよびロールの作成および管理のための AWS の権限が必要です。AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するように依頼します。

  • 現在、ストレージ統合を使用した 政府リージョン のS3ストレージへのアクセスは、同じ政府リージョンの AWS でホストされているSnowflakeアカウントに限定されていることに注意してください。直接認証情報を使用した、政府リージョン外でホストされているアカウントからS3ストレージへのアクセスがサポートされています。

次の図は、S3ステージの統合フローを示しています。

Amazon S3ステージ統合フロー
  1. 外部(つまり、S3)ステージは、その定義でストレージ統合オブジェクトを参照します。

  2. Snowflakeは、ストレージ統合をアカウント用に作成されたS3 IAM ユーザーに自動的に関連付けます。Snowflakeは、SnowflakeアカウントのすべてのS3ストレージ統合によって参照される単一の IAM ユーザーを作成します。

  3. 組織の AWS 管理者は、 IAM ユーザーにステージ定義で参照されているバケットにアクセスする権限を付与します。多数の外部ステージオブジェクトでは、異なるバケットとパスを参照し、認証に同じストレージ統合を使用できます。

ユーザーがステージに対してデータをロードまたはアンロードすると、Snowflakeは、アクセスを許可または拒否する前に、バケット上の IAM ユーザーに付与された権限を確認します。

このトピックの内容:

クラウドストレージへの安全なアクセスの構成

このセクションでは、Snowflakeストレージ統合オブジェクトを構成して、クラウドストレージの認証責任をSnowflake IDおよびアクセス管理(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)を選択します。

    AWS マネジメントコンソールでのIDとアクセスの管理
  3. 左側のナビゲーションペインから Account settings を選択します。

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

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

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

    ポリシーページのポリシーの作成ボタン
  7. JSON タブをクリックします。

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

    次のポリシー( JSON 形式)は、単一のバケットとフォルダーパスを使用してデータをロードまたはアンロードするために必要な権限をSnowflakeに提供します。 PURGE コピーオプションを使用してデータファイルをパージすることもできます。

    テキストをコピーしてポリシーエディターに貼り付けます。

    注釈

    • 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>/<prefix>/*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy

    注釈

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

    AWS ポリシーは、さまざまなセキュリティユースケースをサポートします。

    次のポリシーは、単一の 読み取り専用 バケットとフォルダーパスからデータをロードするために必要な権限をSnowflakeに提供します。ポリシーには、 s3:GetBucketLocations3:GetObjects3: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>/*"
                        ]
                    }
                }
            }
        ]
    }
    
    Copy
  9. Review policy をクリックします。

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

    ポリシーのレビューページのポリシーの作成ボタン

ステップ2: IAM AWS ロールを作成する

AWS 管理コンソールでSnowflakeのアクセス許可を設定するには、次の手順を実行します。

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

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

    AWS マネジメントコンソールでのIDとアクセスの管理
  3. 左側のナビゲーションペインから Roles を選択します。

  4. Create role を選択します。

    AWS 管理コンソールで信頼できるエンティティページを選択します
  5. 信頼できるエンティティタイプとして Another AWS account を選択します。

  6. Account ID フィールドに、自分の AWS アカウント ID を一時的に入力します。後で、信頼関係を変更し、Snowflakeへのアクセスを許可します。

  7. Require external ID オプションを選択します。外部 ID は、Snowflakeなどのサードパーティに AWS リソース(S3バケットなど)へのアクセスを許可するために使用されます。

    0000 などのプレースホルダー ID を入力します。後のステップで、 IAM ロールの信頼関係を変更し、ストレージ統合の外部 ID を指定します。

  8. Next を選択します。

  9. ステップ1: S3バケットのアクセス許可を構成する (このトピック内)で作成したポリシーを選択します。

  10. Next を選択します。

    AWS 管理コンソールのレビューページ
  11. ロールの名前と説明を入力し、 Create role を選択します。

    これで、バケットの IAM ポリシー、および IAM ロールを作成し、ロールにポリシーを添付しました。

  12. ロールの概要ページにある Role ARN 値を見つけて記録します。次のステップでは、このロールを参照するSnowflake統合を作成します。

    IAMロール

注釈

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

ステップ3:Snowflakeでクラウドストレージ統合を作成する

CREATE STORAGE INTEGRATION コマンドを使用してストレージ統合を作成します。ストレージ統合は、S3クラウドストレージ用に生成されたIDおよびアクセス管理(IAM)ユーザーと、許可またはブロックされたストレージロケーション(バケットなど)のオプションセットを保存するSnowflakeオブジェクトです。組織のクラウドプロバイダー管理者は、生成されたユーザーにストレージの場所に対するアクセス許可を付与します。このオプションにより、ユーザーはステージの作成時またはデータのロード時に、認証情報の提供を回避できます。

単一のストレージ統合で複数の外部(つまり、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 = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('s3://<bucket>/<path>/', 's3://<bucket>/<path>/') ]
Copy

条件:

  • integration_name は、新しい統合の名前です。

  • iam_role は、 ステップ2: AWS で IAM ロールを作成する (このトピック内)で作成したロールのAmazonリソースネーム(ARN)です。

  • 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/');
Copy

注釈

オプションで、 STORAGE_AWS_EXTERNAL_ID パラメーターを使用して、独自の外部 ID を指定します。複数の外部ボリュームやストレージ統合で同じ外部 ID を使用する場合は、このオプションを選択します。

ステップ4:Snowflakeアカウントの AWS IAM ユーザーを取得する

  1. Snowflakeアカウント用に自動的に作成された IAM ユーザーの ARN を取得するには、 DESCRIBE INTEGRATION を使用します。

    DESC INTEGRATION <integration_name>;
    
    Copy

    条件:

    例:

    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=                               |                  |
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
    
    Copy
  2. 次のプロパティの値を記録します。

    プロパティ

    説明

    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 アクセス許可を構成する方法を説明します。

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

  2. Identity & Access Management (IAM)を選択します。

    AWS マネジメントコンソールでのIDとアクセスの管理
  3. 左側のナビゲーションペインから Roles を選択します。

  4. ステップ2: IAM AWS ロールを作成する (このトピック内)で作成したロールを選択します。

  5. Trust relationships タブを選択します。

  6. Edit trust relationship を選択します。

  7. ステップ4:Snowflakeアカウントの AWS IAM ユーザーを取得する (このトピック内)で記録した DESC STORAGE INTEGRATION 出力値でポリシードキュメントを変更します。

    IAM ロールのポリシードキュメント

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<snowflake_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<snowflake_external_id>"
            }
          }
        }
      ]
    }
    
    Copy

    条件:

    • 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 が含まれるため、信頼ポリシーを更新しない限り信頼関係を解決できません。

  8. Update Trust Policy ボタンを選択します。変更が保存されます。

注釈

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

ステップ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;
Copy

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;
Copy

注釈

  • ステージの所有者(つまり、ステージに対する OWNERSHIP 権限を持つロール)には、ストレージ統合に対する USAGE 権限が必要です。

  • URL 値にスラッシュ(/)を追加して、指定したフォルダーパスにフィルターをかけます。スラッシュを省略すると、指定したパスのプレフィックスで始まるすべてのファイルとフォルダーが含まれます。

    ステージ内の非構造化データファイルにアクセスして取得するには、スラッシュが 必須 であることに注意してください。

  • 統合を使用するステージから、またはステージにデータをロードまたはアンロードするには、ステージに対する USAGE 権限がロールに必要です。ストレージ統合に対する USAGE 権限も、必要 ありません

  • STORAGE_INTEGRATION パラメーターは、 FILE_FORMAT などの他のステージパラメーターとは別に処理されます。これらの他のパラメーターのサポートは、S3バケットへのアクセスに使用される統合に関係なく同じです。

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