以使用者身份使用 Lake Formation 托管的数据共享 - Amazon Redshift

以使用者身份使用 Lake Formation 托管的数据共享

使用 Amazon Redshift,您可以访问和分析通过 AWS Lake Formation 数据共享与您共享的数据。数据共享是一种数据产品,包含来自不同数据来源的数据对象集合,如表或数据库。

AWS Lake Formation 管理员发现数据共享邀请并在 AWS Glue Data Catalog 中创建链接到数据共享的数据库后,使用者集群或工作组管理员可以将集群与数据共享和 AWS Glue Data Catalog 中的数据库相关联,创建使用者集群或工作组的本地数据库,并向 Amazon Redshift 使用者集群或工作组中的用户和角色授予访问权限,以便开始查询。按照这些步骤设置查询权限。

  1. 如果需要,在 Amazon Redshift 控制台上创建一个 Redshift 集群,用作使用者集群或工作组。有关如何创建集群的信息,请参阅创建集群

  2. 要列出用户可以访问 AWS Glue Data Catalog 使用者集群或工作组中的哪些数据库,请运行 SHOW DATABASES 命令。

    SHOW DATABASES FROM DATA CATALOG [ACCOUNT <account-id>,<account-id2>] [LIKE <expression>]

    执行此命令会列出 Data Catalog 中可用的资源,例如 AWS Glue 数据库的 ARN、数据库名称和有关数据共享的信息。

  3. 使用来自 SHOW DATABASES 的 AWS Glue 数据库 ARN 在使用者集群或工作组中创建本地数据库。有关更多信息,请参阅创建数据库

    CREATE DATABASE lf_db FROM ARN <lake-formation-database-ARN> WITH [NO] DATA CATALOG SCHEMA [<schema>];
  4. 根据需要,向使用者集群或工作组中的用户和角色授予对从数据共享创建的数据库和架构引用的权限。有关更多信息,请参阅授权撤销。请注意,通过 CREATE USER 命令创建的用户无法访问数据共享中已共享到 Lake Formation 的对象。只有同时具有 Redshift 和 Lake Formation 访问权限的用户才可以访问已与 Lake Formation 共享的数据共享。

    GRANT USAGE ON DATABASE sales_db TO IAM:Bob;

    作为使用者集群或工作组管理员,您只能将对从数据共享创建的整个数据库的权限分配给您的用户和角色。在某些情况下,您需要对根据数据共享创建的数据库对象子集进行精细控制。

    您还可以基于共享的对象创建后期绑定视图,并使用这些视图来分配精细权限。您还可以考虑让生产者集群或工作组为您创建具有所需精细度的额外的数据共享。您可以为从数据共享中创建的数据库创建尽可能多的 schema 引用。

  5. 数据库用户可以使用视图 SVV_EXTERNAL_TABLES 和 SVV_EXTERNAL_COLUMNS 来查找 AWS Glue 数据库中的所有共享表或列

    SELECT * from svv_external_tables WHERE redshift_database_name = 'lf_db'; SELECT * from svv_external_columns WHERE redshift_database_name = 'lf_db';
  6. 在数据共享中查询共享对象中的数据。

    对使用者集群或工作组上的使用者数据库和架构具有权限的用户和角色可以浏览和导航任何共享对象的元数据。他们还可以浏览和导航使用者集群或工作组中的本地对象。为此,他们可以使用 JDBC 或 ODBC 驱动程序或 SVV_ALL 和 SVV_EXTERNAL 视图。

    SELECT * FROM lf_db.schema.table;

    您只能在共享对象上使用 SELECT 语句。但是,您可以通过查询来自不同本地数据库中的共享对象的数据,在使用者集群中创建表。

    // Connect to a local cluster database // Create a view on shared objects and access it. CREATE VIEW sales_data AS SELECT * FROM sales_db.public.tickit_sales_redshift WITH NO SCHEMA BINDING; SELECT * FROM sales_data;