SnowflakeのリソースをTerraformで作成・管理したい!
はじめに
業務の中でSnowflakeを利用しているんですが、割とエンティティが多くなってきていること、また定常的に発生する作業(user作成・ロール付与など)について、毎度毎度、手順書作成→レビュー→手順書の通りに実施
みたいなことをやっているので、もう少し自動化したいなぁという思いの元この記事を書くに至りました。
具体的にはSnowflakeのリソースをIaCで管理して、CICDパイプラインを組み、承認を得たタイミングでフローが走って自動的にリソースに対する変更がができればいいなぁという思いです。
Zennなどを見ていると既にTerraformによるSnowflakeの管理や×Github Actionsなどを利用したわかりやすい記事が既にあるので、書こうか迷ったのですがAWSのCodePipelineを利用している記事はなさそうだったのでやってみようと思います。
本記事は大きく2部構成で書いていきます。
この記事はまずSnowflake社が出しているTerraforming Snowflakeを参考にしながら実際にTerraformでSnowflakeに対してリソースを作成するところを書いていきます。
そして後続記事の方で1部で作成したものをCICDパイプラインに乗せてイイ感じにしていきます。
そもそもTerraformとは
Terraformは簡単に言ってしまえばHashicorp社が出しているコードでリソースを管理するIaCツールのひとつです。
一番の魅力は、利用可能なクラウドサービスが限定されていないことだと思います。つまり、AWSでもAzureでもGCPでも、それこそ今回対象としているSnowflakeにおいても利用可能です。
Terraformを学ぶ際、こちらの記事をかなり参考にさせていただきました。
環境準備
トライアル用のSnowflakeを準備
何はともあれSnowflakeのトライアルアカウントを作成しましょう。
※今回筆者はEnterpriseエディションでAWS環境に作成しています
RSA鍵の作成
リソース構築にあたって、TerraformからSnowflakeに接続をしに行く際ユーザに設定したキーペアにて認証を行うため、RSA鍵を作成します。
※筆者はWindows環境のため、Opensslを別途インストールしています。
cd C:/Users/{username}/.ssh
openssl genrsa -out snowflake_key 4096
openssl rsa -in snowflake_key -pubout -out snowflake_key.pub
openssl pkcs8 -topk8 -inform pem -in snowflake_key -outform PEM -out snowflake_key.p8 -noencrypt
4行目の秘密鍵を生成するコマンドが公式が出しているチュートリアルとは少し異なるのですが、チュートリアルのまま進めていってterraform planコマンドを実行した際に以下のエラーが表示されたため少し変更しています。
キーペア認証のためのユーザ作成
RSA鍵の作成が完了したら、キーペア認証用のユーザを作成し、ユーザに対してRSA鍵(公開鍵)の割り当て、SYSADMIN・SECURITYADMINのロールを付与しておきます。
CREATE USER IF NOT EXISTS "TF-USER" RSA_PUBLIC_KEY='RSA鍵のパスフレーズ' DEFAULT_ROLE=PUBLIC MUST_CHANGE_PASSWORD=FALSE;
GRANT ROLE SYSADMIN TO USER "TF-USER";
GRANT ROLE SECURTYADMIN TO USER "TF-USER";
環境変数への情報設定
次にTerraformが作成したユーザで認証をしにいくために必要な情報を環境変数に設定していきます。
※今回は環境変数に登録する形にしていますが、snow.envや.bashrc, .zshrcなどのファイルに入れ込んでおくと後々便利かもしれません
必要な情報は以下の通りです。
- 先程作成した認証用ユーザのユーザ名
- 認証方法
- RSA鍵(秘密鍵)のパス
- アカウントロケーター(ログインURLの"https://"以降の文字列です)
- Snowflakeのリージョン
4つ目、5つ目の情報に関しては、SQLを利用して取得もできますし、
SELECT current_account() as YOUR_ACCOUNT_LOCATOR, current_region() as YOUR_SNOWFLAKE_REGION_ID;
Snowsightの左下のアカウント情報から赤枠のコピーボタンを押しても取得可能です。
Snowsightから取得する際には、{組織名}.{アカウント識別子}となっていますが、必要になるのは{アカウント識別子}のみでOKです。
またSnowflakeのリージョンについては、{クラウドプロバイダ}_{リージョン}となっているので、{リージョン}.{クラウドプロバイダ}の形に変換したうえで設定する必要があります。
set SNOWFLAKE_USER=<TF-USER>
set SNOWFLAKE_AUTHENTICATOR=JWT
set SNOWFLAKE_PRIVATE_KEY=<RSA鍵のパス>
set SNOWFLAKE_ACCOUNT=<ACCOUNT_LOCATOR>
set SNOWFLAKE_REGION=<ACCOUNT_REGION>
リソース定義~構築
リソース定義
環境の準備は完了したので、実際にTerraformでリソースを記載していきます。
作業用ディレクトリにSnowflake側に構築するリソースを以下の通り定義したmain.tfファイルを用意します。
今回はProvider情報とリソースを同一ファイルに定義していますが、ベストプラクティスとしては以下のようにした方がいいかなと思います。
- リソース定義->main.tf
- プロバイダ情報->provider.tf
# これから実行されるTerraformについてはSnowflakeと依存関係がある旨の記載
terraform {
required_providers {
snowflake = {
source = "Snowflake-Labs/snowflake"
version = "~> 0.87"
}
}
}
# provider情報(ターゲットアカウント情報など)を記載(環境変数にアカウント情報を記載しない場合は、こちらに記載していく)
provider "snowflake" {
role = "SYSADMIN"
}
# TF_DEMOという名前のDBを作成
resource "snowflake_database" "db" {
name = "TF_DEMO"
}
# TF_DEMOという名前でXSサイズのWarehouseを作成
resource "snowflake_warehouse" "warehouse" {
name = "TF_DEMO"
warehouse_size = "xsmall"
auto_suspend = 60
}
構築リソースの確認
リソース構築用のファイルができたら、以下のコマンドを実行して作業ディレクトリの初期化と必要なプラグイン・モジュールをインストールします。
terraform init
初期化作業が完了すると、以下のメッセージがコマンドライン上に表示されるとともにmain.tfファイルの他に画像のようなファイル・フォルダが作成されます。
Terraform has been successfully initialized!
次に以下のコマンドを実行し、main.tfによって実際に作成(/変更/削除)されるリソースが何かを確認します。
terraform plan
定義したリソースのみがしっかりと作成されることが確認できました。
リソース構築
定義したリソースのみがしっかりと作成されることが確認できましたので、以下のコマンドでターゲットアカウントにリソースを構築しましょう!
terraform apply
コマンドライン上に以下が表示されればOKです。
実際にSnowsight上でもリソースを確認できました。
今回の記事はここまでです。
作成したリソースは必要に応じて削除しておきましょう。
次回はCICDパイプラインに乗せていきます。
それでは。
Discussion