配置 Google Cloud Storage 集成

本主题介绍如何配置对 Google Cloud Storage 桶中存储的数据文件的安全访问。

本主题内容:

配置 Snowflake 存储集成

本部分介绍如何使用存储集成来允许 Snowflake 从外部(即 Cloud Storage)暂存区中引用的 Google Cloud Storage 桶读取数据和写入数据。集成是命名的一类 Snowflake 对象,无需传递显式云提供商凭据,例如密钥或访问令牌;相反,集成对象会引用 Cloud Storage 服务账户。组织中的管理员会在 Cloud Storage 账户中授予服务账户权限。

管理员还可以将用户限制为使用集成的外部暂存区访问的一组特定的 Cloud Storage 桶(和可选路径)。

备注

  • 要完成本部分中说明的操作,您需要以项目编辑者的身份访问您的 Cloud Storage 项目。如果您不是项目编辑者,请让您的 Cloud Storage 管理员执行这些任务。

  • 确认 Snowflake 支持托管您的存储的 Google Cloud Storage 区域。有关更多信息,请参阅 支持的云区域

下图显示了 Cloud Storage 暂存区的集成流程:

Google Cloud Storage 暂存区集成流程
  1. 外部(即 Cloud Storage)暂存区在其定义中引用了存储集成对象。

  2. Snowflake 会自动将存储集成与为您的账户创建的 Cloud Storage 服务账户相关联。Snowflake 创建一个服务账户,该账户由 Snowflake 账户中的所有 GCS 存储集成引用。

  3. Cloud Storage 项目的项目编辑者会向服务账户授予访问暂存区定义中引用的桶的权限。请注意,许多外部暂存区对象可以引用不同的桶和路径,并使用相同的集成进行身份验证。

当用户从暂存区加载或卸载数据时,Snowflake 会在允许或拒绝访问之前验证授予桶服务账户的权限。

本部分内容:

第 1 步:在 Snowflake 中创建云存储集成

使用 CREATE STORAGE INTEGRATION 命令创建集成。集成是一个 Snowflake 对象,它将外部云存储的身份验证责任委托给 Snowflake 生成的实体(即 Cloud Storage 服务账户)。为了访问 Cloud Storage 桶,Snowflake 会创建一个服务账户,该账户有权访问存储您的数据文件的桶。

单个存储集成可以支持多个外部(即 GCS)暂存区。暂存区定义中的 URL 必须与为 STORAGE_ALLOWED_LOCATIONS 参数指定的 GCS 桶(和可选路径)一致。

备注

只有账户管理员(具有 ACCOUNTADMIN 角色的用户)或具有全局 CREATE INTEGRATION 权限的角色才能执行此 SQL 命令。

CREATE STORAGE INTEGRATION <integration_name>
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'GCS'
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/')
  [ STORAGE_BLOCKED_LOCATIONS = ('gcs://<bucket>/<path>/', 'gcs://<bucket>/<path>/') ]
Copy

其中:

  • integration_name 是新集成的名称。

  • bucket 是用于存储数据文件(例如 mybucket)的 Cloud Storage 桶的名称。在创建或修改引用此集成的暂存区时,必需的 STORAGE_ALLOWED_LOCATIONS 参数和可选的 STORAGE_BLOCKED_LOCATIONS 参数分别限制或阻止对这些桶的访问。

  • path 是一个可选路径,可用于提供对桶中对象的精细控制。

以下示例创建一个集成,该集成明确限制使用该集成引用两个桶和路径之一的外部暂存区。在后面的步骤中,我们将创建一个引用这些桶和路径之一的外部暂存区。

也使用此集成的其他外部暂存区可以引用允许的桶和路径:

CREATE STORAGE INTEGRATION gcs_int
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'GCS'
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://mybucket1/path1/', 'gcs://mybucket2/path2/')
  STORAGE_BLOCKED_LOCATIONS = ('gcs://mybucket1/path1/sensitivedata/', 'gcs://mybucket2/path2/sensitivedata/');
Copy

第 2 步:检索 Snowflake 账户的 Cloud Storage 服务账户

执行 DESCRIBE INTEGRATION 命令以检索为您的 Snowflake 账户自动创建的 Cloud Storage 服务账户的 ID:

