将Snowflake转化为Terraform形式
这篇文章是note株式会社的日历 | 2023年圣诞日历 – Qiita的第二天的文章。
这是将Snowflake转换为Terraform时的记录。
背景( )
我们在Note中选择了Snowflake作为数据仓库。
在Snowflake中,需要管理许多资源,包括数据库、模式、仓库以及权限等。
即使在Snowflake的WEB界面上,您也可以管理它们,但同时也会带来常见的问题。
-
- 変更の履歴が追いづらい
-
- いつ変更されたかわからない
-
- 変更をレビューしづらい
- 同じの環境の再構築・再現が難しい
今篇文章的核心是通过Terraform将这些问题编码来寻求解决方案。
由于基础设施的编码化,您可以直接利用先前的开发知识和工具,比如git。
将Snowflake进行Terraform化
只需要一个选项,用中文将以下内容重新表达:
需要由Terraform管理的项目或不需要由Terraform管理的项目。
首先需要确定在Terraform中要管理的内容。
如果能够直接决定要管理的事项就好了,但由于资源种类繁多,我认为先决定不需要管理的事项,然后再轻松地确定需要管理的事项。
不需要管理的事物
对于本次,我们规定了以下不进行管理的事项。
-
- Terraform以外の方法で管理すると決めてあるもの
-
- チーム外の人が細かく変更する可能性のあるもの
-
- 今現在使っていないもの
- コード化すると量が膨大なもの
作为这个理由的原因,可以举出以下几点。 de , jǔ chū jǐ .)
-
- Terraform管理とのバッティングをなくすこと
-
- Terraformを覚える必要がない人にも変更できる余地を残すこと
- コード化すると逆に管理が大変になってしまうことを防ぐこと
如下是已发布的新政策,根据这个政策,企业必须遵守更严格的环境保护法规,并推行可持续发展的经营模式。这个政策旨在减少碳排放量,提高能源效率,并加强对自然资源的保护。根据政府的要求,企业需要采取切实有效的措施来实现这些目标,以确保我们的环境能够持续健康发展。
在笔记中,UDF和存储过程的编码是通过Python完成,然后通过CI进行部署和管理。
关于表格权限,似乎是为每个角色、表格和操作(SELECT / INSERT / UPDATE / DELETE)分别创建的,数量庞大。
-- テーブルの権限一覧
select * from snowflake.account_usage.grants_to_roles where granted_on = 'TABLE' and granted_to = 'ROLE';
考虑到未来授予等功能,我们得出结论,表格权限管理并不一定需要使用Terraform。
管理者或管理的对象
由于已确定不需要进行管理的事物,因此可以决定自动管理的事物。
本次我们将使用Terraform来管理以下资源。
-
- snowflake_database
-
- snowflake_database_grant
-
- snowflake_file_format
-
- snowflake_file_format_grant
-
- snowflake_integration_grant
-
- snowflake_notification_integration
-
- snowflake_resource_monitor
-
- snowflake_resource_monitor_grant
-
- snowflake_role
-
- snowflake_role_grants
-
- snowflake_schema
-
- snowflake_schema_grant
-
- snowflake_stage
-
- snowflake_stage_grant
-
- snowflake_storage_integration
-
- snowflake_task
-
- snowflake_task_grant
-
- snowflake_user
-
- snowflake_user_grant
-
- snowflake_warehouse
- snowflake_warehouse_grant
引入现有资源
为了利用现有资源,首先需要将Snowflake中的资源转化为Terraform的代码。
由于在Note中已经使用Snowflake超过1年的时间了,所以手动进行此操作很麻烦。
如果使用AWS等,可能可以使用像terraformer这样的开源软件来轻松自动导入,但是我找不到适用于Snowflake的相关工具。
因此,雖然有點麻煩,但我們決定按照以下步驟將現有的Snowflake資源導入到Terraform中。
-
- 按照官方文档创建Terraform用户
-
- (似乎不推荐授予ACCOUNTADMIN角色)
爬取Snowflake提供程序的文档
根据第2步的结果生成Python类
使用第3步的结果和SQL生成Terraform代码
手动修复以确保terraform plan没有差异
关于将权限进行Terraform化
据说通过Terraform,Snowflake的权限资源有两种主要的管理方法。
-
- ① snowflake_<リソース名>_grantを利用するもの
- ② snowflake_grant_privileges_to_role を利用するもの
由于方案①的代码冗长且难以管理,似乎引入了方案②。
如果按照实际的方法,将snowflake_file_format_grant等代码化,并执行terraform plan,会显示如下警告。
$ terraform plan
... <省略> ...
Warning: Deprecated Resource
│
│ with snowflake_file_format_grant.a_4f7108a1_f414_46ce_af52_b976fea8cb3c,
│ on config_file_format_grant.tf line 1, in resource "snowflake_file_format_grant" "a_4f7108a1_f414_46ce_af52_b976fea8cb3c":
│ 1: resource "snowflake_file_format_grant" "a_4f7108a1_f414_46ce_af52_b976fea8cb3c" {
│
│ This resource is deprecated and will be removed in a future major version release. Please use snowflake_grant_privileges_to_role instead.
该资源已被弃用,将在未来的主要版本发布中被移除。请使用snowflake_grant_privileges_to_role替代。
由于①的方法已被标记为不推荐使用,并将在将来的主要版本中删除,所以建议使用②的方法。
尽管如此,我们还是选择了①的方法。
详细信息请参阅以下文章,但因为使用方法②无法管理当前的所有权权限。
请给我提供一个本地化的中文版本,以下是对应的中文网址:
https://qiita.com/s11y/items/40d2307696016530c0d0
项目结果
项目成果
实际成果
这些步骤完成后得到的结果在这里。
-
- Pythonのクラスの生成結果
- Terraformコード生成用のSQL
请看README,了解每个步骤都做了什么。
请给出一种选项
由于这是我第一次使用Terraform,所以花费了相当多的时间和努力。
在将Snowflake迁移到Terraform时,我们需要仔细调查SQL中常用的Snowflake对象和权限是如何转化的。
通过 Terraform 化,我意识到除了了解 Terraform 外,还需要掌握关于被管理基础设施的知识。
由于没有开发用的Snowflake账户,所以如果有机会的话,我们希望能够考虑使用其他账户来重新复制环境。
其他被参考的文件
在创建SQL时,当不知道应该查看什么时,可以参考以下内容。
我尝试了一些SHOW GRANTS命令来查看Snowflake分配的权限。 #SnowflakeDB | DevelopersIO
在使用Terraform进行管理时,应该考虑哪些方面可以作为参考?
在 Terraform 中应该管理什么来管理 Snowflake?
以下是关于Snowflake每个对象的排列方式的说明。
-
- セキュリティ保護可能なオブジェクト
- Snowflakeのロール・権限に関するルールとプラクティス
由於這張圖清楚地顯示了每個資源依賴於何物,因此它對於我非常有幫助。
关于Snowflake的权限如何管理的问题。
- ロール階層と権限の継承
与MySQL不同,权限不是直接授予给用户,而是赋予给角色。
此外,角色能夠形成繼承結構,大部分權限都被上級角色承接。
对于权限管理,我对它的理解非常模糊,所以这个图对我来说是非常有参考价值的。
雪花命令行界面?
在Terraform化之后,我得知有一个叫做”雪花命令行界面”的工具已经发布了。
我在参考Snowday 2023官方博客和YouTube视频后整理了新功能的汇总。#Snowday | DevelopersIO
使用Snowflake的命令行界面(CLI),可以实现对Snowflake基础架构相关变更的自动化,以及使用代码定义Snowflake基础架构,实现自动化部署和测试。
如果现在使用代码进行Snowflake管理的话,或许可以等待然后再进行。
如果您想阅读note的技术文章,请点击这里!
note株式会社的日历 | Advent Calendar 2023 – Qiita
note工程师团队的技术文章