Terraform Cloudの始め方

Terraform Cloudの始め方を解説します。
5人まで無料で使用できるので、個人利用の場合は、重宝できそうだと思い試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/8db13524-ba20-7a39-7111-5965cb482523.png)

---

#アカウント作成
[こちら](https://www.terraform.io/cloud)からアカウントを作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/982b0cb8-d15e-f744-1414-0e1ce006e930.png)

---

#####主な入力情報
- ユーザ名
- メールアドレス
- パスワード
- 利用規約の同意
- プライバシーポリシーの同意

---

##メールアドレス認証
こんな感じのメールが送られてくるので、URLをクリックし認証を行います。

```
Hello,

Please confirm this email address for your Terraform Cloud account by clicking on the link below:

https://app.terraform.io/confirmation?confirmation_token=XXXXXXXXXXXXXXXXXXX

Best,
HashiCorp
```

---

##認証完了画面
認証完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/6e0a69cb-a421-a31e-3fe0-10cec51080ed.png)
※ワークフローの選択がありますが、「サンプル構成で試すか」「自分で一から作るか」の選択になるので、今回は下の「自分で一から作る」かたちで始めます。

---

##組織の作成
今回は、一人でしか使用しないので、ここは好きな名前でいいと思います。
※会社の場合は、会社名でいいかなと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/cebeaf7a-07c5-eda2-3cab-55e740bd7ab1.png)

---

#Workspaceを作成
今回は、バージョン管理ワークフローで作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/22020633-e00d-14b8-03a1-7b4686f15f9f.png)

---

##バージョン管理のプロバイダー
今回は、Githubを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/074df7ef-bd86-ee33-4433-1d6bbc6f996d.png)
※Github側の認証に入るので、認証を進めてください。

---

#コードをGitHubにPush
ここからGithubに移ります。
Github上にリポジトリがないと、ワークスペースの作成ができない為、コードをPushしていきます。

・AWS ProviderとVPCを作成するコードをGitHubにPushします。

```tf:main.tf
variable "aws_access_key" {}
variable "aws_secret_key" {}

provider "aws" {
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region = "ap-northeast-1"
}

resource "aws_vpc" "test-vpc" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "test-vpc"
  }
}
```

---

##リポジトリを選択し、ワークスペースを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/eec5bd89-99d6-3528-36c2-0ff068189a5c.png)

---

##ワークスペース作成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/6e0c5de6-d10d-ec5b-531f-141a69d97d32.png)

---

##環境変数を追加
IAMユーザのアクセスキーとシークレットキーをTerraform Variablesに設定する。

- aws_access_key
- aws_secret_key

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/b54929bb-e4a2-580d-d1e8-2bbf4c2a9a40.png)

---

#試しに実行してみる
Queue plan で実行してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/5d03a8f0-febe-9fd2-4168-61b2f598fc1a.png)

---

##実行結果（Plan）
VPC作成しますよと出ていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/b6e2bf6b-c0d6-e985-c510-d77d3464b9c5.png)

---

##実行結果（Apply）
apply finished しているので、作成できていそうですね。
※デフォルトの設定だとApplyは手動でボタンをクリックすることによってapplyが走ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/11425d34-e478-e179-ab68-022f489c1880.png)

---

##AWS側で確認
VPCが作成されていました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/f5f01e13-d465-6aae-a02b-bb299fa55d7a.png)

---

#MainにMerge自動plan & applyをやってみる
Applyを自動実行する設定に変更します。
SettingsからGeneralで、Apply MethodをAuto applyに変更し、Save settingsで保存です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/b84b4b40-571a-6417-d93d-c6108a8f8f2e.png)

---

#Pull Requestを出してみる
サブネットを作成してみます。
まずはテストとしてMulti-AZのSubnetを追加するコードをMainから切った別ブランチ(develop)にPushします。

```tf:main.tf
// 追加コード
resource "aws_subnet" "test-subnet-a" {
  vpc_id     = aws_vpc.test-vpc.id
  cidr_block = "10.0.0.0/28"
  availability_zone = "ap-northeast-1a"

  tags = {
    Name = "test-subnet-a"
  }
}

resource "aws_subnet" "test-subnet-c" {
  vpc_id     = aws_vpc.test-vpc.id
  cidr_block = "10.0.0.16/28"
  availability_zone = "ap-northeast-1c"

  tags = {
    Name = "test-subnet-c"
  }
}
```

---

##実行結果（plan）
Pull Requestを作成すると自動でテスト(terraform plan)が走り、Terraform Cloud上ではこんな感じでテスト(terraform plan)が走っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/1b2b9a03-0e38-c723-fd62-d761f99c4f62.png)

---

##実行結果（apply）
MainにMergeされると、自動的にapplyされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/30458d9e-d07e-c730-9c3f-8142adfe1470.png)

---

#お片付け
環境のdestroyを実行したい場合、SettingsからDestruction and Deletionで、削除することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192019/6cd196af-677f-b872-559e-c9a679fa5839.png)

---

#まとめ
terraformのバージョン管理など自作で作ると大変な作業でしたが、クラウドサービスをうまく使えば、個人利用の範囲であれば活用できそうです。Terraform Cloudが自動実行されるタイミングはMainの変更とPull Request作成時のみとなっており、もちろんPull Rqeustのときはplanのみの実行で、MainにMergeされない限りapplyは実行されないため、安全なCI/CDが組めそうです。

---

#終わり