1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

背景

社内で使っている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

今回は下記の構成で試していきます。
スクリーンショット 2024-07-05 19.46.51.png

事前準備

  • Githubリポジトリを作成しておく
  • ローカルにterraformをインストールしておく
homebrewでいれる場合
$ brew tap hashicorp/tap 
$ brew install hashicorp/tap/terraform    
asdfでいれる場合
$ asdf plugin add terraform
$ asdf install terraform latest 
$ asdf list  
$ asdf global terraform 1.9.0  
$ asdf current 

Snowflake環境作成

Snowflakeのトライアル環境を作成します。
トライアルを申し込むと、400ドルのクレジットが含まれる環境が30日間使えるようになります。

名前、メールアドレス、会社名、ロール、国を選択したら、次へ進むをクリックします.

スクリーンショット 2024-07-04 13.25.25.png

Editionはデフォルトのエンタープライズにして、AWSのAsia Pacificを選択します。
「はじめる」をクリックすると、アンケートが表示されます。答えてもスキップしてもOKです。
スクリーンショット 2024-07-04 13.27.33.png

完了すると、数分後にメールが届くので、リンクをクリックして有効化しておきます。

Terraform用ユーザーの作成

Snowflakeにログインしたら、Terraform用のユーザーを作成しておきます。

sql worksheet
-- 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を作成していきます。
スクリーンショット 2024-07-04 13.23.12.png

Githubと連携するため、「Version Control Workflow」を選択します。
Githubと接続し、Advanced optionsを設定していきます。
下記を参考にしました。

Githubリポジトリをgit cloneし、ターミナルからterraformにログインします。

$ terraform login

表示される内容にしたがい、トークンを作成>ターミナルにコピペで認証完了されます。

環境変数の設定

認証情報を安全に管理・保持しておくためにVariablesを設定します。

Configure Variablesを押下し、
スクリーンショット 2024-07-05 11.08.06.png

Add variableから下記の認証情報を1つずつ追加します。
パスワードはSensitiveフラグをオンにしてください。
(登録時はダブルクオーテーションは不要)

snowflake_account="AB12345.ap-northeast-1.aws"
snowflake_username="TOOL_TERRAFORM"
snowflake_password="StrongPassword" # change this
snowflake_warehouse="TERRAFORM_WH"

account locatorは、Snowflake画面の左下のユーザー名>アカウント>リンクをコピーして取得できます。

スクリーンショット 2024-07-04 18.41.51.png
▼正しくはアカウント名ではなく、アカウントロケーターです
スクリーンショット 2024-07-04 18.49.32.png
※Regionはdeplicateになったようです。現在はAccountパラメータにリージョンも含めるでOK.

ウェアハウスを作ってみる

下記のファイルを作成します。

  • terraform.tf
  • vafriables.tf
  • warehouse.tf
terraform.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
}
variables.tf
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
}

warehouse.tf
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が成功しました🎉
スクリーンショット 2024-07-05 16.13.24.png
mainにマージし、terraform Cloudで[Confirm&apply]します。

スクリーンショット 2024-07-05 18.51.58.png

作成完了しました。

スクリーンショット 2024-07-05 18.54.11.png

snowflakeで下記のSQLを実行し、作成されていることを確認します。

show warehouses like 'op_wh';

スクリーンショット 2024-07-05 18.55.52.png
無事作成されていました。

感想

Github ActionやState管理を別で行う必要がないので、かなり楽にリソース管理できそうですね。
今回TerraformとTerraform Cloudを1から学んだので、思ったよりかなり時間がかかってしまいましたが、一度流れがつかめればスムーズに管理できるのではないかと思います。
しばらくいろいろリソースを作ってみて慣れようと思います。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?