- 概要
- チュートリアル
- まとめ
- エラー
- 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
- 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.
- Error: Error, failed to delete instance because deletion_protection is set to true. Set it to false to proceed with instance deletion
- 参考
概要
Cloud Run から Cloud SQL for MySQL へ アクセスするチュートリアルを Terraform で行う。一部手動でやる。
チュートリアル
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 のアプリを自作コンテナに改造して理解する。
コードは下記にまとめた。
エラー
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
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"
}
コメント