DESC STORAGE INTEGRATION <integration_name>;
Copy

其中:

例如:

DESC STORAGE INTEGRATION gcs_int;

+-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
| property                    | property_type | property_value                                                              | property_default |
+-----------------------------+---------------+-----------------------------------------------------------------------------+------------------|
| ENABLED                     | Boolean       | true                                                                        | false            |
| STORAGE_ALLOWED_LOCATIONS   | List          | gcs://mybucket1/path1/,gcs://mybucket2/path2/                               | []               |
| STORAGE_BLOCKED_LOCATIONS   | List          | gcs://mybucket1/path1/sensitivedata/,gcs://mybucket2/path2/sensitivedata/   | []               |
| STORAGE_GCP_SERVICE_ACCOUNT | String        | service-account-id@project1-123456.iam.gserviceaccount.com                  |                  |
+-----------------------------+---------------+-----------------------------------------------------------------------------+------------------+
Copy

输出中的 STORAGE_GCP_SERVICE_ACCOUNT 属性显示为您的 Snowflake 账户创建的 Cloud Storage 服务账户(例如 service-account-id@project1-123456.iam.gserviceaccount.com)。我们会为您的整个 Snowflake 账户预置一个 Cloud Storage 服务账户。所有 Cloud Storage 集成都使用该服务账户。

第 3 步:授予服务账户访问桶对象的权限

以下分步说明描述了如何在 Google Cloud Platform Console 中配置 Snowflake 的 IAM 访问权限,以便您可以使用 Cloud Storage 桶来加载和卸载数据:

创建自定义 IAM 角色

创建具有访问桶和获取对象所需权限的自定义角色。

  1. 以项目编辑者身份登录 Google Cloud Platform Console。

  2. 从主页仪表板中选择 IAM & Admin » Roles

  3. 选择 Create Role

  4. 为自定义角色输入 TitleDescription (可选)。

  5. 选择 Add Permissions

  6. 筛选权限列表,并从列表中添加以下内容:

    操作

    所需权限

    仅加载数据

    • storage.buckets.get

    • storage.objects.get

    • storage.objects.list

    使用清除选项加载数据,在暂存区上执行 REMOVE 命令

    • storage.buckets.get

    • storage.objects.delete

    • storage.objects.get

    • storage.objects.list

    数据加载和卸载

    • storage.buckets.get (用于计算数据传输成本)

    • storage.objects.create

    • storage.objects.delete

    • storage.objects.get

    • storage.objects.list

    仅数据卸载

    • storage.buckets.get

    • storage.objects.create

    • storage.objects.delete

    • storage.objects.list

  7. 选择 Add

  8. 选择 Create

将自定义角色分配给 Cloud Storage 服务账户

  1. 以项目编辑者身份登录 Google Cloud Platform Console。

  2. 从主页仪表板中选择 Cloud Storage » Buckets

  3. 筛选桶列表,然后选择创建存储集成时指定的桶。

  4. 选择 Permissions » View by principals,然后选择 Grant access

  5. Add principals 下,粘贴 第 2 步:检索 Snowflake 账户的 GCS 服务账户 的输出中的服务账户名称。

  6. Assign roles 下,选择先前创建的自定义 IAM 角色,然后选择 Save

授予 Cloud Storage 服务账户对 Cloud Key Management Service 加密密钥的权限

备注

仅当 您的 GCS 桶使用存储在 Google Cloud Key Management Service (Cloud KMS) 中的密钥进行加密时,才需要执行此步骤。

  1. 以项目编辑者身份登录 Google Cloud Platform Console。

  2. 从主页仪表板中,搜索并选择 Security » Key Management

  3. 选择分配给 GCS 桶的密钥环。

  4. 点击右上角的 SHOW INFO PANEL。密钥环的信息面板将滑出。

  5. 点击 ADD PRINCIPAL 按钮。

  6. New principals 字段中,从 第 2 步:检索 Snowflake 账户的 Cloud Storage 服务账户 (本主题内容)的 DESCRIBE INTEGRATION 输出中搜索服务账户名称。

  7. Select a role 下拉列表中,选择 Cloud KMS CrytoKey Encryptor/Decryptor 角色。

  8. 点击 Save 按钮。服务账户名称将添加到信息面板中的 Cloud KMS CrytoKey Encryptor/Decryptor 角色下拉列表中。

