TerraformでTROCCOのユーザーを作ったり消したりしてみる

## はじめに
TROCCOでは、コード管理の実現による、より安全かつガバナンスを担保した環境の管理を実現できるようにAPI機能の拡張を行っています。
Terraform Provider for TROCCOの提供も始まっています。

本記事では、コード管理の超初級編としてTerraformをインストールしTerraformでTROCCOのユーザーを作ったり消したりしてみます。

**コード管理ってどんな感じ？？** **Terraformってどうやって使うの？？** といったイメージをつける参考などに見ていただけると幸いです！

## 今回のゴール
Terraformを利用してTROCCOのユーザーを作成したり削除したりする

## 環境
Windows 64bitを使用しています。
Terraformはローカルで実行しています。

## 参考
弊社のDさんが公開している下記記事を参考に進めていきます！

TerraformでのTROCCOのリソース管理についてのみ知りたい方向け

https://qiita.com/SoySoySoyB/items/c07ecf7bf199d5730bf2

Terraformとは？？というところから詳しく知りたい方向け
Terraformのコマンドなどについても紹介しています
下記記事ではTROCCOのリソース作成とGoogle Cloudのリソースの作成を行っています。

https://qiita.com/SoySoySoyB/items/16ceae5dad35fedad132

## Terraformのインストールと設定
早速やっていきます！
下記記事を参考にインストールとPathの設定、確認を行いました。

https://qiita.com/enumura1/items/992ddc20a607c5eb8a6d

## Terraformの初期設定をする
**main.tf** というファイルを作成します。
中身には下記を記入して保存します。

```
terraform {
  required_providers {
    trocco = {
      source = "registry.terraform.io/trocco-io/trocco"
    }
  }
}

provider "trocco" {
  region  = "japan"
}
```

## TROCCO API KEYを発行する
TROCCOにログインして下記メニューを開きます

![スクリーンショット 2025-01-14 184338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/7f51eeb3-6400-3c28-12dc-9ae6ce82175d.png)

**新規作成**をクリックします
![スクリーンショット 2025-01-14 184559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/d4a1c374-6185-5909-d723-eb29e029724a.png)

**名前**を設定して**保存**します
![スクリーンショット 2025-01-14 184615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/e6bcce01-a748-e235-5190-667bf4d5ef56.png)

赤枠内のAPI KEYをコピーしておきます。

![スクリーンショット 2025-01-14 184818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/8e0537a5-ab33-ede0-c6d1-1d0bb776a87c.png)

::: note alert
画面を閉じる、ほかページへの遷移などを行うとAPI KEYは確認できなくなります。
ご注意ください！！
:::

## 発行したAPI KEY を環境変数にセットする
コマンドプロンプトを起動します。
```set TROCCO_API_KEY={TROCCO_API_KEY}``` を実行します。
実行して、特に何も表示されなければ大丈夫です。

![スクリーンショット 2025-01-14 190405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/dc7c5c33-102b-2899-b013-d7d3f06b0272.png)

## Terraformの初期化
Terraformを初期化します。
```cd``` コマンドでTerraformをインストールしたフォルダへ移動し、```terraform init```を実行します。成功すると ```Terraform has been successfully initialized!``` が出力されます

## TROCCOのユーザー情報を設定する
下記の使用例で試していきます！

https://registry.terraform.io/providers/trocco-io/trocco/latest/docs/resources/user

```
resource "trocco_user" "example" {
  email                           = "trocco@example.com"
  password                        = "Jb1p4f1uuC"
  role                            = "member"
  can_use_audit_log               = false
  is_restricted_connection_modify = false
}
```

上記を作成した**main.tf**ファイルの下部に追記します。
```resource "trocco_user" "example" {```の **"example"** はこのリソースを表す任意の名前となるようなので**users**に書き換えました。

```
terraform {
  required_providers {
    trocco = {
      source = "registry.terraform.io/trocco-io/trocco"
    }
  }
}

provider "trocco" {
  region  = "japan"
}

resource "trocco_user" "users" {
  email                           = "trocco@example.com"
  password                        = "Jb1p4f1uuC"
  role                            = "member"
  can_use_audit_log               = false
  is_restricted_connection_modify = false
}
```

