外部位置和存储凭据

重要

Unity Catalog 目前为公共预览版。 要使用该预览版,请联系 Azure Databricks 代表。

要安全地与不受 Databricks Runtime 管理的存储交互,请使用:

存储凭据

存储凭据是一个安全的 SQL 对象,它封装了云服务提供商的标识,可以是:

  • AWS IAM 角色
  • Azure 服务主体

创建存储凭据后,可以向主体(用户和组)授予其访问权限。

有权使用存储凭据的用户或组可以通过在 SQL 命令中使用 WITH (CREDENTIAL = credential) 来访问存储凭据涵盖的任何存储路径。

要实现更精细的访问控制,请将存储凭据与外部位置相结合。

存储凭据名称是非限定的,并且在元存储中必须是唯一的。

外部位置

外部位置是一个安全的 SQL 对象,它将存储路径与授权访问该路径的存储凭据相结合。

创建外部位置后,可以向帐户级主体(用户和组)授予其访问权限。

有权使用外部位置的用户或组可以访问该位置路径中的任何存储路径,而无需直接访问存储凭据。

要进一步细化访问控制,你可以在外部表上使用 GRANT 来封装对外部位置中各文件的访问。

外部位置名称是非限定的,并且在元存储中必须是唯一的。

任何外部位置的存储路径都不能包含在另一个外部位置的存储路径中,也不能包含在使用显式存储凭据的外部表的存储路径中。

外部表

外部表是使用 LOCATION 子句引用外部存储路径的

存储路径应该为你已获得访问权限的现有外部位置

或者,你可以引用已被授予其访问权限的存储凭据

使用外部表可以抽象出被授予外部表访问权限的用户的存储路径、外部位置和存储凭据。

警告

为避免意外丢失数据,请不要将架构(数据库)注册到具有现有数据的位置,或者在由架构管理的位置新建外部表。 删除架构会以递归方式删除托管位置中的所有数据文件。

关系的图形表示

下图描述了它们之间的关系:

  • 存储凭据
  • 外部位置
  • 外部表
  • 存储路径
  • IAM 实体
  • Azure 服务帐户

E外部位置 ER 图

示例

使用 CLI 为 Azure 服务主体创建存储凭据 my_azure_storage_cred

databricks unity-catalog create-storage-credential --json '{"name": "my_azure_storage_cred", "azure_service_principal": {"directory_id": "12345678-9abc-def0-1234-56789abcdef0", "application_id": "23456789-9abc-def0-1234-56789abcdef0", "client_secret": "Cli3nt5ecr3t"}}'

其余命令可以在 SQL 中运行。

-- Grant access to the storage credential
> GRANT READ FILES ON STORAGE CREDENTIAL my_azure_storage_cred TO ceo;

-- ceo can directly read from any storage path using myazure_storage_cred
> SELECT count(1) FROM `delta`.`abfss://depts/finance/forecast/somefile` WITH (CREDENTIAL my_azure_storage_cred);
  100
> SELECT count(1) FROM `delta`.`abfss://depts/hr/employees` WITH (CREDENTIAL my_azure_storage_cred);
  2017

-- Create an external location on specific path to which `my_azure_storage_cred` has access
> CREATE EXTERNAL LOCATION finance_loc URL 'abfss://depts/finance'
    WITH (CREDENTIAL my_azure_storage_cred)
    COMMENT 'finance';

-- Grant access to the finance location to
> GRANT READ_FILE ON EXTERNAL LOCATION finance_loc TO finance;

-- `finance` can read from any torage path that under abfss://depts/finance but nowhere else
> SELECT count(1) FROM `delta`.`abfss://depts/finance/forecast/somefile` WITH (CREDENTIAL my_azure_storage_cred);
  100
> SELECT count(1) FROM `delta`.`abfss://depts/hr/employees` WITH (CREDENTIAL my_azure_storage_cred);
  Error

-- `finance` can create an external table over specific object within the `finance_loc` location
> CREATE TABLE sec_filings LOCATION 'abfss://depts/finance/sec_filings`;

-- Grant access to sec filings to all employees
> GRANT SELECT ON TABLE sec_filings TO employee;

-- Any member of the`employee` group can securely read SEC filings
> SELECT count(1) FROM sec_filings;
 20