👶

TerraformでGCE環境を構築する

2021/04/10に公開

TerraformでGCE環境を構築した際の手順です。(Terraformは予めインストールしておいてください)

サービスアカウントの用意

TerraformでGCE環境構築する際に使用するサービスアカウントを用意します。
サービスアカウントを用意したらJSON形式で鍵を作成してください。

また、インスタンスを立てる際、サービスアカウントにインスタンスを立てる権限がないと権限エラーでひっかかります。
公式ドキュメント(https://cloud.google.com/compute/docs/access/iam?hl=ja#the_serviceaccountuser_role)によるとCompute インスタンス管理者(v1)サービスアカウントユーザーの2つの権限が必要になるのでIAMから付与してあげてください。

.tfファイルを用意

サービスアカウントが用意できたら、.tfファイルを用意します。
.tfファイルには自分の立てたいインスタンスの内容(名前やリージョン、どんなディスクを使うかなど)を定義していきます。

今回はinstance.tfという名前のファイルの中に記述していきます。(プロジェクト名やリージョンなどは適宜変更してください🙏)
instance.tf

provider "google" {
  credentials = file("terraform-sa-key.json")
  project     = "hogehoge"
  region      = "us-west1"
}

resource "google_compute_instance" "default" {
  name = "gce-test"
  machine_type = "f1-micro"
  zone = "us-west1-a"
  tags = [ "http-server" ] 


  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-10"
    }
  }

  metadata_startup_script = file("./init.sh")

  metadata = {
    enable-oslogin = "TRUE" 
  }

  network_interface {
    network = "default"
    access_config {}
  }

}

credentials = file("terraform-sa-key.json") にはサービスアカウントに鍵を作成した際にダウンロードしたjsonファイルを指定してください。

tags = [ "http-server" ] はhttpアクセスを許可します。
もしhttpsアクセスも許可したい場合は https-server も追加します。
コンソール上の画面でいうと 「ファイアウォール httpトラフィックを許可する」 にチェックしたことに当たります。

私の場合、最初httpアクセスを許可する場合はtagsに何を指定すればいいか分からなかったのですが、色々調べていくうちにVPCネットワーク > ファイアウォールから、自分の利用したいファイアウォールのターゲット名を指定すればうまくいくということに気づきました🎉🎉

metadata_startup_script = file("./init.sh") にはインスタンス起動時に実行したい処理を書きます。今回はdockerを使いたかったのでinit.shの中にdockerをインストールするシェルを書いています。もし起動時に実行したい処理がなければmetadata_startup_scriptはなくても大丈夫です👌

enable-oslogin = "TRUE" はgithubactionsからGCEインスタンスにSSH接続したかったので書いています。こちらも必要がなければ書かなくて大丈夫です👌

network = "default" はデフォルトのネットワークを利用するという意味です。
コンソール上でいうと、下記のネットワークを使うということになります。

access_config {} は外部IPを付与しています(外部IPはランダムで振られます)。もしこの項目を消してしまったら外部IPが振られないので、外部からアクセスすることはできなくなります。

インスタンスの作成

以上のことが完了したら、下記コマンドをinstance.tfがおいてあるディレクトリで実行します。
完成です🙌🙌

terraform init
terraform plan
terraform apply

Discussion