【Terraform Cloud×Snowflake】CLI Driven Workflowを使ってみた

## はじめに

Terraform Cloudでは`Version Control Workflow`(Githubなどのバージョン管理ツールと連携するワークフロー)が主要ですが、今回は`CLI Driven Workflow`を試してみようと思います。

まずは公式ドキュメントを読んで流れを掴んでおきます。

https://developer.hashicorp.com/terraform/cloud-docs/run/cli

:::note info
本記事はSnowflake環境と、SnowflakeにTerraformユーザーがある前提になります。
上記の作成は下記を参考にしてください。
:::

https://qiita.com/nya__str/items/2750ad19746f19ed317f

## 環境

- M2 Macbook
- OSSonoma 14.4
- Terraform v1.9.0
- Terraform Cloud

## ワークフローの作成
ワークフローを作成する際、下記の画面で3つのタイプのうち1つを選択します。
今回は`CLI-Driven Workflow`を選択します。
![スクリーンショット 2024-07-06 14.50.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/015cdcf9-358f-f84b-d6c9-a4b1c7ff9d13.png)
名称をつけて作成したら、`Waiting for configuration`と出てきました。
どうやらCLIから`terraform login`して、terraform applyまでしてね、と言われていそうです。
![スクリーンショット 2024-07-06 14.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/71212fac-3f98-5377-d6ff-9f52828df4c2.png)

ターミナルから、terraform loginしておきます。
```shell
$ terraform login
```
ブラウザが開いたらトークンを作成し、トークンをコピー>ターミナルでペーストします。
Welocomeと出てきたら成功です。
![スクリーンショット 2024-07-06 15.16.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/f796b679-21f4-807d-6b83-4475e8e1c87b.png)

## Variablesの設定

Snowflakeの接続情報は、Variablesとして設定しておきます。
ワークフローのVariablesに追加してもよいですし、Variable setとして追加すれば、他のワークスペース/プロジェクトと共通化したり、global変数として使うことができます。
今回はVariables setを作成してみます。

Organizationのトップにいき、左のメニューから`Settings`をクリックします。
<img width="300" alt="settings" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/412a154f-5622-980b-765d-2cfa193e9e67.png">


`Variable sets`>`Create variable sets`から、項目を入力していきます。
スコープは今回は`Apply globally`にしましたが、プロジェクトやワークスペースを選択することも可能です。
![スクリーンショット 2024-07-06 15.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/61e4eaaf-5a0f-b801-1bc5-8b3060c0ad6b.png)

Variablesを追加して,Createします。

## tfファイルの作成

テスト用のディレクトリを作って、tfファイルを作っていきます。
今回はTableau利用で使うためのウェアハウスを作ってみましょう。

ドキュメントを見ると、terraform設定ファイルに下記のようなcloudブロックを追加してくださいとありますので、organizationなどを書き換えて追加します。
```terraform
terraform {
  cloud {
    organization = "my-org"
    workspaces {
      tags = ["networking"]
    }
  }
}
```

ワークスペースのページからtagをつけておきましょう。
<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/2132149b-7682-ca46-a01e-3649bdb16e06.png">


```terraform.tf
terraform {
  required_providers {
    snowflake = {
      source  = "Snowflake-Labs/snowflake"
      version = "~> 0.61"
    }
  }
  cloud {
    organization = "snowflake-test-org"
    workspaces {
      tags = ["test_cli"]
    }
  }
}

provider "snowflake" {
  alias     = "sysadmin"
  role      = "SYSADMIN"
  user  = var.snowflake_user
  password  = var.snowflake_password
  account   = var.snowflake_account
  warehouse = var.snowflake_warehouse
}
```
```variables.tf
variable "snowflake_user" {
  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
# xsmallでクラスター1-3のWH作成
resource "snowflake_warehouse" "tableau_wh" {
  provider            = snowflake.sysadmin
  name                = "TABLEAU_WH"
  comment             = "Tableau Warehouse"
  warehouse_size      = "XSMALL"
  auto_suspend        = 60 # 60sec
  auto_resume         = true
  initially_suspended = true
  max_cluster_count   = 3
  min_cluster_count   = 1
  scaling_policy      = "STANDARD"
}

```

## terraform initからapplyまで
tfファイルができたら、terraform init→terraform planします。
```shell
$ terraform init
$ terraform plan
```
エラーなくできたら、下記のように実行計画が表示されます。
```shell
Terraform used the selected providers to generate the following execution plan. Resource actions
are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # snowflake_warehouse.tableau_wh will be created
  + resource "snowflake_warehouse" "tableau_wh" {
      + auto_resume                         = true
      + auto_suspend                        = 60
      + comment                             = "Tableau Warehouse"
      + enable_query_acceleration           = false
      + id                                  = (known after apply)
      + initially_suspended                 = true
      + max_cluster_count                   = 3
      + max_concurrency_level               = 8
      + min_cluster_count                   = 1
      + name                                = "TABLEAU_WH"
      + resource_monitor                    = (known after apply)
      + scaling_policy                      = "STANDARD"
      + statement_queued_timeout_in_seconds = 0
      + statement_timeout_in_seconds        = 172800
      + warehouse_size                      = "XSMALL"
      + warehouse_type                      = "STANDARD"
    }

Plan: 1 to add, 0 to change, 0 to destroy.
```

Warningが出たりするので、適宜修正します。

問題ないことが確認できたら、いざapplyしましょう!
ワークスペースで実行するか聞かれるので、yesとすると実行完了します。
![スクリーンショット 2024-07-06 16.06.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/07ae0b07-3610-7f67-2755-8ee30550f053.png)


画面上で確認してみると、無事cliからapplyされていることがわかります。
![スクリーンショット 2024-07-06 16.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/73b13e09-22e8-1bf9-131b-bdc67ef00769.png)
snowflakeでも確認してみましょう。
```
show warehouses like 'tableau_wh';
```
無事、作成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/f94594d9-a23d-3a43-a421-a678bfee31d6.png)

## Stateファイルの確認

Stateファイルもちゃんとできていました。
![スクリーンショット 2024-07-06 16.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506559/f6f93f61-d3d9-c91e-dc45-20edbb71f09a.png)

複数人で開発するならVersion Control Workflowを使ったほうが良いと思いますが、CLI Driven WorkflowではCLIからapplyまでをシンプルに実行することができました。

## 参考

https://zoo200.net/terraform-backend-terraformcloud/