第 4 步:创建外部暂存区

创建一个引用您创建的集成的外部暂存区。

备注

  • 使用被授予或继承数据库和架构的 USAGE 权限以及暂存区的 CREATE STAGE 权限的角色。暂存区所有者(即具有暂存区 OWNERSHIP 权限的角色)必须同时拥有存储集成的 USAGE 权限。

    有关 CREATE STAGE,请参阅 访问控制要求

  • 要从使用集成的暂存区加载或卸载数据,角色必须具有暂存区的 USAGE 权限。不必 同时具有存储集成的 USAGE 权限。

使用 SQL 创建外部暂存区

确保正在使用的角色被授予或继承必要的权限,以创建使用存储集成的暂存区。例如:

GRANT USAGE ON DATABASE mydb TO ROLE myrole;
GRANT USAGE ON SCHEMA mydb.stages TO ROLE myrole;
GRANT CREATE STAGE ON SCHEMA mydb.stages TO ROLE myrole;
GRANT USAGE ON INTEGRATION gcs_int TO ROLE myrole;
Copy

可以使用 CREATE STAGE 命令创建外部暂存区。

例如,设置 mydb.stages 作为用户会话的当前数据库和架构,然后创建一个名为 my_gcs_stage 的暂存区。在此示例中,暂存区引用由集成提供支持的 Cloud Storage 桶和路径 mybucket1/path1。暂存区还引用名为 my_csv_format 的指定文件格式对象:

USE SCHEMA mydb.stages;

CREATE STAGE my_gcs_stage
  URL = 'gcs://mybucket1/path1'
  STORAGE_INTEGRATION = gcs_int
  FILE_FORMAT = my_csv_format;
Copy

备注

  • 追加正斜杠 (/) 到 URL 值,以筛选到指定的文件夹路径。如果省略正斜杠,则包含以指定路径的前缀开头的所有文件和文件夹。

    请注意, 必需添加 正斜杠才能访问和检索暂存区中的非结构化数据文件。

  • STORAGE_INTEGRATION 参数与其他暂存区参数分开处理,例如 FILE_FORMAT。无论用于访问 GCS 桶的集成如何,对这些其他参数的支持都是相同的。

使用 Snowsight 创建外部暂存区

要使用 Snowsight 创建指定外部暂存区,请执行以下操作:

  1. 登录 Snowsight。

  2. 在导航菜单中,选择 Data » Databases

  3. 选择要在其中创建暂存区的数据库和架构。

  4. 选择 Create » Stage

  5. 选择 Google Cloud Platform

  6. 输入 Stage Name

  7. 输入 Google Cloud Storage 桶的 URL

  8. 注意,默认情况下已选择 Enable Directory Table。这可以让您在暂存区上看到文件,但需要仓库,因此会产生成本。您可以选择暂时取消选择此选项,稍后再启用目录表。

  9. 启用 Authentication

  10. 从菜单中选择您的存储集成。

  11. (可选)展开 SQL Preview 以查看生成的 SQL 语句。若要为暂存区指定其他选项,例如 AUTO_REFRESH,可在工作表中打开此 SQL 预览。

  12. 选择 Create

编辑现有暂存区以使用存储集成

您可以使用 SQL 或 Web 界面编辑现有外部暂存区配置以使用存储集成。

备注

  • 您无法禁用暂存区的身份验证或加密设置。

  • 您可以更新暂存区以使用存储集成进行身份验证。但是,如果该暂存区 使用存储集成,则无法将身份验证类型更改为凭据。要更改身份验证类型,您可以删除并重新创建暂存区。

使用 SQL 编辑暂存区

使用 ALTER STAGE 修改暂存区。例如:

ALTER STAGE my_gcs_stage
  SET STORAGE_INTEGRATION = gcs_int;
Copy

使用 Snowsight 编辑暂存区

  1. 登录 Snowsight。

  2. 在导航菜单中,选择 Data » Databases

  3. 选择您要编辑的暂存区。

  4. 选择 更多选项 » Edit

  5. 对暂存区进行所需的更改。

  6. 选择 Save

语言: 中文