logo

アルパカログ

Cloud Run+Cloud SQL構成をTerraformで管理する

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 用の 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 インスタンスの作成
ℹ️
データベース名やユーザー名などは Rails 7+webpackをCloud Run+Cloud SQL構成で動かす に沿って設定していきます。

Cloud SQL インスタンスを作成します。データベースとユーザーも作成しておきます。

それぞれに対応する Terraform リソースは下記の通りです。

  • SQL インスタンス: google_sql_database_instance
  • データベース: google_sql_database
  • ユーザー: google_sql_user

これらを main.tf に定義していきます。

データベースのパスワードは main.tf に直接記述するのではなく、別途シークレット用のファイルを作成して planapply のときに渡すようにします。

#
# 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 サービスの作成
ℹ️
Docker イメージはすでに Rails 7+webpackをCloud Run+Cloud SQL構成で動かす を済ませて Registry に push してあるものとします。

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_refRAILS_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 で管理する方法を説明しました。