Private connectivity to external stages for Amazon Web Services

本主题提供了设置与 AWS 外部暂存区的出站专用连接的配置详细信息。出站公共连接和出站专用连接的主要区别在于如何配置存储集成或暂存区。例如,您可以指定存储集成的 USE_PRIVATELINK_ENDPOINT 属性,然后在外部暂存区引用此存储集成。外部暂存区从存储集成继承专用端点配置。随后,您与 AWS S3 暂存区的连接将通过 AWS 内部网络进行。通过将存储集成和暂存区配置为使用出站专用连接,可以阻止对存储账户的公共访问,从而为数据卸载操作增加额外的安全性。

出站专用连接成本

您为每个专用连接端点以及处理的总数据量付费。有关这些项目的定价,请参阅 Snowflake 服务使用量表

在 ACCOUNT_USAGE 和 ORGANIZATION_USAGE 架构中查询计费视图时,可以通过筛选以下服务类型来查看这些项目的成本:

  • OUTBOUND_PRIVATELINK_ENDPOINT

  • OUTBOUND_PRIVATELINK_DATA_PROCESSED

例如,您可以查询 USAGE_IN_CURRENCY_DAILY 视图并筛选这些服务类型。

注意事项

您可以为同一个存储账户配置出站公共连接和出站专用连接。如果要这样做,请为出站公共连接创建专用存储集成,并指定 USE_PRIVATELINK_ENDPOINT = FALSE

语法更新

存储集成

您可以在创建具有一个或多个位置的存储集成时指定 USE_PRIVATELINK_ENDPOINT 属性:

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

您可以修改存储集成并设置 USE_PRIVATELINK_ENDPOINT 属性:

ALTER STORAGE INTEGRATION my_int
  SET USE_PRIVATELINK_ENDPOINT = { TRUE | FALSE }
外部暂存区

引用存储集成的暂存区,用于指定 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 }

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');
    

    此函数将专用端点与主机名绑定,从而使存储集成可以使用专用端点连接到存储位置。

  2. 在 Snowflake 中,调用 SYSTEM$GET_PRIVATELINK_ENDPOINTS_INFO 函数。

    When the output of the function includes "status": "APPROVED", your connection from Snowflake to your storage account will be able to use private connectivity (after the other necessary Snowflake objects are enabled for outbound private connectivity).

    在等待 "APPROVED" 状态时,您可以继续执行后续步骤。

  3. 将 S3 桶上的访问限制为只能通过 VPC 端点访问,方法是使用以下内容更新桶策略。

    {
      "Sid": "AccesstospecificVPCEonly",
      "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"
        }
      }
    }
    
  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;
    

    备注

    有关为存储集成创建角色的信息,请参阅 配置 Snowflake 存储集成以访问 Amazon S3

  5. 创建引用存储集成的外部暂存区:

    CREATE OR REPLACE STAGE my_storage_private_stage
      URL = 's3://mybucket1/path1/'
      STORAGE_INTEGRATION = outbound_private_link_int;
    
  6. 专用端点具有“APPROVED”状态后,测试将数据从 Snowflake 卸载到外部暂存区:

    COPY INTO @my_storage_private_stage
      FROM mytable
      FILE_FORMAT = (FORMAT_NAME = my_csv_format);
    
  7. 查看 AWS 暂存区中的结果。

撤销端点

如果不再需要外部暂存区的专用连接端点,请取消设置暂存区或存储集成的 USE_PRIVATELINK_ENDPOINT 属性,然后调用 SYSTEM$DEPROVISION_PRIVATELINK_ENDPOINT 系统函数。