Terraform Cloudのベータで "Remote Operation" が使えるようになったので試してみました

## はじめに

Terraform Cloudにベータではありますが、 **Remote Operation** という機能が追加になったようなので今朝方申し込んでみたところ、もう使えるようになった旨の連絡がHashiCorpから来たので使ってみました。

何が出来るかというと、

* Terraformのコンフィグ( ``.tfとか`` )を管理しているVCS(GitHub)に変更をPUSHすると
* 勝手にplanが走り、Terraform Cloud上で結果が見れる
* で、applyもその場から出来る

というような感じ。

結論、結構便利です。

ただ課題もありますが、ドキュメント読めばなにか対応方法が書いてあるのかもしれない。

ドキュメント的にはこれに従ってやっていきます。

https://www.terraform.io/docs/cloud/vcs/github.html

## [Step 1: On GitHub, Create a New OAuth Application](https://www.terraform.io/docs/cloud/vcs/github.html#step-1-on-github-create-a-new-oauth-application)

まずGitHubの [Register a new OAuth application](https://github.com/settings/applications/new) に接続します。

直接上記リンクに行けばいいのですが、一応どういうページかというと、以下の流れでたどり着けます。

**右上の自分のアイコンから Settings を選ぶ**

<img width="202" alt="スクリーンショット 2019-08-08 9.09.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/1dfa9be7-1a6f-66ec-dc21-15bfaa3f8602.png">

**サイドメニューから Developer settingsを選ぶ**

<img width="243" alt="スクリーンショット 2019-08-08 9.11.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/b200cf67-499b-432b-48fe-f94799064ed5.png">

**サイドメニューから OAuth Apps を選ぶ**

<img width="255" alt="スクリーンショット 2019-08-08 9.12.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/e7ae02c1-3f3d-0b77-2726-ba12f12f0429.png">

**Register a new application を選ぶ**

<img width="771" alt="スクリーンショット 2019-08-08 9.12.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/d630e447-1b65-0dd7-1feb-5b8d53e01f31.png">

そうすると以下の画面になります。

<img width="591" alt="スクリーンショット 2019-08-08 9.14.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/6894e9c8-628b-5b69-6813-e0334a3de72f.png">

で、それぞれの欄に以下の値を入力していきます。

自分の場合、Terraform Cloudのorganization nameは **kei1** なんで、こんな感じでいいのかなと。
**Application Description＊＊ は任意に

**Application callback URL** は現時点では不明なので　[Terraformドキュメント](https://www.terraform.io/docs/cloud/vcs/github.html) に書かれている **https://example.com/replace-this-later** をそのまま入れてあります。

| Field name | Value |
|:--|:--|
| Application Name | Terraform Cloud (kei1) |
| Homepage URL | https://app.terraform.io |
| Application Description | Test App for remote operation |
| Authorization callback URL | https://example.com/replace-this-later |

入力できたら画面下部の **Register application** ボタンをクリックします。

すると以下のような画面になります。

<img width="770" alt="スクリーンショット 2019-08-08 9.18.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/a9b07fd3-35de-1959-365f-2989775ab833.png">

黒く塗っている **Client ID** と **Client Secret** は後で使います。
ここでドキュメントにはご丁寧にも **アプリケーションのロゴ設定しておいてね** と書かれているので設定しておきましょう。

* [こちら](https://www.terraform.io/docs/cloud/vcs/images/tfe_logo-c7548f8d.png) からアイコンをダウンロード
* それを **Upload new logo** ボタン等を使ってアップロード
* **Badge background color** を ``#5C4EE5`` に設定

するとこんな感じになります。

<img width="506" alt="スクリーンショット 2019-08-08 9.22.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/8f4d8bca-89ff-3a91-c9f1-5c8afb18fdba.png">

で、このページは開いたままにしておき次のステップに進むようにと書かれています。
次に行きましょう。

## [Step 2: On Terraform Cloud, Add a VCS Provider](https://www.terraform.io/docs/cloud/vcs/github.html#step-2-on-terraform-cloud-add-a-vcs-provider)

Terraform Cloud側での作業になりますね。

まずはログインして、上部の **Settings** を開き、左メニューから **VCS Providers** を選択。

<img width="1301" alt="スクリーンショット 2019-08-08 9.26.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/8a77ad52-43a7-6f2c-6d91-27fc315c3061.png">

次に、 **Add VCS Provider** ボタンをクリックするとこうなります。

<img width="950" alt="スクリーンショット 2019-08-08 9.27.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/77040f20-d97c-ee31-cbf4-7833f8caf0fc.png">

ここに、GitHub側で表示されていた **Client ID** と **Client Secret** を入力します。
**Name** フィールドは空欄にしておきました。

入力が終わったら、 **Create VSC provider** をクリックします。

すると以下のような画面になります。

<img width="919" alt="スクリーンショット 2019-08-08 9.45.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/20f25270-c2e4-b7a9-fcf7-e9603335c3ec.png">

この **Callback URL** を次のステップで使うので画面はそのままで。

## [Step 3: On GitHub, Update the Callback URL](https://www.terraform.io/docs/cloud/vcs/github.html#step-3-on-github-update-the-callback-url)


GitHub側で開いていたページに戻ります。

<img width="643" alt="スクリーンショット 2019-08-08 9.48.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/4f26c1ed-2d3d-1d2e-dde0-289f719c52e4.png">

で、 **Authorization callback URL** を、先程Terraform Cloud側で表示されていた **Callback URL** で上書し、 **Update application** ボタンをクリックします。

次のステップに進みます。

## [Step 4: On Terraform Cloud, Request Access](https://www.terraform.io/docs/cloud/vcs/github.html#step-4-on-terraform-cloud-request-access)

Terraform Cloud側に戻り、　**Connect organization (名前)** ボタンをクリックします。

<img width="201" alt="スクリーンショット 2019-08-08 9.52.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/2860dd04-8d04-d5e8-e27e-fffc50691398.png">

するとおなじみの以下のような画面になります。

<img width="555" alt="スクリーンショット 2019-08-08 10.06.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/aeb8aa74-4ebe-b35c-337d-e4fc2be0b968.png">

**Authorize (UserName)** をクリックします。

成功すると以下のようなバルーンが表示されます。

<img width="415" alt="スクリーンショット 2019-08-08 10.07.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/e893dcfe-720d-38eb-695e-27d4ae4dc796.png">

で、これで一通り終了なんですが、その後にTerraformドキュメントではこう書かれています。

> At this point, GitHub access for Terraform Cloud is fully configured, and you can create Terraform workspaces based on your organization's shared GitHub repositories.

ということは、workspaceを新たに作る必要がありそうですね。

## Workspaceの新規作成

ということで、Terraform Cloudのトップ画面に戻って・・・

<img width="1271" alt="スクリーンショット 2019-08-08 10.09.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/9813a403-053f-0ac4-f784-9c96a4e0b5cc.png">

**New workspace** ボタンをクリックします。

まずこのような画面になります。

<img width="777" alt="スクリーンショット 2019-08-08 10.11.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/ab7b3116-664c-1e94-95f3-575de3bb8878.png">

画面下部の **GitHub** ボタンをクリック。

するとリポジトリを選択する画面になります。
Terraformのコンフィグを管理しているリポジトリを選択しましょう。

自分の場合は一度新規に作成し直しました。

最後に **Create workspace** ボタンをクリックします。

ちなみに、空のリポジトリだとだめなようです。

成功すると、少しの間以下のような画面でWaitが走ります。

<img width="629" alt="スクリーンショット 2019-08-08 10.17.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/2c0703bf-4665-0bcb-420f-437ad9481641.png">

で、しばらくすると以下のような画面に。

<img width="617" alt="スクリーンショット 2019-08-08 10.18.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/b7cbdc0a-2192-17fe-c951-87814ed56eaa.png">

とりあえずこれでworkspaceとしては完成しているようですね。
あとは変数設定したいような場合は、 **Configure variables** すればいいのでしょうし、そうじゃないなら **Queue plan** とかすればいいのでしょう、多分。

## Queue planしてみる

ということで諸々設定して、 **Queue plan** してみました。
が、あるあるでしたね。

<img width="1221" alt="スクリーンショット 2019-08-08 10.21.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/d39c977f-e5f6-34de-1358-b5fb3af238d9.png">

リモートのlinuxなんですね、これ。
プラグインパスをMacのそれにしてしまっていたので動かないと。

そこを直してGitHubにプッシュ。

**すると今度は勝手にplanが走りました!!** :tada:

手動での **Queue plan** もできるのですが、PUSHが入ると勝手にPlanするようですね〜。
これはなかなか良い。 :smile: 

<img width="1219" alt="スクリーンショット 2019-08-08 10.25.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/92387f37-5503-c1e5-27b7-f17544c4451e.png">

今度は成功。

で、画面下部に **Apply pending** と出てます。

<img width="1202" alt="スクリーンショット 2019-08-08 10.26.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/a040b91a-9fb6-444c-b364-e1b052ebe893.png">

**Confirm & Apply** をクリックしてみましょう。

Apply行為に対して何かしらのコメントを残していけるようですね。

<img width="725" alt="スクリーンショット 2019-08-08 10.28.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/07b3c60b-74ac-679d-280b-0efd2f895d25.png">

で、 **Confirm Plan** をクリック。

するとこうなります。

<img width="1202" alt="スクリーンショット 2019-08-08 10.29.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/7c3e7f8e-29de-a647-8056-2d2a804fb44e.png">

で、無事完了するとこうなる。

<img width="1194" alt="スクリーンショット 2019-08-08 10.30.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/6fe4009b-77b7-0816-3b4f-634a1348c80f.png">

おーーーー。　:tada: :tada: :tada:

これはいいですね。まだBetaではありますが、リリースされたら相当共同作業が楽になりそうです。


## とはいえ、これmasterにPUSHした後動いてるのですよね

ただ、remote operationを発動するためには、masterにPUSHしないとだめなのかな。

ブランチでPUSHして、先に確認したいですよね本来は。
でOKならPRをマージするみたいなことをやりたいはず。

ということで、試しにブランチを切って、そちらでは `main.tf` の中身を空にしてみました。
（要は手動で全リソースを消す(≒DESTROYみたいなもん)変更を突っ込む）


でも自動でPlanは発動しませんし、そもそもブランチ指定でPlanするような方法はないようです。

で、workspaceのcreateまで戻ってみると、実は作成時に **Advanced options** の中にこういう項目がありました。

<img width="806" alt="スクリーンショット 2019-08-08 10.36.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317673/051386ab-da0b-ea84-f779-725e408a4618.png">

要は **デフォルトブランチで動いちゃうんで、指定があるなら書いてね** ってことですよね。

ここは微妙に課題な気がしますね。
[Atlantis](https://www.runatlantis.io/) のようなフローをするのはちょっと無理なのかな。

ちなみに利用するTerraformのバージョンとかも選択できたりしましたので、色々試す価値はありそうです。

というわけで以上 **Terraform Cloud Remote Operation** を試してみました。