これは?
最近Terraformを使えるようになりたいと思ったので、自分で公開していたcloud runのサービスをTerraformで管理するようにしてみた際のメモです! 自分向けメモなのでリンクペタペタだけです。
環境
- Terraform v1.2.8
- Docker version 20.10.17
- Google Cloud SDK 399.0.0
やること
- mainブランチにマージしたら、Docker imageがGCRにPushされるようにする
- cloud runのサービスを作成する
- 認証済みドメインをマッピングする
上記をほぼTerraformで管理することを目指します(一部の下準備的な部分は手動になります)。図にするとこんな感じです。
やらないこと
- gcpのプロジェクトは作っておいてください
- 環境構築手順は説明しません。Google cloud sdkとTerraformが必要なので、参考になる記事を下に貼ります
やっていく
GithubとGCPのプロジェクトを接続
ここは手動。コンソールのここからポチポチ進めるとできます。トリガーの作成の部分はTerraformでやるのでGUIで設定する必要はありません。下記のような画面です。
Github->GCRにPushするcloudbuildリソースを作成
ここからtfファイルを書いていきます。
今回はmain.tf
にリソースを書いていき、variable.tf
にmain.tf
で使う定数を定義していきます。Github->GCRはcloud build
を使って、GithubへのPushをトリガーとして、GCRにDocker imageをビルドしていきます。
先述したように、公式のgoogle_cloudbuild_triggerドキュメントを参照して埋めていきます。
resource "google_cloudbuild_trigger" "default" {
github {
name = var.github_repo
owner = var.github_owner
push {
branch = "^${var.github_branch}$"
invert_regex = false
}
}
build {
images = ["gcr.io/$PROJECT_ID/$REPO_NAME:latest"]
# imageをビルド
step {
name = "gcr.io/cloud-builders/docker"
args = [
"build",
"-t",
"gcr.io/$PROJECT_ID/$REPO_NAME:latest",
"-f",
"app/Dockerfile",
"."
]
timeout = "3600s"
}
# GCRにPush
step {
id = "Push"
name = "gcr.io/cloud-builders/docker"
args = [
"push",
"gcr.io/$PROJECT_ID/$REPO_NAME:latest"
]
timeout = "3600s"
}
timeout = "7200s"
}
}
variable "project_name" {
default = "<GCPのプロジェクト名>"
}
variable "github_repo" {
default = "<Githubのリポジトリ名>"
}
variable "github_owner" {
default = "<Githubのユーザー名>"
}
variable "github_branch" {
default = "<トリガーとなるブランチ名>"
}
タイムアウトが異様に長いのはビルドにめっちゃ時間がかかるものだったからので、他の人はよしなにしてください。リポジトリ名はhttps://github.com/<ユーザー名>/<リポジトリ名>
の<リポジトリ名>
の部分のことです。
基本的にドキュメントを見ながら設定項目を埋めていく感じです。
cloud runのサービスを作成するリソースを作成
これはGoogleが公開しているcloud run + ロードバランサのチュートリアルで同じようなことをしている箇所があったので、真似しました。
# ↑でPushしたイメージでサービスをビルドする
resource "google_cloud_run_service" "default" {
name = var.cloud_run_service_name
location = var.gcp_location
template {
spec {
containers {
image = "gcr.io/${var.project_name}/${var.github_repo}:latest"
ports {
container_port = 8080
}
}
}
}
}
# 未認証のアクセスを許可する権限を付与
resource "google_cloud_run_service_iam_member" "cloud_run_member" {
location = google_cloud_run_service.default.location
project = google_cloud_run_service.default.project
service = google_cloud_run_service.default.name
role = "roles/run.invoker"
member = "allUsers"
}
variable "cloud_run_service_name" {
default = "<cloud runのサービス名>"
}
variable "gcp_location" {
default = "<ロケーション名(us-central1など)>"
}
(ドメインの認証)
マッピングできるカスタムドメインは認証済みのものだけなので、使いたいドメイン、サブドメインが未認証の場合は、こちらの記事を参考に認証する必要があります
カスタムドメインをマッピング
ドメインが用意できたら、作成したcloud runのサービスにドメインをマッピングします
resource "google_cloud_run_domain_mapping" "domain_mapping" {
location = google_cloud_run_service.default.location
name = var.custom_domain
metadata {
namespace = var.project_name
}
spec {
route_name = google_cloud_run_service.default.name
}
}
variable "custom_domain" {
default = "<ドメイン名>"
}
Terraformをapply
# どのようなリソースが作成されるか(もしくは削除・変更)を確認
terraform plan
# tfファイルに書いた内容を反映
terraform apply
おわり
ドキュメントやチュートリアルが充実しているので、定番なことは調べればすぐできそうだなと感じました。
ただ、GCPの知識が全くないと、何を設定していいかもわからないと思うので、ある程度コンソールでの操作のイメージがつくくらいの感じじゃないと結構難しいのではないかと感じました。GCP力を鍛えていきたいです!
最後まで目を通していただきありがとうございました。(用語の大文字小文字が揺れているのはお許しください)