❄️

WindowsでTerraformによるSnowflake環境を作成する

に公開

初めに

windows11上にてTerraformでsnowflakeを操作するための最低限の初期設定を行う方法です。

使用するツール
scoop
tenv
Terraform v1.11.2
Terraform provider v1.0.5

scoopでTerraformのバージョンマネージャであるtenvをインストールし、tenvでTerraformをインストールします。

作業内容

鍵の設定

鍵の生成
SnowflakeはMFA必須となっており、Terraformを使用すると一回の実行でMFAで入力を何度も求められ面倒です。
このため鍵を生成して、登録することでこれを回避します。

ssh-keygen -t rsa -b 4096 -m PEM

出力されたファイルを"C:\Users\your_name\.ssh"へ保存をします。
your_nameは適宜あなたのユーザ名に読み替えてください。

このままの形式だと公開鍵をTerraformに登録できないので形式を変換します。ssh-kengenではなくopensshを使っている場合は不要です。

鍵の形式を変換

ssh-keygen -e -f C:\Users\your_name\.ssh\key.pub -m pkcs8

Terraformインストール

scoopインストール
環境変数の登録などが面倒なのでwidnowsのパッケージ管理ツールであるscoopを使ってインストールします。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression

tenvインストール

次にTerraformのバージョンマネージャであるtenvをインストールします。
tenvはTerraform以外にもTerraformのfolkであるOpenTohuやTerraformのラッパーであるterragruntやatmosもインストールできるようです。

scoop install tenv

Terraforomインストール
Terraformのインストールなので引数にtfを指定しています。

tenv tf install latest

確認
バージョンが表示されているなら正常にインストールできているはずです。

terraform -v

snowflake初期設定

  • ORGANIZATION_NAMEの確認
  • Terraformユーザの作成
  • Terraformユーザのロールの作成
  • Terraformユーザの使うwarehouseの作成
  • Terraformユーザのロールへの権限割り当て
    を行っています
-- ORGANIZATION_NAMEの確認
-- Terraformの設定で使用するのでメモしておく
SELECT CURRENT_ORGANIZATION_NAME();
-- Terraformユーザの作成
create or replace user terraform_user
    password = 'ExamplePassword'  -- please change this
    RSA_PUBLIC_KEY='MIIBI...' -- 生成した公開鍵
;

-- Terraformユーザのロールの作成
create role terraform_role;

-- Terraformユーザのロールへの権限割り当て
grant role terraform_role to user terraform_user;

grant role securityadmin to role terraform_role;
grant role sysadmin to role terraform_role;

-- Terraformユーザの使うwarehouseの作成
create or replace warehouse terraform_wh 
    warehouse_size=XSMALL
    auto_resume=TRUE
    auto_suspend=60
    initially_suspended=TRUE
    statement_timeout_in_seconds=300
    comment='For terraform.'
;

-- Terraformユーザのロールへの権限割り当て
grant USAGE on warehouse terraform_wh to role terraform_role;
grant USAGE on warehouse terraform_wh to role securityadmin;
grant USAGE on warehouse terraform_wh to role sysadmin;
grant USAGE on warehouse terraform_wh to role useradmin;

-- 権限を確認
show grants to role terraform_role;

Terraform作業

your_organization、your_account_nameは適宜あなたの組織、アカウント名に読み替えてください。

terraform {
  required_version = "1.11.2"
  required_providers {
    snowflake = {
        source = "Snowflake-Labs/snowflake"
        version = "1.0.5"
    }
  }
}

provider "snowflake" {
  organization_name = "your_organization" # required if not using profile. Can also be set via SNOWFLAKE_ORGANIZATION_NAME env var
  account_name      = "your_account_name" # required if not using profile. Can also be set via SNOWFLAKE_ACCOUNT_NAME env var
  user              = "TERRAFORM_USER" # required if not using profile or token. Can also be set via SNOWFLAKE_USER env var

  // optional
  role      = "TERRAFORM_ROLE"
  authenticator          = "SNOWFLAKE_JWT"
  private_key            = file("C:\Users\your_name\.ssh\")
  # private_key_passphrase = var.private_key_passphrase
  # host      = "..."
  # warehouse = "..."
  # params = {
  #   query_tag = "..."
  # }
   preview_features_enabled = ["snowflake_table_resource"]
}

-- DBの作成
resource "snowflake_database" "terraform_practice_db" {
  name     = "TERRFORM_DB"
  comment = "terraform練習用DB"
}

-- スキーマの作成
resource "snowflake_schema" "schema1" {
  database = snowflake_database.terraform_practice_db.name
  name = "schema1"
  is_transient = false
}

-- テーブルの作成
resource "snowflake_table" "table1" {
  name = "table1"
  database = snowflake_database.terraform_practice_db.name
  schema = snowflake_schema.schema1.name
  column {
    name = "column1"
    type = "VARCHAR(100)"
    comment = "特になし"
  }
}

Terraform実行

現在の環境とのコード差分を出力します
上記のリソース(DB、スキーマ、テーブルが出力されていたらOK)

terraform plan

リソース作成
のちに入力が求められるのでyesと打ってエンターを押せば作成されます。

terraform apply

入力でyesと確認をしない場合

terraform apply -auto-approve

以上でリソースの作成ができたはずです。

リソース削除

念のため作成したリソースは削除しておきましょう。

terraform destory

参考

公式ドキュメント
https://registry.terraform.io/providers/Snowflake-Labs/snowflake/latest/docs

キーの形式を変換する方法
https://community.snowflake.com/s/article/How-To-Generate-Key-Pair-using-ssh-keygen-command-on-Windows

リソース作成など
https://zenn.dev/mnagaa/books/3d668d2dfc657e

tenvについて
https://dev.classmethod.jp/articles/try-tenv-terraform-version-manager/

Discussion