🛠️

terraform cloudでgoogle cloudのインフラを管理したい

2024/02/08に公開

エンジニアをやって数年経過したけど、「あれ、僕って何ができるようになったのでしたっけ?」ってなって虚無になったので、これからは勉強したことを記事に書いてできるようになったことを視覚化しようと思います

最近Terraformを使ってインフラ構築しようと思ったので備忘録として記事を書いてみました
記事を書く練習も兼ねて色々残していこうかと思います

Terraform Cloudとは

Terraformの実行とかstateの管理をよしなにやってくれる奴です
今回の記事ではGitHubと連携してPull Requestを出したらTerraform Cloud内でplanを実行してくれて、PRをマージしたらapplyしてくれるようにしました

最初はGCPのCloud Storageにbucketを作ってそこでstate管理をしようかと思ったのですが、credential置かないと行けなかったり、stateを更新するたびにgoogleのCLI必要だったりで面倒になったのでterraform cloud無料で使えるからこれにしようって思って選びました

手順

1. Terraform CLIのインストール

homebrewを使ってインストールしました

brew install hashicorp/tap/terraform

# こっちだと古いバージョンがインストールされたのでhashicorp/tap/terraformで
brew install terraform

2. google cloudのサービスアカウント作成

Terraformを実行するためにterraformが使うサービスアカウントを作成します

権限は面倒なのでオーナーで作成しました
良い子は適切な権限を付与しましょう

作成時にCredentialをjsonでダウンロードできるので取っておいてください
後で使用します

3. APIの有効化

Terraformを走らせるためには以下のAPIを有効化しないと行けないみたいなので有効化しました

  • cloud resource manager(gcpのリソースを管理できるようにするらしい)
  • service usage(APIの有効化を行う)

4. GitHubにrepositoryを作成して適当なtfファイルをpush

Artifact RegistryにコンテナをデプロイしてそれをCloud Runで走らせるということをしたかったのでとりあえずArtifact Registryを作ることを目標にします

ちなみにそんなに大規模なインフラになる予定は全く無いですが、環境で分けられるようにディレクトリ構成は以下のようにしました(ファイルの内容は後述)
moduleとかもそのうち活用したい

.
├── environment
│   └── prod
│       ├── backend.tf
│       ├── variables.tf
│       └── main.tf
└── README.md

5. GitHubとTerraform Cloudを連携

Terraform CloudからGitHubのrepositoryにアクセスできるようにVCS Providesを登録します
Organization > Settings > Providesと遷移して、「Add a VCS Providers」から登録できます

ボタンをクリックすると以下のような画面になるのでGitHub.com(Custom)を選択します

指示に従ってGitHubにOAuth Applicationを作成します

今回はSSH Key Pairは作成しませんでした

6. Terraform CloudにWorkspaceを作成

GitHubと連携できたのでTerraform CloudにWorkspaceを作成します

GitHubを使いたいのでVersion Control Workflowを選択します

GitHub.com(Custom)を選択します

先程GitHubに作成したRepositoryを選択します

Createをクリックして作成完了です

7. Terraform CloudにCredentialsを設定

Terraform Cloudに作成したサービスアカウントのCredentialを設定します

最初の画面は忘れてしまいましたが、Add Variablesをクリックしたら変数の追加ができたかと思います

keyは何でもいいですが、GOOGLE_CREDENTIALSにしてValueをサービスアカウント作成時に出力されたjsonの中身をコピペします

Sensitiveにチェックを入れてAdd Variableをクリックして設定完了です
Sensitiveにチェックを入れてしまうと後でValueの編集ができなくなるので注意が必要です

8. main.tfを書く

ここまで準備ができたらあとはtfファイルに作成するものを書いていきましょう

main.tf

provider "google" {
  project     = var.project_id
  region      = var.region
  credentials = var.GOOGLE_CREDENTIALS
}

variable.tf

variable "region" {
  default = "us-west1"
}

variable "project_id" {
  default = "your-project-id"
}

variable "GOOGLE_CREDENTIALS" {}

backend.tf

terraform {
  backend "remote" {
    hostname     = "app.terraform.io"
    organization = "your organization name"

    workspaces {
      name = "your workspace name"
    }
  }
}

まず最初にproviderですが、gcpを使うので使用するprojectのIDとregionと先程Terraform Cloudに設定したGOOGLE_CREDENTIALSを設定します

GOOGLE_CREDENTIALSはエラーが出ないようにvariable.tfに空で定義しておきます
Terraform Cloudが後で上書きしてくれます

Terraformで作成したstateをTerraform Cloudに保存するためにbackend.tfにbackendを定義しています

ここまでやったら一旦terraform initを実行します
environment/prod配下で実行してください

実行するとstateがTerraform Cloudで管理されるようになります

9. PRの作成・マージ

GitHubでPRを作成するとTerraform Cloud上でPlanが走ります

その後、PRをマージするとApplyされます

WorkspaceのSettingからAuto Applyにチェックを入れないと自動でApplyされないので自動でApplyされたい場合はチェックを入れる(2024/02/13 追記)

まとめ

作業時間的には色々試行錯誤したのでかかりましたが、文章にしてみると結構簡単に見えますね
Terraform Cloudが無料で使えるならこれでいいかな感もあります

参考

こちらの記事を参考にさせていただきました
https://dev.classmethod.jp/articles/terraform-cloud/

Discussion