外部ステージへの AWS プライベート接続

このトピックでは、 AWS の外部ステージへのアウトバウンドプライベート接続をセットアップするための構成の詳細を説明します。アウトバウンドパブリック接続とアウトバウンドプライベート接続の主な違いは、ストレージ統合またはステージの構成方法です。例えば、ストレージ統合に USE_PRIVATELINK_ENDPOINT プロパティを指定し、外部ステージでこのストレージ統合を参照することができます。外部ステージは、ストレージ統合からプライベートエンドポイントの構成を継承します。その後、 AWS S3ステージへの接続は、 AWS 内部ネットワークを経由します。アウトバウンドプライベート接続を使用するようにストレージ統合とステージを構成することで、ストレージアカウントへのパブリックアクセスをブロックし、データアンロードオペレーションにさらなるセキュリティを追加します。

アウトバウンド プライベート接続コスト

各プライベート・コネクティビティ・エンドポイントの料金は、処理されるデータ総量に応じて支払われます。これらのアイテムの価格については、 Snowflake Service Consumption Table をご参照ください。

ACCOUNT_USAGE および ORGANIZATION_USAGE スキーマで請求ビューをクエリする際、以下のサービスタイプでフィルターをかけることで、これらの項目のコストを調べることができます。

  • OUTBOUND_PRIVATELINK_ENDPOINT

  • OUTBOUND_PRIVATELINK_DATA_PROCESSED

例えば、 USAGE_IN_CURRENCY_DAILY 表示をクエリし、これらのサービスタイプでフィルターをかけることができます。

考慮事項

同じストレージアカウントに対して、アウトバウンドパブリック接続とアウトバウンドプライベート接続を構成できます。この場合、アウトバウンドパブリック接続専用のストレージ統合を作成し、 USE_PRIVATELINK_ENDPOINT = FALSE を指定します。

構文の更新

ストレージ統合

1つ以上のロケーションを持つストレージ統合を作成するときに、 USE_PRIVATELINK_ENDPOINT プロパティを指定できます。

CREATE OR REPLACE STORAGE INTEGRATION my_int
  ...
  USE_PRIVATELINK_ENDPOINT = { TRUE | FALSE }
Copy

ストレージ統合を変更し、 USE_PRIVATELINK_ENDPOINT プロパティをセットできます。

ALTER STORAGE INTEGRATION my_int
  SET USE_PRIVATELINK_ENDPOINT = { TRUE | FALSE }
Copy
外部ステージ

USE_PRIVATELINK_ENDPOINT プロパティを指定するストレージ統合を参照するステージは、プライベートエンドポイント構成を継承します。結果、ステージで USE_PRIVATELINK_ENDPOINT プロパティを指定する必要はなく、ステージを変更して USE_PRIVATELINK_ENDPOINT プロパティをセットすることもできません。

ストレージ統合を参照する代わりにステージの CREDENTIALS プロパティを使用する場合、ステージを作成または変更するときに USE_PRIVATELINK_ENDPOINT プロパティを指定する必要があります。

CREATE OR REPLACE STAGE my_sas_private_stage
  URL = '...'
  CREDENTIALS=(AWS_KEY_ID='1a2b3c' AWS_SECRET_KEY='4x5y6z')
  USE_PRIVATELINK_ENDPOINT = { TRUE | FALSE }

ALTER STAGE my_sas_private_stage
  SET USE_PRIVATELINK_ENDPOINT = { TRUE | FALSE }
Copy

DESCRIBE STAGE コマンドは、 USE_PRIVATELINK_ENDPOINT プロパティとその値を含みます。

外部ステージアクセスの構成

これらの手順は、 AWS の外部ステージにデータをアンロードするために、ストレージ統合でアウトバウンドプライベート接続を使用する場合に固有のものです。ストレージ統合を参照する代わりにステージの CREDENTIALS プロパティを使用する場合は、フローを変更する必要があります。

  1. Snowflakeで、 SYSTEM$PROVISION_PRIVATELINK_ENDPOINT システム関数を呼び出して、Snowflake VNet にプライベート接続エンドポイントをプロビジョニングし、Snowflakeがプライベート接続を使用して外部 AWS S3ストレージに接続できるようにします。

    次の例で示すように、 AWS S3バケットを個別に指定するのではなく、ワイルドカード文字(*)を使用する必要があります。ワイルドカードを使用しても、すべてのS3バケットがプライベート接続でアクセスされるわけではありません。VPC エンドポイントを経由してアクセスできるのは、プライベート接続に構成された外部ステージから参照されるバケットのみです。

    USE ROLE ACCOUNTADMIN;
    
    SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
        'com.amazonaws.us-west-2.s3',
        '*.s3.us-west-2.amazonaws.com');
    
    Copy

    この関数はプライベートエンドポイントをホスト名にバインドし、ストレージ統合がプライベートエンドポイントを使用してストレージロケーションに接続できるようにします。

  2. Snowflakeで、 SYSTEM$GET_PRIVATELINK_ENDPOINTS_INFO 関数を呼び出します。

    関数の出力に "status": "APPROVED が含まれる場合、Snowflakeからストレージアカウントへの接続はプライベート接続を使用できるようになります(他の必要なSnowflakeオブジェクトがアウトバウンドプライベート接続で有効になった後)。

    "APPROVED" のステータスを待つ間、次のステップに進むことができます。

  3. バケットポリシーを以下のように更新して、S3バケットへのアクセスを VPC エンドポイント経由のみに制限します。

    {
      "Sid": "Access-to-specific-VPCE-only",
      "Effect": "Deny",
      "Principal": {
        "AWS": "arn:aws:iam::001234567890:role/myrole"
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::mybucket1",
        "arn:aws:s3:::mybucket1/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": "vpce-01c31eb5f4a1e817d"
        },
      },
    }
    
    Copy
  4. 限定 STORAGE_AWS_ROLE_ARN ロールと USE_PRIVATELINK_ENDPOINT プロパティの両方を指定するストレージ統合を作成します。

    CREATE OR REPLACE STORAGE INTEGRATION outbound_private_link_int
      TYPE = EXTERNAL_STAGE
      STORAGE_PROVIDER = 'S3'
      STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::001234567890:role/myrole'
      STORAGE_ALLOWED_LOCATIONS = ('s3://mybucket1/path1/');
      USE_PRIVATELINK_ENDPOINT = TRUE
      ENABLED = TRUE;
    
    Copy
  5. ストレージ統合を参照する外部ステージを作成します。

    CREATE OR REPLACE STAGE my_storage_private_stage
      URL = 's3://mybucket1/path1/'
      STORAGE_INTEGRATION = outbound_private_link_int;
    
    Copy
  6. プライベートエンドポイントが「APPROVED」ステータスになったら、Snowflakeから外部ステージへのデータのアンロードをテストします。

    COPY INTO @my_storage_private_stage
      FROM mytable
      FILE_FORMAT = (FORMAT_NAME = my_csv_format);
    
    Copy
  7. 結果を AWS ステージで表示します。

エンドポイントのデプロビジョン

外部ステージのプライベート接続エンドポイントが不要になった場合は、ステージまたはストレージ統合の USE_PRIVATELINK_ENDPOINT プロパティを設定解除してから、 SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT システム関数を呼び出します。