LPIC勉強用環境(GCP)をterraformを使って構築する

## 実現したいこと
- GCP上にインスタンスをたてたり、壊したりしたい。(ssh接続できるホストが1つ以上ほしい)
- できればスナップショットをとったりしたい。→ 別記事にて作成予定。

## 背景
- 10月にLPICを受験することになったので、GCP環境上に練習用の環境を構築することにした。
- せっかくなので環境を作ったり壊したりしやすいようにterraformを使ってみたい(個人的興味)。

## [Terraform](https://www.terraform.io/)とは
- IaCのツール。
- HCL（HashiCorp Configuration Language）と呼ばれる構成言語であるべき姿を定義する。
- どうもTerraform CloudとTerraform CLIという二種類があるらしい。
- 今回はTerraform CLIを使用する。

## 環境
(手書きですみません)
![gcp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279475/7b61e9c3-5b5f-9016-bb31-e22b2eb37a3e.jpeg)

- macにTerraformをインストールして、gcpを操作する感じ。

## 手順
### Terraformをインストール
- Homebrewで一発。

```bash
brew install terraform
```

### terraform -> GCP用にサービスアカウントを設定
- [IAMと管理]->[サービスアカウント]より、サービスアカウントがあるか確認する。
- (ある場合)[操作]より[鍵を作成]を選択する。
- 形式は[JSON]とする。
- <img width="1758" alt="スクリーンショット 2019-09-25 0.16.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279475/d12a3183-d805-9b77-cf24-a82f42f896af.png">
- 適当な場所にファイルを配備する。

### サンプルコード作成
- vm2台を作成するhclを以下に記述する。

```hcl
provider "google" {
  project = "(prj_name)"
  credentials = "${file(serviceaccount)_.json")}"
  region  = "asia-northeast1"
  zone    = "asia-northeast1-b"
}

resource "google_compute_instance" "vm_instance" {
  count = "2"
  name         = "(vm_name)"
  machine_type = "f1-micro"

  boot_disk {
    initialize_params {
      image = "(image)"
    }
  }

  metadata = {
    ssh-keys = "(username):${file("~/.ssh/id_rsa.pub")}"
  }

  network_interface {
    # A default network is created for all GCP projects
    network       = "default"
    access_config {
    }
  }
}

```

- prj_name:　プロジェクトID
- (serviceaccount)_.json: [手順]で出力したjsonのパス
- (image): [ここ](https://cloud.google.com/compute/docs/images)で確認できるイメージ名
- (username): ログインユーザ名(なんでもよい)

### Terraform周りのコマンド実行
- 初期化

```bash
hogehogenoiMac:gcp hogehoge$ terraform init
# .terraformディレクトリ一式が作成される
```

- 作成したコードに文法のエラーがないか、何が作成されるかを確認する。

```bash
hogehogenoiMac:gcp hogehoge$ terraform plan
Refreshing Terraform state in-memory prior to plan...
...
Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.
```

- 問題がなければ`terraform apply`を使用して設定を適用する。

```bash
hogehogenoiMac:gcp hogehoge$ terraform apply
...
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
# 問題なければyesと答える

google_compute_instance.vm_instance: Creating...
google_compute_instance.vm_instance: Still creating... [10s elapsed]
google_compute_instance.vm_instance: Creation complete after 12s [id=(project)]

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

Terraformで作成した環境を削除する時は`terraform destroy`を使用する。

```bash
hogehogenoiMac:gcp hogehoge$ terraform destroy
...
Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes
# 問題なければyesと答える
google_compute_instance.vm_instance: Destroying... [id=(project)]
google_compute_instance.vm_instance: Still destroying... [id=(project), 10s elapsed]
google_compute_instance.vm_instance: Still destroying... [id=(project), 20s elapsed]
google_compute_instance.vm_instance: Destruction complete after 28s

Destroy complete! Resources: 1 destroyed.
```

## 参照
- Google Cloud がチュートリアルを提供しているので↓、初歩的なことはできた
- https://cloud.google.com/community/tutorials/getting-started-on-gcp-with-terraform

## 所感
- サクッと環境を構築したり壊したりできるので便利！！
- ドキュメントサイトはあるが、初見ではやや難しい。。。
- いくつかチュートリアルをやってみたら感覚掴めるかも？