选项 1:配置 Snowflake 存储集成以访问 Amazon S3

本主题介绍如何使用存储集成来允许 Snowflake 从外部(即 S3)暂存区中引用的 Amazon S3 桶读取数据,并向其中写入数据。集成是已命名的第一类 Snowflake 对象,无需传递显式云提供商凭据(如密钥或访问令牌)。集成对象存储 AWS Identity and Access Management (IAM) 用户 ID。您组织中的管理员在 AWS 账户向集成授予 IAM 用户权限。

集成还可以列出桶(和可选路径),以限制用户在创建使用集成的外部暂存区时可以指定的位置。

备注

  • 需要在 AWS 中拥有创建和管理 IAM 策略和角色的权限,才能完成本部分中的说明。如果您不是 AWS 管理员,请让 AWS 管理员来执行这些任务。

  • 只能通过在同一政府区域中的 AWS 上托管的 Snowflake 账户使用存储集成访问 政府区域 中的 S3 存储。

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

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

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

  2. Snowflake 会自动将存储集成与为您的账户创建的 S3 IAM 用户相关联。Snowflake 会创建一个 IAM 用户,供 Snowflake 账户中的所有 S3 存储集成引用。

  3. 您组织中的 AWS 管理员向 IAM 用户授予权限,以访问暂存区定义中引用的桶。请注意,许多外部暂存区对象可以引用不同的桶和路径,并使用相同的存储集成进行身份验证。

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

本主题内容:

配置对 Cloud Storage 的安全访问

本部分介绍如何配置 Snowflake 存储集成对象,以将云存储的身份验证责任委托给 Snowflake Identity and Access Management (IAM) 实体。

第 1 步:配置 S3 桶的访问权限

AWS 访问控制要求

Snowflake 需要对 S3 桶和文件夹拥有以下权限才能访问该文件夹(以及子文件夹)中的文件:

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:GetObjectVersion

  • s3:ListBucket

备注

需要以下额外的权限才能执行其他 SQL 操作:

权限

SQL 操作

s3:PutObject

将文件卸载到桶中。

s3:DeleteObject

在成功加载后自动从暂存区中清除文件, 执行 REMOVE 语句以手动移除文件。

作为最佳实践,Snowflake 建议创建一个供 Snowflake 访问 S3 桶的 IAM 策略。然后,您可以将策略附加到角色,并使用由 AWS 为角色生成的安全凭据来访问桶中的文件。

创建 IAM 策略

以下分步说明介绍如何在 AWS 管理控制台中配置 Snowflake 的访问权限,以便您可以使用 S3 桶来加载和卸载数据:

  1. 登录 AWS 管理控制台。

  2. 从主页仪表板搜索并选择 IAM

  3. 从左侧导航窗格中选择 Account settings

  4. Endpoints 列表中的 Security Token Service (STS) 下,找到账户所在的 Snowflake 区域。如果 STS status 不活动,请将切换按钮移至 Active

  5. 从左侧导航窗格中选择 Policies

  6. 选择 Create Policy

  7. 对于 Policy editor,选择 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": 条件设置为 ["*"] 或者 ["<path>/*"],以便分别向指定桶中的所有前缀或桶中的路径分别授予访问权限。

    注意 AWS 策略支持各种不同的安全用例。

    以下策略为 Snowflake 提供从单个 只读 桶和文件夹路径加载数据所需的权限。该策略包括 s3:GetBucketLocations3:GetObjects3:GetObjectVersions3: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. 选择 Next

  10. 输入 Policy name (例如 snowflake_access)和可选的 Description

  11. 选择 Create policy

第 2 步:在 AWS 中创建 IAM 角色

要在 AWS 管理控制台中为 Snowflake 配置访问权限,请执行以下操作:

  1. 在 Identity and Access Management (IAM) 控制面板的左侧导航窗格中,选择 Roles

  2. 选择 Create role

  3. 选择 AWS account 作为信任实体类型。

  4. Account ID 字段中,暂时输入自己的 AWS 账户 ID。在稍后的步骤中,您将修改信任关系并授予对 Snowflake 的访问权限。

  5. 选择 Require external ID 选项。外部 ID 用于向第三方(如 Snowflake)授予对 AWS 资源(例如 S3 桶)的访问权限。

    输入占位符 ID,例如 0000。在后续步骤中,您将修改 IAM 角色的信任关系并指定外部 ID 用于存储集成。

  6. 选择 Next

  7. 选择您在 第 1 步:配置 S3 桶访问权限 (本主题内容)中创建的策略。

  8. 选择 Next

    AWS 管理控制台中的 Review 页面
  9. 输入角色的名称和描述,然后选择 Create role

    您现在已经为一个桶创建了 IAM 策略,创建了一个 IAM 角色,并将策略附加到了该角色。

  10. 在角色摘要页面上,找到 Role ARN 值并将其记录下来。在下一步中,您将创建引用此角色的 Snowflake 集成。

备注

Snowflake 会将临时凭据缓存一段时间,但不能超过 60 分钟的过期时间。如果您撤消 Snowflake 的访问权限,用户或许也能够从云存储位置列出文件并访问数据,直到缓存过期。

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

使用 CREATE STORAGE INTEGRATION 命令创建存储集成。存储集成是一个 Snowflake 对象,用于存储生成的身份和 S3 云存储访问管理 (IAM) 用户,以及一组可选的允许或阻止的存储位置(如桶)。组织中的云提供商管理员会将存储位置的权限授予生成的用户。此选项可让用户在创建暂存区或加载数据时无需提供凭据。

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

备注

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

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 账户的 AWSIAM 用户

  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 用户权限

以下分步说明描述了如何在 AWS 管理控制台中配置 Snowflake 的 IAM 访问权限,以便您可以使用 S3 桶来加载和卸载数据:

  1. 登录 AWS 管理控制台。

  2. 选择 IAM

  3. 从左侧导航窗格中选择 Roles

  4. 选择在 第 2 步:在 AWS 中创建 IAM 角色 (本主题内容)中创建的角色。

  5. 选择 Trust relationships 选项卡。

  6. 选择 Edit trust policy

  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 policy 保存更改。

备注

Snowflake 会将临时凭据缓存一段时间,但不能超过 60 分钟的过期时间。如果您撤消 Snowflake 的访问权限,用户或许也能够从云存储位置列出文件并加载数据,直到缓存过期。

第 6 步:创建外部暂存区

创建外部(如 S3)暂存区,该暂存区引用您在 第 3 步:在 Snowflake 中创建云存储集成 (本主题内容)中创建的存储集成。

备注

创建使用存储集成的暂存区需要具有以下权限的角色:架构的 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 数据文件加密

语言: 中文