:::note info
resourceブロックの構成についての参考記事は下記です
https://zenn.dev/shimiyu/articles/7db8ddc9443c82
:::

:::note warn
ファイルを変更したら保存するのを忘れないようにご注意ください！
後述のコマンドを実行したときにエラーが発生します
:::

## terraform plan コマンドでリソースへの影響を表示する
```terraform plan```を実行して、現状の実体との差分を確認します。

```
>terraform plan

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:

  # trocco_user.users will be created
  + resource "trocco_user" "users" {
      + can_use_audit_log               = false
      + email                           = "trocco@example.com"
      + id                              = (known after apply)
      + is_restricted_connection_modify = false
      + password                        = (sensitive value)
      + role                            = "member"
    }

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

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if
you run "terraform apply" now.
```

実行した場合、新規作成（create）で1つ追加される（1 to add）ということがわかります。

## terraform apply コマンドでユーザを追加する
```terraform apply```を実行して、上記で確認した実態との差分を反映させます。
途中で```Do you want to perform these actions?```と聞かれるので```yes```で実行します。

```
>terraform apply

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:

  # trocco_user.users will be created
  + resource "trocco_user" "users" {
      + can_use_audit_log               = false
      + email                           = "trocco@example.com"
      + id                              = (known after apply)
      + is_restricted_connection_modify = false
      + password                        = (sensitive value)
      + role                            = "member"
    }

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

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

trocco_user.users: Creating...
trocco_user.users: Creation complete after 1s

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
```

1つの追加が完了した（Apply complete! Resources: 1 added）事がわかります。
TROCCOのユーザー画面でも、**trocco@example.com**が追加されていることを確認できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929084/72f957e0-335f-559f-7117-59394bd29711.png)

## TROCCOに作ったユーザーを削除する
main.tfに追記したresourceを削除して保存します。
```terraform plan```を実行すると、下記が表示されました。

```
>terraform plan
trocco_user.users: Refreshing state...

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  - destroy

Terraform will perform the following actions:

  # trocco_user.users will be destroyed
  # (because trocco_user.users is not in configuration)
  - resource "trocco_user" "users" {
      - can_use_audit_log               = false -> null
      - email                           = "trocco@example.com" -> null
      - id                              = 10276 -> null
      - is_restricted_connection_modify = false -> null
      - password                        = (sensitive value) -> null
      - role                            = "member" -> null
    }

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

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if
you run "terraform apply" now.
```
実行した場合、削除（destroy）で1つ削除される（1 to destroy）ということがわかります。
```terraform apply```を実行します。

```
>terraform apply
trocco_user.users: Refreshing state...

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  - destroy

Terraform will perform the following actions:

  # trocco_user.users will be destroyed
  # (because trocco_user.users is not in configuration)
  - resource "trocco_user" "users" {
      - can_use_audit_log               = false -> null
      - email                           = "trocco@example.com" -> null
      - id                              = 10276 -> null
      - is_restricted_connection_modify = false -> null
      - password                        = (sensitive value) -> null
      - role                            = "member" -> null
    }

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

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

trocco_user.users: Destroying...
trocco_user.users: Destruction complete after 0s

Apply complete! Resources: 0 added, 0 changed, 1 destroyed.
```

リソースが一つ削除された（Apply complete! Resources: 0 added, 0 changed, 1 destroyed.）事がわかります。
TROCCOのユーザー管理画面を確認しても、```trocco@example.com```は削除されていることが確認できました。

## おわりに
TerraformとTROCCOのユーザーAPIではこんな感じでコードでのユーザ管理ができるよ、というご紹介でした。
ネット上の記事を見てると、Terraformはすごく難しそうに感じますが、実行してみると **意外とどうにかなるかも・・・？** と思えるぐらいには苦手意識が消えました！
今回のような基本的な操作であれば誰でもできそうです。

次はチーム機能などと絡めて、実際の運用でのユーザ管理について考えていく予定です！
ユーザーのアドレスやパスワードなどをある程度自動で設定することも可能なようです。
色々試して便利に使える部分を共有できたらと思います。