Google Cloud Compute EngineをTerraformで構築してみる

Google Cloud Compute EngineのVMインスタンス上で動作するojichatをTerraformで構築してみました。
2021.12.18

はじめに

こんにちは、CX事業本部MAD事業部の森茂です。

本エントリーはクラスメソッドGoogle Cloud Advent Calendar 2021の18日目の記事です。

本記事の執筆でGoogle Cloudデビューしました。

みなさんもojichatをもっと手軽に利用できないかという相談をうけることがよくあるかと思います。 今回はそういったご要望に応える方法のひとつとして、Google Cloudの仮想マシンを作成できるサービスであるGoogle Cloud Compute Engine(以下GCE)をTerraformで構築し、手軽にコンソールのSSHターミナルからojichatを実行できる環境を構築してみました。

環境構築

Terraformを使って環境を構築するには事前の準備が必要になります。下記ツールのインストールとGoogle Cloudで利用できるプロジェクトを管理コンソールあらかじめ準備しておいてください。

執筆時の環境

  • macOS Monterey v12.1
  • Terraform CLI v1.1.2
  • Google Cloud SDK v366.0.0

TerraformのインストールやGoogle Cloudの認証情報についてはこちらの記事も参考になると思います。

Application Default Credentials (ADC)

TerraformなどCLIツールで認証情報を利用するためにADCを設定します。あらかじめADCを設定しておくことでTerraformの実行時に認証情報を記載せずに利用することができるようになります。

$ gcloud auth application-default login
Your browser has been opened to visit:

# ブラウザが立ち上がりGoogleアカウント認証の画面へリダイレクトされる

Credentials saved to file: [/Users/"ホームディレクトリ"/.config/gcloud/application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC).

Quota project "プロジェクト名" was added to ADC which can be used by Google client libraries for billing and quota. Note that some services may still bill the project owning the resource.

Terraformプロジェクトの作成

$ mkdir ojichat-project
$ cd ojichat-project
$ touch main.tf

作業用に用意したディレクトリ(ojichat-project)へ移動し、新規にmain.tfファイルを用意します。なおTerraformはデフォルトの挙動として、カレントディレクトリの.tfという拡張子が付いているファイルを自動的に認識して実行します。

main.tf

# terraformの設定
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "4.4.0"
    }
  }
}

# terraformで利用するプロバイダーの設定
provider "google" {
  # credentials = file("./hogehoge.json") クレデンシャルファイルを利用の場合

  project = "プロジェクト名"
  region  = "asia-northeast1"
}

main.tfのterraformブロック、providerブロックで、Terraformで使用するプロバイダーの設定とTerraformのバージョンを定義します。

GCE VMインスタンスの作成

main.tfにつづけてGCEのVMインスタンスの設定と、VMインスタンス用のサービスアカウントを設定していきます。VMインスタンスの起動時にmeta_data_startup_scriptを渡すことで起動時に実行するスクリプトを記載することができます。ここではgolangパッケージのインストールとojichatのインストールを行っています。

main.tf

...省略

resource "google_service_account" "default" {
  account_id   = "プロジェクト名"
  display_name = "Ojichat Instance Service Account"
}

resource "google_compute_instance" "default" {
  name         = "ojichat-instance"
  machine_type = "e2-micro"
  zone         = "asia-northeast1-a"

  tags = ["ojichat"]

  boot_disk {
    initialize_params {
      image = "ubuntu-os-cloud/ubuntu-2110"
    }
  }

  network_interface {
    network = "default"
    access_config {}
  }

  service_account {
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }

  metadata_startup_script = <<EOF
#!/bin/bash
apt-get update
apt-get -y install golang
HOME=/usr/local/go GOBIN=/usr/local/bin /usr/bin/go install github.com/greymd/ojichat@latest
EOF
}

Terraformの実行

terraform planでスクリプトと実行される想定のリソースに問題ないことを確認の上、terraform applyを実行してGoogle Cloud上へリソースを作成します。

$ terraform plan

# 実行に問題ないことを確認

$ terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_compute_instance.default will be created
  + resource "google_compute_instance" "default" {
      ...省略

Plan: 2 to add, 0 to change, 0 to destroy.

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

...省略

google_service_account.default: Creating...
google_service_account.default: Creation complete after 2s [id=projects/"プロジェクト名"/serviceAccounts/"プロジェクト名"@"プロジェクト名".iam.gserviceaccount.com]
google_compute_instance.default: Creating...
google_compute_instance.default: Still creating... [10s elapsed]
google_compute_instance.default: Creation complete after 14s [id=projects/"プロジェクト名"/zones/asia-northeast1-a/instances/ojichat-instance]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Apply complete!と出力されサービスアカウントとVMインスタンスの2つのリソースが作成されました。GCEのVMインスタンスの起動はとても速く、環境や状況にもよりますが30秒前後で利用できるようになることもあります。なお今回は起動後にパッケージのインストールを行っていますので実際にojichatを利用できるには数分待つ必要があります。

Google CloudコンソールからSSHターミナルを起動

Google CloudではコンソールからGCEのVMインスタンスへブラウザを利用してSSH接続することができるので、今回はこちらからojichatを利用します。鍵の設定も不要で起動後すぐに利用できるのでちょっとしたメンテナンスやojichatを使うにはとても便利ですね。

接続できたところでさっそくojichatを使います。

$ ojichat
結実チャン、ヤッホー(^з<)何してるのかい🤔❗❓😜⁉️❓ボクは、近所に新しくできたバー🍷に行ってきたよ。味はまぁまぁだったかな💕😚

$ ojichat もりしげ
もりしげチャン、ヤッホー😂何してるのかい❗❓🤔今日は埼玉28度だよ(-_-;)😰^^;暑いよ(-_-;)ヤケドし♥ 😃☀

完璧ですね🤩✨✨

ojichatコマンドを入力した際にエラーが出る場合はまだパッケージのインストールが完了していない状態です。早く使いたい気持ちを抑えしばらく待ってから再度試してみてください。

おかたづけ

VMインスタンスの利用が終わったときは料金がかかってしまうので忘れずにVMインスタンスを削除しておきましょう。

$ terraform destory
...省略

Destroy complete! Resources: 2 destroyed.

Destroy complete! Resources: 2 destroyed.と出力されれば削除の完了です。

さいごに

無事に要望に応えることのできる環境をつくることができました。VMインスタンスの起動速度とTerraformを利用すれば次回からは要望が入り次第10分弱で提供することができるはずです:)

これからはいつでも好きな時にojichat環境を手に入れることができますね。

参考