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
参考
公式ドキュメント
キーの形式を変換する方法
リソース作成など
tenvについて
Discussion