在Snowflake上创建资源的步骤是使用Terraform
首先
在使用Terraform构建Snowflake的过程中,参考Snowflake提供的教程是很容易理解的。
然而,尽管按照教程操作还是遇到了困难,因此我总结了自己的步骤。
环境
-
- macOS Ventura 13.1
- Homebrew 4.0.11
简而言之
在本篇文章中,我們將參考教程並做出一些自己的修改,最終使用Terraform在Snowflake上創建以下資源的步驟。
-
- データベース
-
- スキーマ
-
- ステージ
-
- ウェアハウス
-
- ユーザー
-
- ロール
- 諸々の権限付与
1. 安装 Terraform
如果还没有安装Terraform,您需要在本地进行开发,所以请确保先安装它。
安装tfenv
$ brew install tfenv
版本确认
$ tfenv --version
Terraform 可安装版本验证
$ tfenv list-remote
截至到2023年4月9日,最新版为v1.4.4,请安装此版本。
$ tfenv install 1.4.4
指定要使用已安装版本的Terraform。
$ tfenv use 1.4.4
2. 雪花准备好了
由于Snowflake可以创建一个免费的30天试用账户,所以如果您还没有账户,可以先创建一个。
如果按照画面上的指示填写项目,您可以轻松地创建一个账户。
我选择了标准版,AWS作为云服务提供商,区域选择了亚太地区(东京)。
创建账户后,您将收到一封电子邮件,请激活账户并登录。
3. 准备连接
我会执行以下操作,创建用于连接的密钥并将其复制到剪贴板上保存。
$ cd ~/.ssh
$ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out snowflake_tf_snow_key.p8 -nocrypt
$ openssl rsa -in snowflake_tf_snow_key.p8 -pubout -out snowflake_tf_snow_key.pub
$ cat snowflake_tf_snow_key.pub | pbcopy
下面是在Snowflake上执行的步骤。
所做的是创建一个用于Terraform的Snowflake用户,并将角色分配给该用户。
CREATE USER "tf-snow"
RSA_PUBLIC_KEY='${生成した公開鍵}'
DEFAULT_ROLE=PUBLIC
MUST_CHANGE_PASSWORD=FALSE;
GRANT ROLE SYSADMIN TO USER "tf-snow";
GRANT ROLE SECURITYADMIN TO USER "tf-snow";
当您粘贴公钥时,请确保删除前后的—–BEGIN PUBLIC KEY—–、—–END PUBLIC KEY—–。
我们让创建的用户能够使用两种角色,但是使用方法如下。
SYSADMIN: データベースやスキーマ、ウェアハウスなどのオブジェクト作成
SECURITYADMIN: ユーザーとロールの作成、権限付与
然后在本地执行以下操作以设置环境变量。
$ export SNOWFLAKE_USER="tf-snow"
$ export SNOWFLAKE_PRIVATE_KEY_PATH="~/.ssh/snowflake_tf_snow_key.p8"
$ export SNOWFLAKE_ACCOUNT="${アカウントLocator}"
$ export SNOWFLAKE_REGION="${リージョンID}"
在 URL 中,「アカウントLocator」是包含类似 xy12345 字符串的部分。
由于我在创建帐户时选择了 AWS 的亚太地区(东京),所以「リージョンID」将是 ap-northeast-1.aws。
这些信息也可以通过在Snowflake上执行以下操作来确认。
SELECT
current_account() as YOUR_ACCOUNT_LOCATOR,
current_region() as YOUR_SNOWFLAKE_REGION_ID;
关于区域ID,您需要根据文档参考将其转换为相应的云地区ID(如有必要,还可以加上云服务提供商的名称)。
每次启动终端都需要输入环境变量,因此准备一个名为snow.env的文件,并在其中进行记录,这样在以后的使用中就会更加轻松。
(在使用Git进行代码管理时,请不要忘记将snow.env添加到.gitignore中)
4. Terraform实施
请在项目的基本目录中创建main.tf文件,并粘贴以下内容。
terraform {
required_providers {
snowflake = {
source = "Snowflake-Labs/snowflake"
version = "0.42.1"
}
}
}
provider "snowflake" {
role = "SYSADMIN"
}
resource "snowflake_database" "db" {
name = "TF_DEMO_DB"
}
resource "snowflake_warehouse" "warehouse" {
name = "TF_DEMO_WH"
warehouse_size = "large"
auto_suspend = 60
}
在教程中,我们建议使用0.35或更高版本的最新版本,但如果使用较新的版本,标准版会出现错误。
这个错误是由于在创建仓库时,标准版中无法使用的参数会被自动添加所导致的,即使在2023/04/09时点的最新版本0.61.0中也没有解决这个问题。
因此,我认为使用0.42.1左右的版本是合理的,可以正常使用而没有问题。
5. 运行Terraform
在项目目录下执行以下操作。
将Terraform执行所需的依赖关系和保存状态的文件下载到本地。
$ terraform init
如果你在使用Git进行代码管理,应该将生成的状态文件等添加到.gitignore中,以避免意外push上去。
*.terraform*
*.tfstate
*.tfstate.*
然后执行以下操作,检查在执行Terraform后所做的更改。
$ terraform plan
如果没有资源更改的问题,我认为要进行的更改是创建数据库和仓库。如果没有问题,我们将执行以下操作。
$ terraform apply
如果显示并询问是否应用再次更改内容,请输入”是”。
在成功时,将在Snowfalke上创建数据库和数据仓库。
6. 添加资源
请最终创建其他资源。
请在main.tf中添加以下内容。
// SECURITYADMINロールで操作できるように
provider "snowflake" {
alias = "security_admin"
role = "SECURITYADMIN"
}
// ロール作成
resource "snowflake_role" "role" {
provider = snowflake.security_admin
name = "TF_DEMO_ROLE"
}
// データベースへの権限付与
resource "snowflake_database_grant" "grant" {
provider = snowflake.security_admin
database_name = snowflake_database.db.name
privilege = "USAGE"
roles = [snowflake_role.role.name]
with_grant_option = false
}
// スキーマ作成
resource "snowflake_schema" "schema" {
database = snowflake_database.db.name
name = "TF_DEMO_SCHEMA"
}
// デフォルトスキーマへの権限付与
resource "snowflake_schema_grant" "schema_default_grant" {
provider = snowflake.security_admin
database_name = snowflake_database.db.name
schema_name = snowflake_schema.schema.name
privilege = "USAGE"
roles = [snowflake_role.role.name]
with_grant_option = false
}
// スキーマへの権限付与(今後作成されるものも含む)
resource "snowflake_schema_grant" "schema_grant" {
provider = snowflake.security_admin
database_name = snowflake_database.db.name
privilege = "USAGE"
roles = [snowflake_role.role.name]
with_grant_option = false
on_future = true
}
// テーブルへの権限付与(今後作成されるものも含む)
resource "snowflake_table_grant" "table_grant" {
provider = snowflake.security_admin
database_name = snowflake_database.db.name
privilege = "SELECT"
roles = [snowflake_role.role.name]
on_future = true
}
// ビューへの権限付与(今後作成されるものも含む)
resource "snowflake_view_grant" "view_grant" {
provider = snowflake.security_admin
database_name = snowflake_database.db.name
privilege = "SELECT"
roles = [snowflake_role.role.name]
on_future = true
}
// ステージ作成
resource "snowflake_stage" "stage" {
name = "TF_DEMO_STAGE"
database = snowflake_database.db.name
schema = snowflake_schema.schema.name
}
// ステージへの権限付与
resource "snowflake_stage_grant" "stage_grant" {
provider = snowflake.security_admin
database_name = snowflake_database.db.name
schema_name = snowflake_schema.schema.name
stage_name = snowflake_stage.stage.name
privilege = "READ"
roles = [snowflake_role.role.name]
depends_on = [snowflake_stage.stage]
}
// ユーザー作成
resource "snowflake_user" "user" {
provider = snowflake.security_admin
name = "TF_DEMO_USER"
password = "password"
default_role = ""
}
他们分别正在做的事情如评论中所述。
在添加代码之后,我们会在计划中确认更改,并且如果没有问题的话,就会应用更改。
$ terraform plan
$ terraform apply
我认为其他创建的资源也按照预期进行了创建。
请参考Terraform的提供者页面,了解其他可配置的资源和参数等设置选项。
概述
我介绍了使用Terraform创建基本资源的步骤。
我已经将本次创建的代码上传在下面。
实际上,当实施运营时,还需考虑诸如文件分割、状态文件的存储方式、资源增加时的处理统一化等方面。对于这些问题,我计划在另一篇文章中详细讨论。