Terraformを使用してGCPでVMインスタンスを起動する方法

![スクリーンショット 2024-02-22 085447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/8140b2c3-d9da-13ad-5a51-12f69ced2159.png)
# はじめに
今回は、Terraformを使用してGoogle Cloud Platform（GCP）でVMインスタンスを起動する手順を説明します。オートスケーリング、SSH鍵の追加、およびその他の重要な構成オプションに焦点を当てます。

参考記事：https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_group

以下のコードは、VMインスタンスを起動するためのTerraformのメイン設定ファイルである**main.tf**です。
```
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "3.72.0"
    }
  }
}

provider "google" {
  credentials = file("path/to/your/gcp_credentials.json")  # プロジェクトのサービスアカウントキーへのパス
  project     = "your-project-id"  # GCPプロジェクトのID
  region      = "asia-northeast1"
}

# Google Cloudのディスクイメージを取得
data "google_compute_image" "debian_9" {
  family  = "debian-11"
  project = "debian-cloud"
}
```
## コードの詳細
### google_compute_instance_template:
VMインスタンスの設定を定義します。ここでは、ディスクイメージ、ネットワーク設定、メタデータ（SSH鍵など）が含まれます。
```
# VMインスタンステンプレートを作成(main.tfの続き)
resource "google_compute_instance_template" "foobar" {
  name           = "my-instance-template"
  machine_type   = "e2-medium"
  can_ip_forward = false

  tags = ["foo", "bar"]

  disk {
    source_image = data.google_compute_image.debian_9.id
  }

  network_interface {
    network = "default"

    access_config {
      // 外部IPアドレスを持つように設定
    }
  }

  metadata = {
    foo      = "bar"
    ssh-keys = "~/.ssh/id_rsa.pub" # SSH公開鍵のパスを入れる
  }

  service_account {
    scopes = ["userinfo-email", "compute-ro", "storage-ro"]
  }
}
```
### google_compute_target_pool: 
ターゲットプールを作成します。これは、後でインスタンスグループによって使用されます。
```
# ターゲットプールを作成(main.tfの続き)
resource "google_compute_target_pool" "foobar" {
  name = "my-target-pool"
}
```
### google_compute_instance_group_manager: 
インスタンスグループマネージャを作成します。インスタンステンプレートとターゲットプールを使用して、インスタンスのグループ化と管理を行います。
```
# インスタンスグループマネージャを作成(main.tfの続き)
resource "google_compute_instance_group_manager" "foobar" {
  name = "my-igm"
  zone = "asia-northeast1-a"

  version {
    instance_template = google_compute_instance_template.foobar.id
    name              = "primary"
  }

  target_pools       = [google_compute_target_pool.foobar.id]
  base_instance_name = "foobar"
}
```
### google_compute_autoscaler: 
オートスケーリングポリシーを定義します。このポリシーに基づいて、インスタンスの数が自動的に調整されます。
```
# オートスケーラーを作成(main.tfの続き)
resource "google_compute_autoscaler" "foobar" {
  name   = "my-autoscaler"
  zone   = "asia-northeast1-a"
  target = google_compute_instance_group_manager.foobar.self_link

  autoscaling_policy {
    max_replicas    = 5
    min_replicas    = 1
    cooldown_period = 60

    cpu_utilization {　#CPU使用率
      target = 0.5
    }
  }
}
```
このポリシーを持つオートスケーラーが稼働すると、CPUの負荷が一定の目標値（この場合は50%）を超える場合、新しいインスタンスが自動的に起動します。そのため、アプリケーションのトラフィックが急増した場合や、CPU負荷が高い場合に、インスタンスの数が増加し、リソースの需要に応じてスケールアウトします。

#### 注意※
重要なポイントとして、オートスケーリングによってインスタンスの数が動的に変化するため、手動でインスタンスを停止しても、オートスケーリングによって新しいインスタンスが起動する可能性があることを認識する必要があります。そのため、インスタンスを手動で停止する場合は、オートスケーリングポリシーを一時的に無効にするか、注意して行う必要があります。

# 1. Terraformの初期化 (terraform init)
最初に、Terraformプロジェクトを初期化する必要があります。この手順では、TerraformがGCPプロバイダーを使用するための必要なプラグインやモジュールをダウンロードします。

```
$ terraform init
```
# 2. プランの作成 (terraform plan)
次に、Terraformにデプロイされるリソースの計画を作成します。これにより、Terraformは実際にリソースを作成、変更、または削除する前に、変更の影響を事前に確認できます。
```
$ terraform plan
```
terraform planコマンドは、実行される変更の詳細を表示します。これには、追加されるリソース、変更されるリソース、および削除されるリソースが含まれます。

# 3. デプロイメント (terraform apply)
最後に、実際にリソースをデプロイするためにterraform applyコマンドを使用します。これにより、Terraformは計画に従ってGCP上にリソースを作成および構成します。
```
$ terraform apply
```
実行時に確認が求められる場合があります。確認を受け入れるには、yesを入力してください。

以上が、Terraformを使用してGCPでVMインスタンスを起動する手順です。これで、自動スケーリングを含むVMインスタンスが正常に起動されます。