Rails 7+webpackをCloud Run+Cloud SQL構成で動かす や DjangoをCloud Run+Cloud SQL構成で動かす では Cloud Run + Cloud SQL 構成を Google Cloud コンソールから作成する方法を説明しました。
しかし、実際の現場においては GUI でリソースを管理することはほぼなく Terraform などで IaaC ツールを使っていることがほとんどでしょう。
そこでこの記事では Cloud Run+Cloud SQL 構成を Terraform で管理する方法を説明します。
今回使用するソフトウェアのバージョンは下記です。
- Terraform 1.1.2
下記の解説ページに従ってまずは Google Cloud 用の Provider を設定します。
先に Google Cloud SDK をインストールしておいてください。
 main.tf を作成し下記のように Google Cloud プロジェクトの情報を記述します。  
 zone は a, b, c どこでも構いません。  
provider "google" {
  project = "{{YOUR GCP PROJECT}}"
  region  = "asia-northeast1"
  zone    = "asia-northeast-b"
}
 以下、この記事では main.tf に全てのリソースや変数を定義していきますが、実際は適当にファイルを分けるのが良いでしょう。  
プロジェクトルートで初期化を実行しておきます。
$ terraform init
Cloud SQL インスタンスを作成します。データベースとユーザーも作成しておきます。
それぞれに対応する Terraform リソースは下記の通りです。
-  SQL インスタンス: google_sql_database_instance
-  データベース: google_sql_database
-  ユーザー: google_sql_user
 これらを main.tf に定義していきます。  
 データベースのパスワードは main.tf に直接記述するのではなく、別途シークレット用のファイルを作成して plan や apply のときに渡すようにします。  
#
# Variables
#
variable "db_password" {
  description = "Database user password"
  type        = string
}
#
# Cloud SQL
#
resource "google_sql_database_instance" "rails7" {
  name             = "rails7"
  database_version = "MYSQL_5_7"
  settings {
    tier = "db-f1-micro"
  }
  deletion_protection  = "true"
}
resource "google_sql_database" "rails7_cloudrun_sample" {
  name      = "rails7_cloudrun_sample"
  instance  = google_sql_database_instance.rails7.name
  charset   = "utf8mb4"
  collation = "utf8mb4_bin"
}
resource "google_sql_user" "rails7" {
  name     = "rails7"
  instance = google_sql_database_instance.rails7.name
  host     = "%"
  password = var.db_password
}
 secret.tfvars ファイルを作成し下記のようにデータベースのパスワードを記述します。  
 secret.tfvars はパブリックな Git リポジトリに push しないように予め .gitignore で除外するなどしておいてください。  
db_password = "database_user_password"
ここまでできたら一度 Google Cloud へ反映しておきます。
 まず下記のように plan を実行します。  
$ terraform plan -var-file="secret.tfvars"
作成されるリソースが表示されるので確認します。
 問題なければ apply を実行しましょう。  
$ terraform apply -var-file="secret.tfvars"
 Cloud SQL Admin API が有効になっていなくて下記のようなエラーになった場合は、エラーメッセージにある URL にアクセスして API を有効化して再度 apply を実行します。  
Error: Error, failed to create instance <instance_name>: googleapi: Error 403: Cloud SQL Admin API has not been used in project <project_id> before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?project=<project_id> then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
Cloud Run サービスを作成します。
 Cloud Run サービスを作成するにあたって必要なリソースは google_cloud_run_service のみです。  
 リファレンスにサンプルが載っているので参考にしながら main.tf を記述していきます。  
#
# Cloud Run
#
resource "google_cloud_run_service" "rails7-cloudrun-sample" {
  name     = "rails7-cloudrun-sample"
  location = "asia-northeast1"
  template {
    spec {
      containers {
        image = "gcr.io/cloudrun-terraform-sample/rails7-cloudrun-sample"
        env {
          name  = "RAILS_ENV"
          value = "production"
        }
        env {
          name  = "RAILS_LOG_TO_STDOUT"
          value = "1"
        }
        env {
          name  = "RAILS_SERVE_STATIC_FILES"
          value = "1"
        }
        env {
          name  = "RAILS_MASTER_KEY"
          value_from {
            secret_key_ref {
              name = "rails-master-key"
              key  = "latest"
            }
          }
        }
      }
    }
    metadata {
      annotations = {
        "autoscaling.knative.dev/maxScale"      = "1000"
        "run.googleapis.com/cloudsql-instances" = google_sql_database_instance.rails7.connection_name
        "run.googleapis.com/client-name"        = "terraform"
      }
    }
  }
  metadata {
    annotations = {
      "run.googleapis.com/launch-stage" = "BETA"
    }
  }
}
data "google_iam_policy" "noauth" {
  binding {
    role = "roles/run.invoker"
    members = [
      "allUsers",
    ]
  }
}
resource "google_cloud_run_service_iam_policy" "noauth" {
  location    = google_cloud_run_service.rails7-cloudrun-sample.location
  project     = google_cloud_run_service.rails7-cloudrun-sample.project
  service     = google_cloud_run_service.rails7-cloudrun-sample.name
  policy_data = data.google_iam_policy.noauth.policy_data
}
 containers.image はご自身のプロジェクト名とイメージ名に合わせて変更してください。  
 secret_key_ref は RAILS_MASTER_KEY を保存している Secret Manager のシークレット名を指定してください。  
 plan を確認して問題なければ apply します。  
$ terraform plan -var-file="secret.tfvars"
$ terraform apply -var-file="secret.tfvars"
成功すれば Cloud Run サービスが作成されます。
もし権限まわりでエラーになった場合は Rails 7+webpackをCloud Run+Cloud SQL構成で動かす を参考に IAM のロール設定を見直してみてください。
この記事で使用したサンプルコードは下記のリポジトリにあります。
良かったら参考にしてみてください。
以上です。
この記事では Cloud Run+Cloud SQL 構成を Terraform で管理する方法を説明しました。
 
  
 
コメントを送る
コメントはブログオーナーのみ閲覧できます