Terraform Cloud その1 - まずは使ってみた(ローカル実行からリモート実行に変更)

## はじめに
先日、Terraform Cloud Businessが発表されましたが、折角Free版で5Usersまで使えるので個人的に試してみました。

## この記事で実現すること
* Terraform Cloudの利用開始
* ローカルで実行していたTerraformをCloudに移行

## この記事がターゲットとする読者層
* Terraformのローカル実行の不便さに悩んでいる人
* Terraform Cloudを使用してみたい人
* ローカルで使用しているTerraformのコードをTerraform Cloudに移行したい人

## Terraform Cloudとは
OSS版のTerraformをSaasで実行できるというものです。
主なメリットは
* 変更履歴をSaas上で管理できる
* 誰が更新したか履歴が残る
* ユーザごとに実行権限が管理できる
* SaasになるのでCI/CDのフローに取り入れやすい
こんなところでしょうか。
有料版を使えば`Cost Estimation`や`Sentinel`との連携もできますし、最近ではPrivate Enterprise限定機能のSSOやログ管理などの昨日も使えるようになりましたね。
しかし、個人的には一番根本のところ、変更管理であるtfstateの管理が楽になれば良いなというところに期待します。


## 準備

* ターミナルでterraformが実行できる環境
    * 今回の一連の記事でのterraformのバージョンは0.13移行を想定しています

## Terraform Cloudの利用開始
ではまずTerraform Cloudの利用を開始しましょう。
大まかな流れは、利用ユーザを作成し、そのユーザで利用するOrganizationを作成するという流れになります。
### ユーザ作成
1. https://app.terraform.io/ にアクセスし、`free account`をクリック
![スクリーンショット 2020-08-30 10.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/19f9f575-00e8-9d96-b442-fd2b4fe2dedc.png)

2. 必要情報を入力する
![スクリーンショット 2020-08-30 10.04.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/5d2df3d8-c1dd-1e32-6193-a344d94ef992.png)

3. 以下のようなメールが届くのでURLをクリックして承認する
![スクリーンショット 2020-08-30 10.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/4d80b001-4747-4e09-8a20-48aee714cf99.png)

### Organization作成
1. メニューの`Organizations`から`Create new organization`をクリックする
![スクリーンショット 2020-08-30 10.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/b7c60e95-4642-d586-832d-ce05d04b2bcf.png)

2. 費用項目を入力する
![スクリーンショット 2020-08-30 10.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/488d89aa-b3e3-6b7b-f76c-2a69db9043cf.png)

3. 最初なので`Start with a fresh Terraform config`をクリックする
![スクリーンショット 2020-08-30 10.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/c6daf4f1-dd1d-41c1-55d7-04b060d48469.png)

4. Organizationの画面になれば完了
![スクリーンショット 2020-08-30 11.18.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/e5bd531d-0146-2775-bc8e-4d6de8057d8d.png)

## ローカルで実行していたTerraformをCloudに移行
先にCloudでWorkspaceを作成してからプロジェクトを開始できればいいのですが、初めてTerraform Cloudを使う際はローカルにあるコードをCloudで実行するよう変更する必要が出ると思います。
その際の手順を記載します。
### User Token取得
リモートでTerraform Cloudを実行するのにTokenが必要なのですが、今回は`User Token`を発行して使うことにします
1. 画面右上のアバターをクリックし、表示されたメニューの`User Settings`をクリック
![スクリーンショット 2020-08-30 11.32.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/daf64e02-b6a0-d4bf-2e6c-74484a2f4444.png)
2. `Tokens`を選択し、`Create an API token`をクリックする
![スクリーンショット 2020-08-30 11.32.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/66e587f8-28ec-dfba-969b-a3f37be94cec.png)
3. `Description`を入力し`Create API token`をクリック
![スクリーンショット 2020-08-30 11.33.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/07791624-dabc-873a-a3de-91d1fc028ed3.png)
4. 表示された`Token`を控える
![スクリーンショット 2020-08-30 11.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/6bc09a7a-833d-dd30-7d00-df927b6a8dc0.png)

### Terraformの設定変更
1. クレデンシャル情報を下記のように`~/.terraformrc`に記述

```
credentials "app.terraform.io" {
  token = "TOKEN_KEY"
}
```
2. リモートで実行するための設定を追加

```
terraform {
  backend "remote" {
    hostname = "app.terraform.io"
    organization = "ORGANIZATION_NAME"

    workspaces {
      name = "aws-test"   # ←ワークスペース名
    }
  }
}
```
3. 改めて`terraform init`を実行

```
$ terraform init
```
途中でstateファイルをコピーするか聞かれるので`yes`と回答

```
Initializing the backend...
Acquiring state lock. This may take a few moments...
Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "local" backend to the
  newly configured "remote" backend. No existing state was found in the newly
  configured "remote" backend. Do you want to copy this state to the new "remote"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value:    ←yesを入力
```
4. Cloud上にワークスペースが作成され、stateがコピーされていることを確認
![スクリーンショット 2020-08-30 11.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/1abbc484-e063-ee9a-0dd1-b970d204680b.png)
![スクリーンショット 2020-08-30 11.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/d567f629-7e3b-bccd-0dda-42bbd7cf572c.png)
5. ローカルのtfstateファイルを削除し、実行時に渡しているvariablesがあればCloud上に設定する
![スクリーンショット 2020-08-30 12.00.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/714b7b0d-7781-2e37-7402-5fea18a27312.png)
6. ローカルで`terraform plan`や`terraform apply`できることを確認

```
$ terraform apply

Running apply in the remote backend. Output will stream here. Pressing Ctrl-C
will cancel the remote apply if it's still pending. If the apply started it
will stop streaming the logs, but will not stop the apply running remotely.

Preparing the remote apply...

To view this run in a browser, visit:
https://app.terraform.io/app/kuroseets/aws-test/runs/run-Qk56jNqMQQeMxx2S
```

`Preparing the remote XXXX...`が記載されていればcloud上で実行されているということです。
ちなみにCloud上ではこんな感じ。
* Runs
![スクリーンショット 2020-08-30 12.07.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/f26fcf5b-9ef4-2adf-f837-c01220fe8ab5.png)
* States
![スクリーンショット 2020-08-30 12.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372095/7aa61bfe-a83f-acca-095e-f3cdb8ad03f2.png)

## まとめ
こんな感じでTerraform Cloud上での実行に切り替えることができました。
Saasで管理ができますのでチームで使う際に最も頭を悩ませたtfstateの扱いが簡単になることと思います。
次回はバージョン管理システムとの連携と自動デプロイを試してみたいと思います。

## 関連記事
[Terraform Cloud その1 - まずは使ってみた(ローカル実行からリモート実行に変更)](https://qiita.com/kuroseets/items/be8980a7c9764f28ed11)
[Terraform Cloud その2 - Gihubと連携してみた(VCSとWorking Directoryの設定)](https://qiita.com/kuroseets/items/9104c926b14cd52ffc03)
[Terraform Cloud その3 - Terraform CloudをTerraformで管理する](https://qiita.com/kuroseets/items/bdd160edef10f715c426)
[Terraform Cloud その4 - ワークスペース間で共有する閉じられた空間で使用するModuleについて](https://qiita.com/kuroseets/items/be51dabf7f2ecfb24055)