Amazon S3へのセキュアアクセスの構成

S3バケットに対するデータの読み書きには、バケットのセキュリティおよびアクセス管理ポリシーで、Snowflakeがバケットにアクセスできるようにする必要があります。

プライベートS3バケットへの安全なアクセスを構成するために次のオプションがサポートされています。

オプション1

ストレージ統合オブジェクトを構成して、外部クラウドストレージの認証責任をSnowflake IDおよびアクセス管理(IAM)エンティティに委任します。

注釈

このオプションを強くお勧めします。これにより、ステージの作成時またはデータのロード時に AWS IAM 認証情報を提供する必要がなくなります。

オプション2

外部S3バケットにアクセスするために必要なポリシーと権限で AWS IAM ロールを構成します。このアプローチにより、個々のユーザーはセキュリティ認証情報とアクセスキーの提供と管理を回避できます。

この機能を実装するには、名前付き外部ステージが 必要 です。COPY ステートメントでS3バケット URL に直接アクセスするためのサポートはありません。

重要

AWS IAM ロールを使用してプライベートS3バケットにアクセスし、データをロードまたはアンロードする機能は廃止されました(つまり、サポートは将来のリリースで削除される予定)。この機能を使用する既存のS3ステージを変更して、代わりにストレージ統合オブジェクトを参照することを強くお勧めします(このトピックの オプション1)。

オプション3

S3バケットにアクセスするために必要な権限を持つ AWS IAM ユーザーを構成します。この1回限りの設定では、バケットにアクセス許可を設定し、必要な許可を IAM ユーザーに関連付けます。その後、バケットを指定する外部(つまり、S3)ステージには、 AWS キーと秘密キーでアクセスできます。

このトピックでは、S3で必要なタスクを実行する方法について説明します。

注釈

このトピックの手順を完了するには、 AWSへの管理アクセスが必要です。 AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するよう依頼します。

このトピックの内容:

オプション1:Snowflakeストレージ統合の構成

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

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

注釈

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

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

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

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

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

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

このセクションの内容:

ステップ1:S3バケットのアクセス許可を構成する

AWS アクセス制御の要件

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

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

注釈

追加の s3:PutObject および s3:DeleteObject 権限は、ファイルをバケットにアンロードするか、ファイルをテーブルにロードした後に自動的にパージする場合にのみ必要です。

