【问题标题】:Automating Redshift Permissions自动化 Redshift 权限
【发布时间】:2020-05-18 14:28:34
【问题描述】:

我正在尝试自动化 Redshift 上的一些 SQL 查询,这些查询是由用户权限“触发”的。

查询只是使用customer_id 过滤器创建表视图,使用customer_id 创建用户并授予该customer_id 读取表视图的权限。这可以防止不同的客户看到彼此的数据,并且当我手动实现它时效果很好。

我面临的问题是自动执行此操作,因为我目前在 Redshift 中手动执行此操作。我想自动化这个给定的

我的考虑:

  1. Redshift - 不支持触​​发器。
  2. Lambda 触发器 - Lambda 不会从 Redshift 触发。
  3. API 网关 - “请求”也不是 API 调用,因此客户端不会为权限进行 API 调用(它们是非技术性的)。
  4. 气流 - 似乎是一个非常小的东西的大设置。但可以工作。
  5. Glue - 我目前正在使用 Glue 加载到 Redshift。也许我可以在工作流中添加一些东西来获得不同的 customer_id 列表,然后在 Redshift 上运行 SQL(通过工作流)?

请问您对此有何想法或建议?

【问题讨论】:

  • 确切的问题是什么?是自动设置的能力,还是如何触发设置脚本?
  • @JohnRotenstein 都是问题所在,我想当我指的是“自动化”时,我指的是两个步骤。 :)
  • 那么什么动作触发了整个过程呢?是在有人注册应用程序时吗?您是否允许外部人员(客户)直接访问您的数据库?这通常不是一个好主意,因为很难控制/限制他们在数据库中的操作。一种首选方法是授予对可以代表他们发出请求的 API 的访问权限。
  • @JohnRotenstein - 是数据库的外部人员。因此,我正在创建视图和用户,因此他们看不到彼此的数据。我建议了 API 路线,但公司拒绝了。数据有一个“customer_id”列,该列对外部客户来说是唯一的,它决定了“拆分”。

标签: amazon-web-services amazon-redshift airflow aws-glue


【解决方案1】:

您可以使用惰性模式来创建视图和权限。在 API-lambda 中:

  1. 检查是否存在客户 ID 视图。如果是,请检查用户是否是 创建并获得许可。然后使用 customer_id 用户获取数据
  2. 如果未创建视图,则使用 SQL 查询创建它,转到步骤 #3
  3. 如果未创建用户,则使用 SQL 查询创建,转到步骤#4

  4. 如果没有创建用户权限,使用SQL查询创建,转到步骤#1

对于第一个请求,您必须在超级用户和 customer_id 用户之间切换连接,然后它将使用 customer_id 用户进行所有后续请求。

【讨论】:

  • 问题是表中可能有数百万个 customer_id ......所以会有 1m+ 视图设置和权限。我猜这很好,但有什么办法可以优化它?
【解决方案2】:

您应该创建一个使用current_user的视图,而不是为每个用户使用不同的视图。

这将返回当前登录用户的用户名。因此,查询可以使用 Where 子句中的用户名将行限制为与其身份匹配的行。

它需要一个包含用户名的列,或者视图需要加入一个可以将用户名与customer_id匹配的表。

应该是这样的:

CREATE VIEW foo
AS
SELECT
  ...
FROM table
JOIN users USING (customer_id)
WHERE users.username = current_user

【讨论】:

  • 您可能有多个客户在同一时间点查询数据,因此 current_user 可能是多个用户?
  • current_user 将设置为运行当前查询的任何用户的用户名。因此,每个用户的结果看起来都不同。它不会将数据放入视图中——它会更改视图运行以获取数据的查询。是否有多个用户正在运行查询并不重要——他们只会看到“他们的”数据。
  • 好吧,我试试这个!
  • 我建议你通过创建一个新表来测试这个概念,其中username 作为一列,另一列是假数据。然后,SELECT * FROM table WHERE username = current_user。您应该只看到该用户的行。接下来,将其转换为 View 以证明它为不同的用户显示不同的数据。最后,将该概念应用到您现有的表中。
猜你喜欢
  • 1970-01-01
  • 2023-02-04
  • 2021-12-22
  • 1970-01-01
  • 2019-04-24
  • 2021-06-21
  • 2020-07-26
  • 1970-01-01
  • 2019-01-14
相关资源
最近更新 更多