背景
社内で使っているSnowflakeのリソースをTerraformで管理したいと思い、
Terraformは初心者のため、まずはテスト環境で試してみることにしました.
Terraform Cloudとは
Terraform Cloudは、Terraformを使ったインフラストラクチャの管理をより効率的に行うためのクラウドベースのサービスです。
主な機能としては、下記があります。
- Terraformの状態ファイル(state file)をリモートで保存し、共有管理できる
- GitHubやGitLabなどのリポジトリと連携し、コードの変更をバージョン管理できる。プルリクエストがマージされると、自動的にデプロイされるように設定できる。
- コードの変更があった際に、Terraformのプランを自動的に実行し、その結果をレビューしてからアプライすることができる。これにより、変更が実際にどのような影響を与えるかを事前に確認できる
イメージとしては、Terraform + Github Action + ステート管理(S3など)の形でやっていたものを、Terraform Cloudを使うことでよりシンプルな形にできるのかなと思いました。
環境
- M2 Macbook
- OSSonoma 14.4
- Terraform v1.9.0
- Terraform Cloud
事前準備
- Githubリポジトリを作成しておく
- ローカルにterraformをインストールしておく
$ brew tap hashicorp/tap
$ brew install hashicorp/tap/terraform
$ asdf plugin add terraform
$ asdf install terraform latest
$ asdf list
$ asdf global terraform 1.9.0
$ asdf current
Snowflake環境作成
Snowflakeのトライアル環境を作成します。
トライアルを申し込むと、400ドルのクレジットが含まれる環境が30日間使えるようになります。
名前、メールアドレス、会社名、ロール、国を選択したら、次へ進むをクリックします.

Editionはデフォルトのエンタープライズにして、AWSのAsia Pacificを選択します。
「はじめる」をクリックすると、アンケートが表示されます。答えてもスキップしてもOKです。
完了すると、数分後にメールが届くので、リンクをクリックして有効化しておきます。
Terraform用ユーザーの作成
Snowflakeにログインしたら、Terraform用のユーザーを作成しておきます。
-- Terraform用に使用するユーザーとロールとウェアハウスの準備
USE ROLE SECURITYADMIN;
-- 新規ユーザーの作成
CREATE USER TOOL_TERRAFORM PASSWORD='StrongPassword' MUST_CHANGE_PASSWORD=TRUE;
-- ロールの作成
CREATE ROLE TERRAFORM;
GRANT ROLE TERRAFORM TO USER TOOL_TERRAFORM;
GRANT ROLE SECURITYADMIN TO ROLE TERRAFORM;
GRANT ROLE SYSADMIN TO ROLE TERRAFORM;
-- WHの作成
USE ROLE SYSADMIN;
CREATE WAREHOUSE TERRAFORM_WH
WITH WAREHOUSE_SIZE = 'XSMALL'
AUTO_RESUME = TRUE
AUTO_SUSPEND = 60
INITIALLY_SUSPENDED = TRUE
STATEMENT_TIMEOUT_IN_SECONDS = 300
COMMENT = 'for terraform';
-- WHの権限付与
grant USAGE on warehouse terraform_wh to role terraform;
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;
完了したら、一度サインアウトして、上記で作成したアカウントでログインします。
パスワードの変更が求められるので、変更完了したらOKです。
Terraform CloudのアカウントとOrganization作成
下記のリンクから、TerraformCloudのアカウントを作成し、Organizationを作成します。
Terraform Cloudのアカウント作成等は下記を参考にしました。
Organizationの作成が完了すると下記の画面になります。
Workspaceを作成していきます。
Githubと連携するため、「Version Control Workflow」を選択します。
Githubと接続し、Advanced optionsを設定していきます。
下記を参考にしました。
Githubリポジトリをgit cloneし、ターミナルからterraformにログインします。
$ terraform login
表示される内容にしたがい、トークンを作成>ターミナルにコピペで認証完了されます。
環境変数の設定
認証情報を安全に管理・保持しておくためにVariablesを設定します。
Add variable
から下記の認証情報を1つずつ追加します。
パスワードはSensitiveフラグをオンにしてください。
(登録時はダブルクオーテーションは不要)
snowflake_account="AB12345.ap-northeast-1.aws"
snowflake_username="TOOL_TERRAFORM"
snowflake_password="StrongPassword" # change this
snowflake_warehouse="TERRAFORM_WH"
ウェアハウスを作ってみる
下記のファイルを作成します。
- terraform.tf
- vafriables.tf
- warehouse.tf
terraform {
required_providers {
snowflake = {
source = "Snowflake-Labs/snowflake"
version = "~> 0.61"
}
}
}
provider "snowflake" {
alias = "sysadmin"
role = "SYSADMIN"
user = var.snowflake_username
password = var.snowflake_password
account = var.snowflake_account
warehouse = var.snowflake_warehouse
}
variable "snowflake_username" {
description = "The username for Snowflake"
type = string
}
variable "snowflake_password" {
description = "The password for Snowflake"
type = string
sensitive = true
}
variable "snowflake_account" {
description = "The account name for Snowflake"
type = string
}
variable "snowflake_warehouse" {
description = "The warehouse for Snowflake"
type = string
}
resource "snowflake_warehouse" "op_wh" {
provider = snowflake.sysadmin
name = "OP_WH"
comment = "Operational Warehouse"
warehouse_size = "XSMALL"
auto_suspend = 60 # 60sec
auto_resume = true
initially_suspended = true
max_cluster_count = 1
min_cluster_count = 1
scaling_policy = "STANDARD"
}
terraform init して、プロバイダをインストールしたりモジュールのダウンロードなどをします。
$ terraform init
pushしてプルリクを作成します。
planが成功しました🎉
mainにマージし、terraform Cloudで[Confirm&apply]します。
作成完了しました。
snowflakeで下記のSQLを実行し、作成されていることを確認します。
show warehouses like 'op_wh';
感想
Github ActionやState管理を別で行う必要がないので、かなり楽にリソース管理できそうですね。
今回TerraformとTerraform Cloudを1から学んだので、思ったよりかなり時間がかかってしまいましたが、一度流れがつかめればスムーズに管理できるのではないかと思います。
しばらくいろいろリソースを作ってみて慣れようと思います。
参考