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 で管理する方法を説明しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます