配置 Azure 容器以加载数据¶
本主题介绍如何为存储在 Microsoft Azure 容器中的数据文件配置安全访问。
支持的如下几个选项:
- 选项 1:
配置存储集成对象,将外部云存储的身份验证责任委托给 Azure 服务主体。服务主体是一种用于访问 Azure 资源的标识,为配合 Snowflake 等服务结合使用而创建。
借助此选项,您可以更轻松地管理多个用户对 Azure 存储中不同资源的访问。存储集成会存储您的密钥,因此在每次创建外部暂存区时,您无需提供 SAS 令牌。
- 选项 2:
生成共享访问签名 (SAS) 令牌,以授予 Snowflake 对存储账户中对象的受限访问权限。然后,可以使用 SAS 令牌访问引用容器的外部 (Azure) 暂存区。
备注
完成本主题中的说明需要拥有 Azure 的管理权限。如果您不是 Azure 管理员,请让 Azure 管理员执行这些任务。
本主题内容:
选项 1:配置 Snowflake 存储集成¶
本部分将描述如何使用存储集成来允许 Snowflake 从外部 (Azure) 暂存区中引用的 Azure 容器读取数据,并向其中写入数据。集成是已命名的第一类 Snowflake 对象,无需传递显式云提供商凭据(如密钥或访问令牌)。集成对象会存储称为 应用程序注册 的 Azure Identity and Access Management (IAM) 用户 ID。您组织中的管理员在 Azure 账户中授予此应用程序必要的权限。
集成还必须指定容器(和可选路径),以限制用户在创建使用集成的外部暂存区时可以指定的位置。
备注
需要具有在 Azure 中拥有管理存储账户的权限,才能完成本部分中的说明。如果您不是 Azure 管理员,请让 Azure 管理员执行这些任务。
本部分内容:
第 1 步:在 Snowflake 中创建云存储集成¶
使用 CREATE STORAGE INTEGRATION 命令创建存储集成。存储集成是一个 Snowflake 对象,它存储为 Azure 云存储生成的服务主体,以及一组可选的允许或阻止的存储位置(即容器)。组织中的云提供商管理员会将存储位置的权限授予生成的服务主体。此选项可让用户在创建暂存区或加载数据时无需提供凭据。
单个存储集成可以支持多个外部(如 Azure)暂存区。暂存区定义中的 URL 必须与为 STORAGE_ALLOWED_LOCATIONS 参数指定的 Azure 容器(和可选路径)一致。
备注
只有账户管理员(具有 ACCOUNTADMIN 角色的用户)或具有全局 CREATE INTEGRATION 权限的角色才能执行此 SQL 命令。
CREATE STORAGE INTEGRATION <integration_name>
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = 'AZURE'
ENABLED = TRUE
AZURE_TENANT_ID = '<tenant_id>'
STORAGE_ALLOWED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/')
[ STORAGE_BLOCKED_LOCATIONS = ('azure://<account>.blob.core.windows.net/<container>/<path>/', 'azure://<account>.blob.core.windows.net/<container>/<path>/') ]
其中:
integration_name
是新集成的名称。tenant_id
是允许和阻止的存储账户所属的 Office 365 租户的 ID。存储集成只能对一个租户进行身份验证,因此允许和阻止的存储位置必须引用同属于此租户的存储账户。要查找租户 ID,请登录 Azure 门户并点击 Azure Active Directory » Properties。租户 ID 将显示在 Tenant ID 字段中。
container
是存储数据文件的 Azure 容器的名称(例如mycontainer
)。STORAGE_ALLOWED_LOCATIONS 和 STORAGE_BLOCKED_LOCATIONS 参数分别允许或阻止在创建或修改引用此集成的暂存区时访问这些容器。path
是一个可选路径,可用于提供对容器中逻辑目录的精细控制。
以下示例创建一个集成,该集成明确限制使用该集成的外部暂存区只能引用两个容器和路径中的任意一个。在后面的步骤中,我们将创建一个外部暂存区,并引用这些容器和路径之一。使用此集成的多个外部暂存区可以引用受允许的容器和路径:
CREATE STORAGE INTEGRATION azure_int TYPE = EXTERNAL_STAGE STORAGE_PROVIDER = 'AZURE' ENABLED = TRUE AZURE_TENANT_ID = 'a123b4c5-1234-123a-a12b-1a23b45678c9' STORAGE_ALLOWED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/') STORAGE_BLOCKED_LOCATIONS = ('azure://myaccount.blob.core.windows.net/mycontainer1/mypath1/sensitivedata/', 'azure://myaccount.blob.core.windows.net/mycontainer2/mypath2/sensitivedata/');
第 2 步:授予 Snowflake 对存储位置的访问权限¶
执行 DESCRIBE INTEGRATION 命令以检索许可 URL:
DESC STORAGE INTEGRATION <integration_name>;
其中:
integration_name
是您在 第 1 步:在 Snowflake 中创建云存储集成 中创建的集成的名称。
请注意以下列中的值:
- AZURE_CONSENT_URL:
Microsoft 权限请求页面的 URL。
- AZURE_MULTI_TENANT_APP_NAME:
为账户创建的 Snowflake 客户端应用程序的名称。在本部分后面的步骤中,需要授予此应用程序所需的权限,使其在受允许的存储位置上获取访问令牌。
在 Web 浏览器中,导航到 AZURE_CONSENT_URL 列中的 URL。该页面显示 Microsoft 权限请求页面。
点击 Accept 按钮。此操作允许向为 Snowflake 账户创建的 Azure 服务主体授予对租户内指定资源的访问令牌。仅当您授予服务主体对容器的适当权限时,才能成功获取访问令牌(请参阅下一步)。
Microsoft 权限请求页面会重定向到 Snowflake 公司站点 (snowflake.com)。
登录 Microsoft Azure 门户。
导航到 Azure Services » Storage Accounts。点击要授予 Snowflake 服务主体访问权限的存储账户的名称。
点击 Access Control (IAM) » Add role assignment。
选择要授予 Snowflake 服务主体的所需角色:
Storage Blob Data Reader
仅授予读取访问权限。此权限允许从存储账户中暂存的文件加载数据。Storage Blob Data Contributor
授予读取和写入访问权限。此权限允许加载存储账户中暂存的文件内的数据,或是将数据卸载到存储账户中暂存的文件。该角色还允许执行 REMOVE 命令来移除存储账户中暂存的文件。
搜索 Snowflake 服务主体。这是 DESC STORAGE INTEGRATION 输出(第 1 步中)中 AZURE_MULTI_TENANT_APP_NAME 属性的身份。在 AZURE_MULTI_TENANT_APP_NAME 属性中搜索下划线 之前 的字符串。
重要
Azure 可能需要一个小时或更长时间才能创建通过此部分中的 Microsoft 请求页面请求的 Snowflake 服务主体。如果服务主体不能立即使用,我们建议等待一两个小时,然后再次搜索。
如果删除服务主体,存储集成将停止工作。
点击 Review + assign 按钮。
备注
根据 Microsoft Azure 文档,角色分配传播至多可能需要五分钟。
Snowflake 会将临时凭据缓存一段时间,但不能超过 60 分钟的过期时间。如果您撤消 Snowflake 的访问权限,用户或许也能够从云存储位置列出文件并加载数据,直到缓存过期。
第 3 步:创建外部暂存区¶
创建外部 (Azure) 暂存区,该暂存区引用您在 第 1 步:在 Snowflake 中创建云存储集成 (本主题内容)中创建的存储集成。
备注
创建使用存储集成的暂存区需要具有以下权限的角色:架构的 CREATE STAGE 权限以及集成的 USAGE 权限。例如:
GRANT CREATE STAGE ON SCHEMA public TO ROLE myrole; GRANT USAGE ON INTEGRATION azure_int TO ROLE myrole;
要在 CREATE STAGE 语句中引用存储集成,角色必须具有对存储集成对象的 USAGE 权限。
追加正斜杠 (
/
) 到 URL 值,以筛选到指定的文件夹路径。如果省略正斜杠,则包含以指定路径的前缀开头的所有文件和文件夹。请注意,必须添加 正斜杠才能访问和检索暂存区中的非结构化数据文件。
使用 CREATE STAGE 命令创建暂存区。
例如,设置 mydb.public
作为用户会话的当前数据库和架构,然后创建一个名为 my_azure_stage
的暂存区。在此示例中,暂存区引用由集成提供支持的 Azure 容器和路径 mycontainer1/path1
。暂存区还引用名为 my_csv_format
的指定文件格式对象:
USE SCHEMA mydb.public; CREATE STAGE my_azure_stage STORAGE_INTEGRATION = azure_int URL = 'azure://myaccount.blob.core.windows.net/container1/path1' FILE_FORMAT = my_csv_format;
备注
暂存区所有者(即具有暂存区 OWNERSHIP 权限的角色)必须拥有存储集成的 USAGE 权限。
要从使用集成的暂存区加载或卸载数据,角色必须具有暂存区的 USAGE 权限。不必 同时具有存储集成的 USAGE 权限。
将
blob.core.windows.net
端点用于所有受支持类型的 Azure Blob 存储账户,包括 Data Lake Storage Gen2。STORAGE_INTEGRATION 参数与其他暂存区参数分开处理,例如 FILE_FORMAT。无论用于访问 Azure 容器的集成如何,对其他这些参数的支持都是相同的。
选项 2:生成 SAS 令牌¶
第 1 步:生成 SAS 令牌¶
以下分步说明介绍如何生成 SAS 令牌,以授予 Snowflake 对存储账户中对象的受限访问权限:
登录 Azure 门户。
从主页仪表板中选择 Storage Accounts » <storage_account>。在 Security + networking 下选择 Shared access signature。
选择以下 允许的服务:
Blob
选择以下 允许的资源类型:
Container
(列出存储账户中的对象时需要)Object
(从存储账户读取对象/向存储账户写入对象时需要)
选择以下允许的权限,以从 Azure 资源加载数据文件:
读取
列表
如果计划将文件卸载到容器,则还需要
Write
、Add
和Create
权限。此外,要使用PURGE = TRUE
选项,需要Permanent Delete
权限。指定 SAS 令牌的开始和到期日期/时间。可在常规安全计划中安排定期生成不同的 SAS 令牌。
将 Allowed IP addresses 字段留空,并在 Allowed protocols 下指定 HTTPS only 或 HTTPS and HTTP。
点击 Generate SAS and connection string 按钮。在 SAS token 字段记录完整值,以
?
开头,并包含此字符。这是您的 SAS 令牌。您将在创建外部暂存区时指定此令牌。
第 2 步:创建外部暂存区¶
创建一个外部 (Azure) 暂存区,引用 第 1 步:生成 SAS 令牌 (本主题内容)中生成的 SAS 令牌。
以下示例试用 SQL 创建名为 my_azure_stage
的外部暂存区,其中包含 Azure 凭据和 主加密密钥 (https://csrc.nist.gov/glossary/term/master_key)。暂存区 URL 引用 Azure myaccount
账户。数据文件存储在 /load/files
容器和 mycontainer
路径中。该暂存区会引用一个名为 my_csv_format
的命名文件格式对象。请注意,该示例会截断 MASTER_KEY
值:
CREATE OR REPLACE STAGE my_azure_stage URL='azure://myaccount.blob.core.windows.net/mycontainer/load/files' CREDENTIALS=(AZURE_SAS_TOKEN='?sv=2016-05-31&ss=b&srt=sco&sp=rwdl&se=2018-06-27T10:05:50Z&st=2017-06-27T02:05:50Z&spr=https,http&sig=bgqQwoXwxzuD2GJfagRg7VOS8hzNr3QLT7rhS8OFRLQ%3D') ENCRYPTION=(TYPE='AZURE_CSE' MASTER_KEY = 'kPx...') FILE_FORMAT = my_csv_format;
请注意,本示例中使用的 AZURE_SAS_TOKEN 和 MASTER_KEY 的值仅用于说明目的。
备注
通过为暂存区指定命名的文件格式对象(或单个文件格式选项),以后就不必在用于从暂存区加载数据的 COPY 命令中指定相同的文件格式选项。有关文件格式对象和选项的详细信息,请参阅 CREATE FILE FORMAT。
数据文件加密¶
直接在存储账户上为静态数据启用 Azure 存储服务加密 (SSE),Snowflake 会正确加以处理。有关更多信息,请参阅 有关 SSE 的 Azure 文档 (https://docs.microsoft.com/en-us/azure/storage/storage-service-encryption)。
此外,Snowflake 支持客户端加密,可以解密 Azure 容器中暂存的文件。
客户端加密:
AZURE_CSE:需要一个 MASTER_KEY 值。有关信息,请参阅 Microsoft Azure 文档中的 客户端加密信息 (https://docs.microsoft.com/en-us/azure/storage/common/storage-client-side-encryption)。
备注
块 Blob 和 追加 Blob 支持客户端加密,但 页面 Blob 不支持。
下一步: 创建 Azure 暂存区