使用Terraform来管理Snowflake的访问控制

首先

我所在的Life is Tech数据基础设施组使用Snowflake。
Snowflake不仅提供数据库和用户,还可以对许多资源及其各自的灵活权限进行设置,如下图所示。
本次将整理关于Snowflake访问控制引入terraform的背景以及引入terraform时遇到的问题等。

image.png

环境和版本信息

    • Terraform 1.4

 

    snowflake provider 0.67

为什么选择使用Terraform

1. 权限的细分

在最开始,我们是通过图形用户界面(GUI)或者命令行来管理和编辑Snowflake内的数据和各种资源的访问控制。当时Snowflake处理的数据类型和数量较少,并且使用的业务部门和人员也较少,因此这种方式是足够的。

然而,由于使用范围扩展到多个业务部门或者在同一业务部门内使用的人员增加,导致出现了以下需求。

    • 所属していない事業部のデータへのアクセスを禁止する

 

    • テーブル構造などのSnowflake上のリソースの各種定義を誤って変更してしまうことを防ぐ

 

    役割に応じてローデータに近いデータへのアクセスを制御する

因此,我們將開發人員、分析師等角色的設計細分化,並對各種數據的訪問和設定權限進行了精細設定。

权限管理的复杂化

在权限设置上进行了精细的配置,导致了以下问题的发生。

    • 権限設定の状態の確認が面倒

SnowflakeのGUI上だとroleの継承関係や各種DBやSchemaへの権限は各ページに分散しており、確認方法が煩雑

アカウント発行や権限の変更を他者からの承認や確認なしに行えてしまう。変更の証跡
権限付与の漏れや与えるべきでない権限の付与という権限付与のミスが発生。

権限付与のミスが出た場合は、各リソースの詳細ページを目視確認し修正するという手間が発生。

権限の管理上、変更作業の担当者が限られ、タスクの分担ができない。

因此,我们决定通过在 GitHub 上使用 Terraform 进行管理,将其整合到 GitHub 的工作流程中,以便进行审查、批准和应用更改等操作。

使用Terraform的管理范围

Terraform可以通过Snowflake账户来管理表格的每个列,供您参考:https://registry.terraform.io/providers/Snowflake-Labs/snowflake/latest、https://github.com/Snowflake-Labs/terraform-provider-snowflake。

然而,由于我所在的团队已经引入了dbt,并且根据判断,在表结构方面使用dbt和Terraform来实现一致性是不现实的,因此我们确定以下范围将由Terraform进行管理。

image.png

Terraform 的使用和运维中的挑战

地球形成装置不支持

在引入Terraform时,会涉及将现有的各种配置信息作为Terraform的tf文件进行描述的工作。
在这种情况下,如果GoogleCloudPlatform/terraformer是支持的,就可以使用terraformer进行导入,但是Snowflake不受支持,因此需要手动进行terraform import和tf文件的描述。

据说从Terraform 1.5 开始,可以自动生成tf文件。
我想试试Terraform 1.5 可以从现有资源生成HCL。

权力的描述已经上报给上级领导。

由于需要将资源和权限(如USAGE或MONITOR)相乘来设置snowflake_database_grant和snowflake_schema_grant,因此以下示例的描述变得冗长且难以阅读和理解权限设置。
* 如果在更高级别的权限上授予ALL PRIVILEGES这样的情况下,资源的描述只需一个。

resource "snowflake_schema_grant" "dabase_a_public_all_privileges" {
  database_name = snowflake_database.dabase_a.name
  schema_name   = "PUBLIC"

  privilege         = "ALL PRIVILEGES"
  with_grant_option = true

  roles = [
    snowflake_role.developer.name
  ]
}

resource "snowflake_table_grant" "dabase_a_public_tables_select_on_all" {
  database_name = snowflake_database.dabase_a.name
  schema_name   = "PUBLIC"

  privilege         = "SELECT"
  on_all            = true
  with_grant_option = true

  roles = [
    snowflake_role.analyst.name
  ]
}

resource "snowflake_table_grant" "dabase_a_public_tables_select_on_future" {
  database_name = snowflake_database.dabase_a.name
  schema_name   = "PUBLIC"

  privilege         = "SELECT"
  on_future         = true
  with_grant_option = true

  roles = [
    snowflake_role.analyst.name
  ]
}

Snowflake公式也意识到Snowflake公式在权限管理中的描述非常冗长,因此在0.68版本中发布了snowflake_grant_privileges_to_role(Resource)。
参考:❄️ Snowflake官方授权问题更新

广告

在Life Is Tech服务开发部,我们每个月都会举办轻松随意的活动,欢迎您参加。请您从connpass的群组中确认即将举办的活动。如果您对某个活动感兴趣,请务必进行参加登记。我们期待着大家的参与!

bannerAds