ベストプラクティスとして、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に提供します。 PURGE コピーオプションを使用してデータファイルをパージすることもできます。

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

    注釈

    バケットプレフィックス を実際のバケット名とフォルダーパスプレフィックスに置き換えてください。

    {
        "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",
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    

    重要

    "s3:prefix": 条件を ["*"] に設定すると、指定されたバケット内のすべてのプレフィックスに対するアクセスが許可されます。バケットに1000個を超えるオブジェクトが存在する場合、次のエラーが発生する可能性があります。 Access Denied (Status Code: 403; Error Code: AccessDenied)

    エラーを回避するには、次のように IAM ポリシーから条件を削除します。例:

    "Condition": {
          "StringLike": {
              "s3:prefix": [
                  "*"
              ]
          }
      }
    

    ポリシーは引き続きバケット内のファイルへのアクセスを許可しますが、バケットに1000個を超えるオブジェクトが存在する場合でも、S3はエラーを返しません。

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

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

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

    Create Policy button in Review Policy page

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

AWS 管理コンソールで、 AWS IAM ロールを作成して、データファイルを含むS3バケットに対する権限を付与します。

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

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

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

  4. Create role ボタンをクリックします。

    Select Trusted Entity Page in AWS Management Console
  5. 信頼できるエンティティタイプとして Another AWS account を選択します。

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

  7. Require external ID オプションを選択します。 0000 などのダミーの ID を入力します。後で信頼関係を変更し、Snowflakeステージの外部 ID を指定します。AWS リソース(つまり、S3)からサードパーティ(つまり、Snowflake)へのアクセスを許可するには、外部 ID が必要です。

  8. Next ボタンをクリックします。

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

  10. Next ボタンをクリックします。

    Review Page in AWS Management Console
  11. ロールの名前と説明を入力し、 Create role ボタンをクリックします。

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

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

    IAM Role

ステップ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>/') ]

条件:

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

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

  • バケット は、データファイルを保存するS3バケットの名前です(例: mybucket)。必須の STORAGE_ALLOWED_LOCATIONS パラメーターおよびオプションの STORAGE_BLOCKED_LOCATIONS パラメーターは、この統合を参照するステージが作成または変更されたときに、それぞれこれらのバケットへのアクセスを制限またはブロックします。

  • パス は、バケット内のオブジェクトを細かく制御するために使用できるオプションのパスです。

次の例では、2つのバケットとパスのいずれかを参照するために統合を使用する外部ステージを明示的に制限する統合を作成します。後のステップで、これらのバケットとパスのいずれかを参照する外部ステージを作成します。

この統合も使用する追加の外部ステージは、許可されたバケットとパスを参照できます。

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 = ('s3://mybucket1/mypath1/', 's3://mybucket2/mypath2/')
  STORAGE_BLOCKED_LOCATIONS = ('s3://mybucket1/mypath1/sensitivedata/', 's3://mybucket2/mypath2/sensitivedata/');

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

  1. DESCRIBE INTEGRATION コマンドを実行して、Snowflakeアカウント用に自動的に作成された AWS IAM ユーザーの ARN を取得します。

    DESC INTEGRATION <integration_name>;
    

    条件:

    例:

    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=                               |                  |
    +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
    
  2. 次の値を記録します。

    説明

    STORAGE_AWS_IAM_USER_ARN

    Snowflakeアカウント用に作成された AWS IAM ユーザー、この例では arn:aws:iam::123456789001:user/abc1-b-self1234 。Snowflakeアカウント全体用に、単一の IAM ユーザーをプロビジョニングします。すべてのS3ストレージ統合は、その IAM ユーザーを使用します。

    STORAGE_AWS_EXTERNAL_ID

    信頼関係を確立するために必要な外部 ID 。

    これらの値は次のセクションで提供します。

ステップ5:バケットオブジェクトにアクセスするために IAM ユーザー権限を付与する

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

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

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

    Identity & Access Management in AWS Management Console
  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>"
            }
          }
        }
      ]
    }
    

    条件:

    • snowflake_external_id は、記録した STORAGE_AWS_EXTERNAL_ID 値です。

    • snowflake_user_arn は、記録した STORAGE_AWS_IAM_USER_ARN 値です。

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

ステップ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 権限が必要です。

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

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

オプション2: AWS IAM ロールの構成 --- 廃止

このセクションでは、S3バケット、 IAM ロール、およびSnowflakeアカウント内における1人以上の個別ユーザーに代わって、安全な方法で外部ステージにアクセスするためのポリシーを構成する方法について説明します。

ベストプラクティスとして、S3バケットアクセスを、最小限必要な権限で特定の IAM ロールに制限します。S3バケットへのアクセス許可とSnowflakeが IAM ロールを引き継ぐことを許可する信頼ポリシーとともに、 AWS アカウントに IAM ロールが作成されます。

Trust policies allowing IAM user access to S3 bucket
  1. Snowflakeアカウント用に作成された AWS IAM ユーザーは、信頼関係を介して構成した IAM ロールに関連付けられています。

  2. ロールには、構成した IAM ポリシーを介してS3バケットへの制限付きアクセスが許可されます。

注釈

このトピックの手順を完了するには、 AWSへの管理アクセスが必要です。 AWS 管理者でない場合は、 AWS 管理者にこれらのタスクを実行するよう依頼します。

ステップ1:S3バケットアクセス許可を構成する

AWS アクセス制御の要件

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

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

注釈

