将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中。

    1. 按照官方文档创建Terraform用户

 

    1. (似乎不推荐授予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のロール・権限に関するルールとプラクティス
image

由於這張圖清楚地顯示了每個資源依賴於何物,因此它對於我非常有幫助。

关于Snowflake的权限如何管理的问题。

    ロール階層と権限の継承
image

与MySQL不同,权限不是直接授予给用户,而是赋予给角色。

此外,角色能夠形成繼承結構,大部分權限都被上級角色承接。

对于权限管理,我对它的理解非常模糊,所以这个图对我来说是非常有参考价值的。

雪花命令行界面?

在Terraform化之后,我得知有一个叫做”雪花命令行界面”的工具已经发布了。

我在参考Snowday 2023官方博客和YouTube视频后整理了新功能的汇总。#Snowday | DevelopersIO

使用Snowflake的命令行界面(CLI),可以实现对Snowflake基础架构相关变更的自动化,以及使用代码定义Snowflake基础架构,实现自动化部署和测试。

如果现在使用代码进行Snowflake管理的话,或许可以等待然后再进行。


如果您想阅读note的技术文章,请点击这里!
note株式会社的日历 | Advent Calendar 2023 – Qiita
note工程师团队的技术文章

广告
将在 10 秒后关闭
bannerAds