terraform cloudでgoogle cloudのインフラを管理したい
エンジニアをやって数年経過したけど、「あれ、僕って何ができるようになったのでしたっけ?」ってなって虚無になったので、これからは勉強したことを記事に書いてできるようになったことを視覚化しようと思います
最近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が無料で使えるならこれでいいかな感もあります
参考
こちらの記事を参考にさせていただきました
Discussion