0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

mainブランチにマージ~ドメイン付きでCloud Runサービス公開までをTerraformで管理

Last updated at Posted at 2022-09-01

これは?

最近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で管理することを目指します(一部の下準備的な部分は手動になります)。図にするとこんな感じです。
スクリーンショット 2022-09-01 23.59.57.png

やらないこと

やっていく

GithubとGCPのプロジェクトを接続

ここは手動。コンソールのここからポチポチ進めるとできます。トリガーの作成の部分はTerraformでやるのでGUIで設定する必要はありません。下記のような画面です。
スクリーンショット 2022-09-02 1.08.23.png

Github->GCRにPushするcloudbuildリソースを作成

ここからtfファイルを書いていきます。
今回はmain.tfにリソースを書いていき、variable.tfmain.tfで使う定数を定義していきます。Github->GCRはcloud buildを使って、GithubへのPushをトリガーとして、GCRにDocker imageをビルドしていきます。
先述したように、公式のgoogle_cloudbuild_triggerドキュメントを参照して埋めていきます。

main.tf
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.tf
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 + ロードバランサのチュートリアルで同じようなことをしている箇所があったので、真似しました。

main.tf(追記)
# ↑で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.tf(追記)
variable "cloud_run_service_name" {
  default = "<cloud runのサービス名>"
}

variable "gcp_location" {
  default = "<ロケーション名(us-central1など)>"
}

(ドメインの認証)

マッピングできるカスタムドメインは認証済みのものだけなので、使いたいドメイン、サブドメインが未認証の場合は、こちらの記事を参考に認証する必要があります

カスタムドメインをマッピング

ドメインが用意できたら、作成したcloud runのサービスにドメインをマッピングします

main.tf(追記)
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.tf(追記)
variable "custom_domain" {
  default = "<ドメイン名>"
}

Terraformをapply

# どのようなリソースが作成されるか(もしくは削除・変更)を確認
terraform plan
# tfファイルに書いた内容を反映
terraform apply

おわり

ドキュメントやチュートリアルが充実しているので、定番なことは調べればすぐできそうだなと感じました。
ただ、GCPの知識が全くないと、何を設定していいかもわからないと思うので、ある程度コンソールでの操作のイメージがつくくらいの感じじゃないと結構難しいのではないかと感じました。GCP力を鍛えていきたいです!
最後まで目を通していただきありがとうございました。(用語の大文字小文字が揺れているのはお許しください)

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?