在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作为云服务提供商,区域选择了亚太地区(东京)。

undefined

创建账户后,您将收到一封电子邮件,请激活账户并登录。

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.42.1。

在教程中,我们建议使用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上创建数据库和数据仓库。

スクリーンショット 2023-04-09 3.00.45.png

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
スクリーンショット 2023-04-09 15.15.25.png
スクリーンショット 2023-04-09 15.17.20.png

我认为其他创建的资源也按照预期进行了创建。

请参考Terraform的提供者页面,了解其他可配置的资源和参数等设置选项。

 

概述

我介绍了使用Terraform创建基本资源的步骤。
我已经将本次创建的代码上传在下面。

 

实际上,当实施运营时,还需考虑诸如文件分割、状态文件的存储方式、资源增加时的处理统一化等方面。对于这些问题,我计划在另一篇文章中详细讨论。

广告
将在 10 秒后关闭
bannerAds