自动刷新 Amazon S3 的外部表¶
您可以使用 Amazon SQS (Simple Queue Service) (https://aws.amazon.com/sqs/) 通知为 S3 桶自动创建外部表和刷新外部表元数据。此操作会将元数据与外部暂存区和路径中的最新一组关联文件同步:
路径中的新文件将添加到表元数据中。
对路径中文件的更改将在表元数据中更新。
路径中不再存在的文件将从表元数据中移除。
先决条件¶
在继续操作之前,请确保满足以下先决条件:
该功能仅限于 Amazon Web Services (AWS) 上的 Snowflake 账户。
要完成本主题中描述的任务,必须使用对架构具有 CREATE STAGE 和 CREATE EXTERNAL TABLE 权限的角色。
此外,您还必须具有 AWS 的管理权限。如果您不是 AWS 管理员,请让 AWS 管理员完成配置 AWS 事件通知的步骤。
Snowflake 建议您仅发送外部表支持的事件,以降低成本、事件干扰和延迟。
外部表不支持存储版本控制(S3 版本控制、Google Cloud Storage 中的对象版本控制或 Azure Storage 的版本控制)。
使用 Amazon SQS 自动刷新外部表的限制¶
Virtual Private Snowflake (VPS) 和 AWS PrivateLink 客户:AWS 目前不支持 Amazon SQS 作为 VPC 端点 (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html)。虽然 VPC 中的 AWS 服务(包括 VPS)可以与 SQS 通信,但此流量不在 VPC 内,因此不受 VPC 保护。
当新文件到达受监控的 S3 桶并可以加载时,SQS 通知会通知 Snowflake。SQS 通知包含 S3 事件和文件名列表。它们 不 包括文件中的实际数据。
云平台支持¶
通过使用 S3 事件消息触发自动外部元数据刷新,仅受托管在 AWS 上的 Snowflake 账户支持。
配置对 Cloud Storage 的安全访问¶
重要
如果您已经为存储数据文件的 S3 桶配置了安全访问,请跳过此部分,直接进入 创建新的 S3 事件通知或使用现有通知。
本部分介绍如何使用存储集成来允许 Snowflake 从外部(如 S3)暂存区中引用的 Amazon S3 桶读取数据,并向其中写入数据。集成是已命名的第一类 Snowflake 对象,无需传递显式云提供商凭据(如密钥或访问令牌)。集成对象存储 AWS Identity and Access Management (IAM) 用户 ID。您组织中的管理员在 AWS 账户向集成授予 IAM 用户权限。
集成还可以列出桶(和可选路径),以限制用户在创建使用集成的外部暂存区时可以指定的位置。
备注
需要在 AWS 中拥有创建和管理 IAM 策略和角色的权限,才能完成本部分中的说明。如果您不是 AWS 管理员,请让 AWS 管理员来执行这些任务。
请注意,目前只能通过在同一政府区域的 AWS 上托管的 Snowflake 账户,使用存储集成访问 政府区域 中的 S3 存储。支持使用直接凭据从政府区域之外托管的账户访问 S3 存储。
下图显示了 S3 暂存区的集成流程:

外部(即 S3)暂存区在其定义中引用了存储集成对象。
Snowflake 会自动将存储集成与为您的账户创建的 S3 IAM 用户相关联。Snowflake 会创建一个 IAM 用户,供 Snowflake 账户中的所有 S3 存储集成引用。
您组织中的 AWS 管理员向 IAM 用户授予权限,以访问暂存区定义中引用的桶。请注意,许多外部暂存区对象可以引用不同的桶和路径,并使用相同的存储集成进行身份验证。
当用户从暂存区加载或卸载数据时,Snowflake 会在允许或拒绝访问之前验证桶上授予 IAM 用户的权限。
重要
Snowflake 强烈建议您配置安全访问,这样在访问云存储时便无需提供 IAM 凭据。有关更多存储访问选项,请参阅 配置对 Amazon S3 的安全访问。
本部分内容:
第 1 步:配置 S3 桶的访问权限¶
AWS 访问控制要求¶
Snowflake 需要对 S3 桶和文件夹拥有以下权限才能访问该文件夹(以及子文件夹)中的文件:
s3:GetBucketLocation
s3:GetObject
s3:GetObjectVersion
s3:ListBucket
作为最佳实践,Snowflake 建议您为 Snowflake 访问 S3 桶创建一个 IAM 策略。然后,您可以将策略附加到角色,并使用由 AWS 为角色生成的安全凭据来访问桶中的文件。
创建 IAM 策略¶
请完成以下步骤,为 Snowflake 配置访问权限,以便访问您的 S3 桶:
登录 AWS 管理控制台。
从主页仪表板搜索,然后选择 IAM。
从左侧导航窗格中选择 Account settings。
在 Endpoints 列表中的 Security Token Service (STS) 下,找到账户所在位置对应的 Snowflake 区域。
如果 STS status 处于非活动状态,请将切换键移动到 Active。
从左侧导航窗格中选择 Policies。
选择 Create Policy。
对于 Policy editor,选择 JSON。
要添加允许 Snowflake 访问 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>/*" ] } } } ] }
备注
此策略文档(采用 JSON 格式)为 Snowflake 提供使用单个桶和文件夹路径加载或卸载数据所需的权限。
Amazon Resource Names (ARN) for buckets in government regions have a
arn:aws-us-gov:s3:::
prefix.将
"s3:prefix":
条件设置为["*"]
或者["<path>/*"]
,以便分别向指定桶中的所有前缀或桶中的路径分别授予访问权限。AWS 策略支持多种不同的安全用例。
使用实际桶名称和文件夹路径前缀替换
bucket
和prefix
。选择 Next。
输入 Policy name (例如
snowflake_access
)和可选的 Description。选择 Create policy。
第 2 步:在 AWS 中创建 IAM 角色¶
要在 AWS 管理控制台中为 Snowflake 配置访问权限,请执行以下操作:
在 Identity and Access Management (IAM) 控制面板的左侧导航窗格中,选择 Roles。
选择 Create role。
选择 AWS account 作为信任实体类型。
选择 Another AWS account
在 Account ID 字段中,暂时输入自己的 AWS 账户 ID。在稍后的步骤中,您将修改信任关系并授予对 Snowflake 的访问权限。
选择 Require external ID 选项。外部 ID 用于向第三方(如 Snowflake)授予对 AWS 资源(例如 S3 桶)的访问权限。
输入占位符 ID,例如
0000
。在后续步骤中,您将修改 IAM 角色的信任关系并指定外部 ID 用于存储集成。选择 Next。
选择您在 `第 1 步:配置 S3 桶访问权限`_(本主题内容)中创建的策略。
选择 Next。
输入角色的名称和描述,然后选择 Create role。
您现在已经为一个桶创建了 IAM 策略,创建了一个 IAM 角色,并将策略附加到了该角色。
在角色摘要页面上,找到 Role ARN 值并将其记录下来。在下一步中,您将创建引用此角色的 Snowflake 集成。
备注
Snowflake 会将临时凭据缓存一段时间,但不能超过 60 分钟的过期时间。如果您撤销 Snowflake 的访问权限,用户或许也能够从云存储位置列出文件并访问数据,直到缓存过期。
第 3 步:在 Snowflake 中创建云存储集成¶
使用 CREATE STORAGE INTEGRATION 命令创建存储集成。存储集成是一个 Snowflake 对象,用于存储为 S3 云存储生成的 Identity and Access Management (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 = ('<protocol>://<bucket>/<path>/', '<protocol>://<bucket>/<path>/')
[ STORAGE_BLOCKED_LOCATIONS = ('<protocol>://<bucket>/<path>/', '<protocol>://<bucket>/<path>/') ]
其中:
integration_name
是新集成的名称。iam_role
是您在 `第 2 步:在 AWS 中创建 IAM 角色`_(本主题内容)中创建的角色的 Amazon 资源名称 (ARN)。protocol
是以下其中一项:s3
是指中国境外公共 AWS 区域的 S3 存储。s3china
代表中国境内公共 AWS 区域中的 S3 存储。s3gov
代表 政府区域 中的 S3 存储。
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/');
备注
(可选)使用 STORAGE_AWS_EXTERNAL_ID 参数来指定您自己的外部 ID。您可以选择此选项,在多个外部卷和/或存储集成中使用相同的外部 ID。
第 4 步:检索您的 Snowflake 账户的 AWS IAM 用户¶
要检索自动为您的 Snowflake 账户创建的 IAM 用户的 ARN,请使用 DESCRIBE INTEGRATION。
DESC INTEGRATION <integration_name>;
其中:
integration_name
是您在 第 3 步:在 Snowflake 中创建云存储集成 (本主题内容)中创建的集成的名称。
例如:
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= | | +---------------------------+---------------+--------------------------------------------------------------------------------+------------------+
记录以下属性的值:
属性
描述
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 桶来加载和卸载数据:
登录 AWS 管理控制台。
选择 IAM。
从左侧导航窗格中选择 Roles。
选择在 `第 2 步:在 AWS 中创建 IAM 角色`_(本主题内容)中创建的角色。
选择 Trust relationships 选项卡。
选择 Edit trust policy。
使用您在 `第 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_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,所以它不能解析信任关系,除非更新信任策略。
选择 Update policy 保存更改。
备注
Snowflake 会将临时凭据缓存一段时间,但不能超过 60 分钟的过期时间。如果您撤消 Snowflake 的访问权限,用户或许也能够从云存储位置列出文件并加载数据,直到缓存过期。
备注
您可以使用 SYSTEM$VALIDATE_STORAGE_INTEGRATION 函数验证存储集成的配置。
创建新的 S3 事件通知或使用现有通知¶
在继续操作之前,请确定数据文件所在的 S3 桶中的目标路径(或 AWS 术语中的 前缀)是否存在 S3 事件通知。AWS 规则禁止为同一路径创建冲突的通知。
您可以通过 Amazon SQS 自动刷新外部表元数据,有两种选择:
- 选项 1:创建新的 S3 事件通知
这是最常见的选项。为 S3 桶中的目标路径创建事件通知。当路径中的新文件、已移除文件或已修改文件需要刷新外部表元数据时,事件通知会通过 SQS 队列通知 Snowflake。
重要
如果您的 S3 桶存在冲突事件通知,请改用选项 2。
有关分步说明,请参阅 选项 1:创建新的 S3 事件通知。
- 选项 2:配置 Amazon SNS
如果已经存在事件通知,可以将 Amazon Simple Notification Service (SNS) (https://aws.amazon.com/sns/) 配置为广播器,将某一路径的通知共享给多个终端(或 订阅者,例如 SQS 队列或 AWS Lambda 工作负载),其中包括用于外部表刷新自动化的 Snowflake SQS 队列。由 SNS 发布的 S3 事件通知会通过 SQS 队列告知 Snowflake 路径中的文件更改。
有关分步说明,请参阅 `选项 2:配置 Amazon SNS`_(本主题后文内容)。
选项 1:创建新的 S3 事件通知¶
本部分提供分步操作说明,介绍如何通过 Amazon Simple Queue Service (SQS) (https://aws.amazon.com/sqs/) 通知为 S3 桶配置自动刷新外部表元数据的最常用选项。这些步骤说明了如何为已存储数据文件的 S3 桶中的目标路径(或 AWS 术语中的 前缀)创建事件通知。
重要
如果 S3 桶存在冲突的事件通知,请改用 `选项 2:配置 Amazon SNS`_(本主题后文内容)。AWS 规则禁止为同一目标路径创建冲突的通知。
(可选)第 1 步:创建暂存区¶
使用 CREATE STAGE 命令创建引用您的 S3 桶的外部暂存区。Snowflake 将暂存数据文件读入外部表元数据。或者,您可以使用现有的外部暂存区。
备注
要配置对云存储位置的安全访问,请参阅 :ref:`label-tables_external_secure_access`(本主题内容)。
要在 CREATE STAGE 语句中引用存储集成,角色必须具有对存储集成对象的 USAGE 权限。
以下示例会在活动架构中为用户会话创建一个名为 mystage
的暂存区。云存储 URL 包括路径 files
。该暂存区引用名为 my_storage_int
的存储集成。
USE SCHEMA mydb.public; CREATE STAGE mystage URL = 's3://mybucket/files' STORAGE_INTEGRATION = my_storage_int;
第 2 步:创建外部表¶
使用 CREATE EXTERNAL TABLE 命令创建外部表。例如,在 mydb.public
架构中创建一个外部表,从暂存文件中读取 JSON 数据。
暂存区引用包括名为 path1
的文件夹路径。外部表将此路径追加到暂存区定义中,即,外部表引用 @mystage/files/path1
中的数据文件。
AUTO_REFRESH
参数默认为 TRUE
:
CREATE OR REPLACE EXTERNAL TABLE ext_table WITH LOCATION = @mystage/path1/ FILE_FORMAT = (TYPE = JSON);
第 3 步:配置事件通知¶
为您的 S3 桶配置事件通知,以便在新数据或更新数据可读取到外部表元数据时通知 Snowflake。自动刷新功能依赖于将事件通知从 S3 传递到 Snowflake 的 SQS 队列。
为便于使用,这些 SQS 队列由 Snowflake 创建和管理。SHOW EXTERNAL TABLES 命令输出显示 SQS 队列的 Amazon Resource Name (ARN)。
运行 SHOW EXTERNAL TABLES 命令:
SHOW EXTERNAL TABLES;
在
notification_channel
列中,找到外部表对应的 SQS 队列 ARN,并将 ARN 复制到便捷位置。备注
根据 AWS 准则,Snowflake 为每个 AWS S3 区域指定的 SQS 队列不超过一个。此 SQS 队列可由同一 AWS 账户中的多个桶共享。SQS 队列协调从同一 S3 桶读取数据文件的所有外部表的通知。当新的或修改的数据文件上传到桶时,所有与暂存区目录路径匹配的外部表定义都会将文件详细信息读入到其元数据中。
登录 AWS 管理控制台。
使用 Amazon S3 文档 (https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-event-notifications.html) 中提供的说明为您的 S3 桶配置事件通知。按以下列表所示填写字段:
Name:事件通知的名称(例如
Auto-ingest Snowflake
)。Events:选择 ObjectCreate (All) 和 ObjectRemoved 选项。
Send to:从下拉列表中选择 SQS Queue。
SQS:从下拉列表中选择 Add SQS queue ARN。
SQS queue ARN:粘贴 SHOW EXTERNAL TABLES 输出中的 SQS 队列名称。
备注
这些说明旨在创建单一事件通知,来监控整个 S3 桶的活动。这是最简单的方法。此通知处理 S3 桶目录中更精细级别配置的所有外部表。
或者,在之前的步骤中,配置一个或多个路径和文件扩展名(或 AWS 术语中的 前缀 和 后缀)来筛选事件活动。有关说明,请参阅相关 AWS 文档主题 (https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) 的对象键名筛选信息。对您希望通知监控的每个其他路径或文件扩展名重复这些步骤。
AWS 将这些通知 队列配置 的数量限制为每个 S3 桶最多 100 个。
AWS 不允许同一 S3 桶的重叠队列配置(跨事件通知)。例如,如果为 s3://mybucket/files/path1
配置了现有通知,那么您就无法在更高级别(例如 s3://mybucket/files
)创建另一个通知,反之亦然。
完成此步骤后,即已配置启用自动刷新的外部暂存区。
将新的或更新的数据文件添加到 S3 桶时,事件通知会通知 Snowflake 将它们扫描到外部表元数据中。
第 4 步:手动刷新外部表元数据¶
使用带有 REFRESH 参数的 ALTER EXTERNAL TABLE 手动刷新一次外部表元数据;例如:
ALTER EXTERNAL TABLE ext_table REFRESH;
此步骤确保元数据与自第 2 步以来发生的文件列表的任何变更同步。此后,S3 事件通知会自动触发元数据刷新。
第 5 步:配置安全性¶
对于将用于查询外部表的每个附加角色,请使用 GRANT <privileges> ... TO ROLE 授予对各种对象(即数据库、架构、暂存区和表)的足够的访问控制权限:
对象 |
权限 |
备注 |
---|---|---|
数据库 |
USAGE |
|
架构 |
USAGE |
|
命名暂存区 |
USAGE、READ |
|
命名文件格式 |
USAGE |
|
外部表 |
SELECT |
选项 2:配置 Amazon SNS¶
本节提供分步操作说明,介绍如何通过 S3 桶的 Amazon SQS (Simple Queue Service) (https://aws.amazon.com/sqs/) 通知自动触发外部表元数据刷新。这些步骤解释了如何将 Amazon Simple Notification Service (SNS) (https://aws.amazon.com/sns/) 配置为广播器,以便向多个订阅者发布 S3 桶的事件通知(例如 SQS队列或 AWS Lambda 工作负载),包括用于外部表刷新自动化的 Snowflake SQS 队列。
备注
要使这些说明生效,您的 S3 桶中必须已经存在目标路径的事件通知(即数据文件所在路径)。如果不存在事件通知,请执行以下任务之一:
改为按照 `选项 1:创建新的 S3 事件通知`_(本主题前文内容)操作。
为您的 S3 桶创建事件通知,然后继续按照本部分中的说明操作。有关更多信息,请参阅 Amazon S3 文档 (https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-event-notifications.html)。
先决条件:创建 Amazon SNS 主题和订阅¶
在您的 SNS 账户中创建一个 AWS 主题来处理 S3 桶上 Snowflake 暂存区位置的所有消息。
将 S3 事件通知的目标目的地(例如,其他 SQS 队列或 AWS Lambda 工作负载)订阅到此主题。SNS 会向该主题的所有订阅者发布您的桶的事件通知。
有关说明,请参阅 SNS 文档 (https://aws.amazon.com/documentation/sns/)。
第 1 步:将 Snowflake SQS 队列订阅至 SNS 主题¶
登录 AWS 管理控制台。
从主页仪表板中选择 Simple Notification Service (SNS)。
从左侧导航窗格中选择 Topics。
找到您的 S3 桶主题。注意主题 ARN。
使用 Snowflake 客户端,用您的 SNS 主题 ARN 查询 SYSTEM$GET_AWS_SNS_IAM_POLICY 系统函数:
select system$get_aws_sns_iam_policy('<sns_topic_arn>');
该函数返回一个授予 Snowflake SQS 队列权限以订阅 SNS 主题的 IAM 策略。
例如:
select system$get_aws_sns_iam_policy('arn:aws:sns:us-west-2:001234567890:s3_mybucket'); +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | SYSTEM$GET_AWS_SNS_IAM_POLICY('ARN:AWS:SNS:US-WEST-2:001234567890:S3_MYBUCKET') | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | {"Version":"2012-10-17","Statement":[{"Sid":"1","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234"},"Action":["sns:Subscribe"],"Resource":["arn:aws:sns:us-west-2:001234567890:s3_mybucket"]}]} | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
返回 AWS 管理控制台。从左侧导航窗格中选择 Topics。
选择您的 S3 桶的主题,然后点击 Edit 按钮。Edit 页面随即打开。
点击 Access policy - Optional 以展开页面的此区域。
将 SYSTEM$GET_AWS_SNS_IAM_POLICY 函数结果中添加的 IAM 策略合并到 JSON 文档中。
例如:
原始 IAM 策略(缩写):
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. } ] }
合并的 IAM 策略:
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. }, { "Sid":"1", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234" }, "Action":[ "sns:Subscribe" ], "Resource":[ "arn:aws:sns:us-west-2:001234567890:s3_mybucket" ] } ] }
添加额外的策略授权以允许 S3 将桶的事件通知发布到 SNS 主题。
例如(使用 SNS 主题 ARN 以及这些说明中使用的 S3 桶):
{ "Sid":"s3-event-notifier", "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"SNS:Publish", "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket" } } }
合并的 IAM 策略:
{ "Version":"2008-10-17", "Id":"__default_policy_ID", "Statement":[ { "Sid":"__default_statement_ID", "Effect":"Allow", "Principal":{ "AWS":"*" } .. }, { "Sid":"1", "Effect":"Allow", "Principal":{ "AWS":"arn:aws:iam::123456789001:user/vj4g-a-abcd1234" }, "Action":[ "sns:Subscribe" ], "Resource":[ "arn:aws:sns:us-west-2:001234567890:s3_mybucket" ] }, { "Sid":"s3-event-notifier", "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"SNS:Publish", "Resource":"arn:aws:sns:us-west-2:001234567890:s3_mybucket", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:s3:*:*:s3_mybucket" } } } ] }
点击 Save changes。
(可选)第 2 步:创建暂存区¶
使用 CREATE STAGE 命令创建引用您的 S3 桶的外部暂存区。Snowflake 将暂存数据文件读入外部表元数据。
或者,您可以使用现有的外部暂存区。
备注
要配置对云存储位置的安全访问,请参阅 `配置对 Cloud Storage 的安全访问`_(本主题前文内容)。
要在 CREATE STAGE 语句中引用存储集成,角色必须具有对存储集成对象的 USAGE 权限。
以下示例会在活动架构中为用户会话创建一个名为 mystage
的暂存区。云存储 URL 包括路径 files
。该暂存区引用名为 my_storage_int
的存储集成:
USE SCHEMA mydb.public; CREATE STAGE mystage URL = 's3://mybucket/files' STORAGE_INTEGRATION = my_storage_int;
第 3 步:创建外部表¶
使用 CREATE EXTERNAL TABLE 创建外部表。从 先决条件:创建 Amazon SNS 主题和订阅 中识别 SNS 主题 ARN。
CREATE EXTERNAL TABLE <table_name>
..
AWS_SNS_TOPIC = '<sns_topic_arn>';
其中:
AWS_SNS_TOPIC = '<sns_topic_arn>'
为 S3 桶的 SNS 主题指定 ARN。CREATE EXTERNAL TABLE 语句将 Snowflake SQS 队列订阅至指定的 SNS 话题。
例如,在 mydb.public
架构中创建一个外部表,从暂存文件中读取 JSON 数据。暂存区引用包括名为 path1
的文件夹路径。外部表将此路径追加到暂存区定义中,即,外部表引用 @mystage/files/path1
中的数据文件。AUTO_REFRESH
参数默认为 TRUE
:
CREATE EXTERNAL TABLE ext_table
WITH LOCATION = @mystage/path1/
FILE_FORMAT = (TYPE = JSON)
AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket';
要从外部表中移除此参数,您必须使用 CREATE OR REPLACE EXTERNAL TABLE 语法重新创建外部表。
第 4 步:手动刷新外部表元数据¶
使用带有 REFRESH 参数的 ALTER EXTERNAL TABLE 手动刷新一次外部表元数据;例如:
ALTER EXTERNAL TABLE ext_table REFRESH;
此步骤确保元数据与自第 3 步以来发生的文件列表的任何变更同步。此后,S3 事件通知会自动触发元数据刷新。
第 5 步:配置安全性¶
对于将用于查询外部表的每个附加角色,请使用 GRANT <privileges> ... TO ROLE 授予对各种对象(即数据库、架构、暂存区和表)的足够的访问控制权限:
对象 |
权限 |
备注 |
---|---|---|
数据库 |
USAGE |
|
架构 |
USAGE |
|
命名暂存区 |
USAGE、READ |
|
命名文件格式 |
USAGE |
|
外部表 |
SELECT |