追加の s3:PutObject および s3:DeleteObject 権限は、ファイルをバケットにアンロードするか、ファイルをテーブルにロードした後に自動的にパージする場合にのみ必要です。

ベストプラクティスとして、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に提供します。 PURGE コピーオプションを使用してデータファイルをパージすることもできます。

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

    注釈

    バケットプレフィックス を実際のバケット名とフォルダーパスプレフィックスに置き換えてください。

    {
        "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",
                "Resource": "arn:aws:s3:::<bucket>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    

    重要

    "s3:prefix": 条件を ["*"] に設定すると、指定されたバケット内のすべてのプレフィックスに対するアクセスが許可されます。バケットに1000個を超えるオブジェクトが存在する場合、次のエラーが発生する可能性があります。 Access Denied (Status Code: 403; Error Code: AccessDenied)

    エラーを回避するには、 IAM ポリシーから条件を削除します。

    "Condition": {
          "StringLike": {
              "s3:prefix": [
                  "*"
              ]
          }
      }
    

    ポリシーは引き続きバケット内のファイルへのアクセスを許可しますが、バケットに1000個を超えるオブジェクトが存在する場合でも、S3はエラーを返しません。

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

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

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

    Create Policy button in Review Policy page

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

AWS 管理コンソールで、データファイルを含むS3バケットに対する権限を付与する AWS IAM ロールを作成します。

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

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

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

  4. Create role ボタンをクリックします。

    Select Trusted Entity Page in AWS Management Console
  5. 信頼できるエンティティタイプとして Another AWS account を選択します。

  6. Account ID フィールドに、自分の AWS アカウント IDを入力します。後で、信頼関係を変更し、Snowflakeへのアクセスを許可します。外部 ID は、これらの手順の後半で AWS リソース(つまり、S3)へのアクセスをサードパーティ(つまり、この場合はSnowflake)に許可するために必要です。

  7. Require external ID オプションを選択します。 0000 などのダミーの ID を入力します。後で信頼関係を変更し、Snowflakeステージの外部 ID を指定します。

  8. Next ボタンをクリックします。

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

  10. Next ボタンをクリックします。

    Review Page in AWS Management Console
  11. ロールの名前と説明を入力し、 Create role ボタンをクリックします。

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

  12. 役割の概要ページにある Role ARN 値を記録します。次の手順では、このロールをセキュリティ認証情報として参照するSnowflakeステージを作成します。

    IAM Role

ステップ3:外部ステージを作成する

作成した AWS ロールを参照する外部(つまり、S3)ステージを作成します。

  1. 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 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');
    
  2. 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                 |                  |
    +--------------------+--------------------------------+---------------+----------------------------------------------------------------+------------------+
    
  3. SNOWFLAKE_IAM_USER および AWS_EXTERNAL_ID プロパティの値を記録します。ここでは、

    SNOWFLAKE_IAM_USER

    Snowflakeアカウント用に作成された AWS IAM ユーザー。このユーザーは、アカウントで作成されたすべての外部S3ステージで同じです。

    AWS_EXTERNAL_ID

    特定のステージに割り当てられた一意の ID 。 ID の形式は次のとおりです:

    snowflakeアカウント_SFCRole=snowflakeRoleId_ランダムId

    この例で使用されている AWS_ROLE、 AWS_EXTERNAL_ID、および SNOWFLAKE_IAM_USER の値は、説明のみを目的としています。

    次のステップでは、生成された AWS 外部 IDを使用してSnowflake IAM ユーザーにアクセスを許可するように AWS IAM ロールを構成します。

ステップ4:ステージへのアクセスを許可するための AWS IAM ロールを構成する

AWS 管理コンソールで、 ステップ3:外部ステージのロールを作成する (このトピック内)で記録したステージプロパティを使用して、 IAM ロールを構成します。

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

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

    Identity & Access Management in AWS Management Console
  3. 左側のナビゲーションペインから Roles を選択し、 ステップ2: AWS IAM ロールを作成する (このトピック内)で作成したロールをクリックします。

  4. Trust relationships タブをクリックして、 Edit trust relationship ボタンをクリックします。

  5. 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アカウント_SFCRole=snowflakeロールID_ランダムID

      条件:

      • snowflakeアカウント は、Snowflakeアカウントに割り当てられた名前です。

      • SnowflakeロールID は、 ステップ3:外部ステージのロールを作成する (このトピック内)で、ステージを作成したSnowflakeロールに割り当てられた ID です。

        現在の例では、 snowflakeロールID の値は 2 です。この ID は、Snowflakeアカウントの単一のロールに関連付けられています。この ID の目的は、外部ステージの信頼ポリシーに限定されています。そのため、Snowflakeロールの IDs へのマッピングは使用できません。特定のロールのロール ID は、 DESCRIBE STAGE 出力の AWS_EXTERNAL_ID 値でのみ公開されます。ベストプラクティスとして、外部S3ステージを作成する機能を単一のSnowflakeロールに制限します。

        ステージを作成するロールは、必ずしもステージの所有者(つまり、ステージで OWNERSHIP 権限を持つロール)と同じではありません。ステージの所有権は、後で信頼ポリシーに対応する変更を必要とせずに、別のロールに移譲できます。

      セキュリティ上の理由から、新しいステージを作成する(または CREATE OR REPLACE STAGE 構文を使用して既存のステージを再作成する)と、その結果のステージは異なる外部 ID を持つため、信頼ポリシーが変更されなければ IAM ロールを引き受けることはできません。

      安全性の低い一連の制限を持つ信頼ポリシー(アカウントのすべての外部ステージをサポートするポリシー)が必要な場合は、外部 ID の ランダムID をワイルドカード文字(*)に置き換えます。

      snowflakeアカウント_SFCRole=snowflakeロールID_*、例えば現在の例では MYACCOUNT_SFCRole=2_*

      この外部 ID の形式では、同じSnowflakeロール(つまり、 SYSADMIN)を持つアカウントのユーザーが作成した外部S3ステージを許可して IAM ロールを引き継ぎ、さらに IAM ロールがアクセスするS3バケットを引き受けます。この安全性の低いタイプの信頼ポリシーを実装する場合は、 ConditionStringEquals から StringLike に変更する必要があります。

  6. Update Trust Policy ボタンをクリックします。

これで、 AWS ロールを使用してS3バケットにアクセスするための1回限りの設定が完了しました。

オプション3: AWS IAM ユーザー認証情報の構成

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

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

AWS アクセス制御の要件

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

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

注釈

追加の s3:PutObject および s3:DeleteObject 権限は、ファイルをバケットにアンロードするか、ファイルをテーブルにロードした後に自動的にパージする場合にのみ必要です。

ベストプラクティスとして、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に提供します。テキストをコピーしてポリシーエディターに貼り付けることができます。

    注釈

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

    {
        "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",
                "Resource": "arn:aws:s3:::<bucket_name>",
                "Condition": {
                    "StringLike": {
                        "s3:prefix": [
                            "<prefix>/*"
                        ]
                    }
                }
            }
        ]
    }
    

重要

"s3:prefix": 条件を ["*"] に設定すると、指定されたバケット内のすべてのプレフィックスに対するアクセスが許可されます。バケットに1000個を超えるオブジェクトが存在する場合、次のエラーが発生する可能性があります。 Access Denied (Status Code: 403; Error Code: AccessDenied)

エラーを回避するには、 IAM ポリシーから条件を削除します。

"Condition": {
      "StringLike": {
          "s3:prefix": [
              "*"
          ]
      }
  }

ポリシーは引き続きバケット内のファイルへのアクセスを許可しますが、バケットに1000個を超えるオブジェクトが存在する場合でも、S3はエラーを返しません。

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

  2. ポリシー名(例: 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バケットにアクセスするために必要な認証情報を取得できます。

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

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