Terraform で Cloud Run から Cloud SQL for MySQL へアクセス

概要

Cloud Run から Cloud SQL for MySQL へ アクセスするチュートリアルを Terraform で行う。一部手動でやる。

クイックスタート: Cloud Run から Cloud SQL for MySQL に接続する  |  Google Cloud

チュートリアル

Cloud SQL Admin API 有効化

以下から有効にする。

Terraform 準備

terraform init まで行っておく。

サービスアカウントへ権限追加(手動)

以下のコマンドでサービスアカウント一覧を表示し、Compute Engine default service account の EMAIL をメモ。

$ gcloud iam service-accounts list --project=XXXX
DISPLAY NAME                            EMAIL                                                  DISABLED
Compute Engine default service account  [email protected]     False

このサービスアカウントに cloudsql.client のロールを追加する。

gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
  --member="serviceAccount:SERVICE_ACCOUNT_EMAIL" \
  --role="roles/cloudsql.client"

イメージをリモートリポジトリへアップ(手動)

GCP 公式より CloudSQL の Go サンプルアプリをダウンロード。

git clone https://github.com/GoogleCloudPlatform/golang-samples.git

該当の Dockerfile がある階層まで移動。

cd golang-samples/cloudsql/mysql/database-sql

ビルド。

gcloud builds submit --tag gcr.io/YOUR_PROJECT_ID/run-sql --project=YOUR_PROJECT_ID

Container Registory コンソールに Image が作成された。

Cloud SQL インスタンス作成 ( Terraform )

パブリック IP を持った Cloud SQL for MySQL を最小 ( db-f1-micro ) で作成する。

  • インスタンス名 : quickstart-instance (cloudsqlと一緒)
  • DB 名 : quickstart_db
  • User 名 : quickstart-user
  • Password : testtest
resource "google_sql_database_instance" "instance" {
  name             = "quickstart-instance"
  region           = var.region
  database_version = "MYSQL_8_0"

  settings {
    tier = "db-f1-micro"
  }

  # テスト用なので削除できるように
  deletion_protection = "false"
}

resource "google_sql_database" "database" {
  name     = "quickstart_db"
  instance = google_sql_database_instance.instance.name
}

resource "google_sql_user" "users" {
  name     = "quickstart-user"
  instance = google_sql_database_instance.instance.name
  host     = "%"
  password = "testtest"
}

Cloud Run インスタンス作成 ( Terraform )

Cloud SQL へアクセスできる Cloud Run を作成する。

  • インスタンス名 : quickstart-instance (cloudsqlと一緒)
  • image は上記で作成した Container Registory を指定
  • env (環境変数) で DB へのアクセス情報を渡す
  • URL を確認したいため noauth
locals {
  cloudsql_name = "quickstart-instance"
}

resource "google_cloud_run_service" "default" {
  name     = local.cloudsql_name
  location = var.region

  template {
    spec {
      containers {
        image = "gcr.io/${var.project}/run-sql"
        env {
          name  = "INSTANCE_UNIX_SOCKET"
          value = "/cloudsql/${var.project}:${var.region}:${local.cloudsql_name}"
        }
        env {
          name  = "DB_NAME"
          value = google_sql_database.database.name
        }
        env {
          name  = "DB_USER"
          value = google_sql_user.users.name
        }
        env {
          name  = "DB_PASS"
          value = google_sql_user.users.password
        }
      }
    }

    metadata {
      annotations = {
        "autoscaling.knative.dev/maxScale"      = "1000"
        "run.googleapis.com/cloudsql-instances" = google_sql_database_instance.instance.connection_name
        "run.googleapis.com/client-name"        = "terraform"
      }
    }
  }
  autogenerate_revision_name = true
}

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.default.location
  project  = google_cloud_run_service.default.project
  service  = google_cloud_run_service.default.name

  policy_data = data.google_iam_policy.noauth.policy_data
}

デプロイ・確認

デプロイする。CloudSQLの構築は時間がかかる。

terraform apply

作成完了後、コンソールから CloudSQL の設定を確認できる。
今回は最小で作成された。

Cloud Run には CloudSQL の接続設定ができる。
PROJECT-ID:REGION:INSTANCE-ID 

Cloud Run の発行した URL にアクセスすると、以下の画面が表示された。
サンプルアプリが動いたことを確認。

後片付け

忘れないように削除。

terraform destory

Image はコンソールから手動で削除する。

まとめ

Cloud Run から Cloud SQL へアクセスするための流れを試した。

今後、動いている Go のアプリを自作コンテナに改造して理解する。

コードは下記にまとめた。

GitHub - runble1/test_cloudrun_sql
Contribute to runble1/test_cloudrun_sql development by creating an account on GitHub.

エラー

Error, failed to create instance cloudrun-sql: googleapi: Error 409: The Cloud SQL instance already exists. When you delete an instance, you can’t reuse the name of the deleted instance until one week from the deletion date., instanceAlreadyExists

CloudSQL インスタンスを削除すると、削除日から1週間が経過するまで、削除されたインスタンスの名前を再利用できまないとのこと。

ERROR: (gcloud.sql.connect) Mysql client not found. Please install a mysql client and make sure it is in PATH to be able to connect to the database instance.

ローカル PC から CloudSQL へログインする際にエラー。MySQL クライアント入れる必要があるっぽい。

入れるのめんどいので CloudShell から行った。

gcloud sql connect cloudrun-sql2 --user=root
ローカルマシンまたは Compute Engine からデータベース クライアントを使用して接続する  |  Cloud SQL for MySQL  |  Google Cloud

Error: Error, failed to delete instance because deletion_protection is set to true. Set it to false to proceed with instance deletion

terraform destroy で Cloud SQL を削除する際にエラー。

deletion_protection を指定しない場合、デフォルトは true になっている。

false を明示する。

resource "google_sql_database_instance" "instance" {
  name             = "cloudrun-sql2"
  region           = var.region
  database_version = "MYSQL_8_0"
  
  settings {
    tier = "db-f1-micro"
  }

  # テスト用なので削除できるように
  deletion_protection  = "false"
}

参考

クイックスタート: Cloud Run から Cloud SQL for MySQL に接続する  |  Google Cloud
Terraform Registry
Google Cloud SQL for MySQL インスタンス作成 – Terraform –
はじめに Google Cloud Platform(GCP) Google Cloud SQLのインスタンス…

コメント

タイトルとURLをコピーしました