TerraformでGCE環境を構築する
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