Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How setup GCP CloudSQL by terraform

Tags:

terraform

I would like to setup GCP CloudSQL by terraform. im reading this doc. (https://www.terraform.io/docs/providers/google/r/sql_database_instance.html)

and I execute "terraform plan" with such code.

resource "google_sql_database_instance" "master" {
    name             = "terraform-master"
    region           = "asia-northeasteast1"
    database_version = "MYSQL_5_6"
    project          = "test-141901"

    settings {
        tier = "db-f1-micro"
        replication_type = "SYNCHRONOUS"
        backup_configuration {
            enabled = true
            start_time = "17:00"
        }
        ip_configuration {
            ipv4_enabled = true
        }
        database_flags {
                name = "slow_query_log"
                value = "on"
                name = "character_set_server"
                value = "utf8mb4"
        }
    }
}

but I can not setup MULTIPLE database_flags

settings.0.database_flags.#:                  "1"
settings.0.database_flags.0.name:             "character_set_server"
settings.0.database_flags.0.value:            "utf8mb4"

How can I setup CloudSQL with multiple database_flags? I can not understand "sublist support" at that document.

like image 569
Jedipunkz Avatar asked Dec 08 '16 07:12

Jedipunkz


People also ask

How do I connect to Cloud SQL?

In the Google Cloud console, go to the Cloud SQL Instances page. To open the Overview page of an instance, click the instance name. Select Connections from the SQL navigation menu. In the Authorized networks section, click Add network and enter the IP address of the machine where the client is installed.

How do I authenticate GCP with Terraform?

Using Terraform Cloud Place your credentials in a Terraform Cloud environment variable: Create an environment variable called GOOGLE_CREDENTIALS in your Terraform Cloud workspace. Remove the newline characters from your JSON key file and then paste the credentials into the environment variable value field.


2 Answers

I want to elaborate on this answer as I needed to generate the database_flags-block based on input. Suppose you have a variable

variable "database-flags" {
  type    = "map"
  default = {
    character_set_server = "utf8mb4"
    slow_query_log = "on"
  }
}

using terraform v0.12.X this can be written as

resource "google_sql_database_instance" "master" {
  name             = "terraform-master"
  region           = "us-central1"
  database_version = "MYSQL_5_6"
  project          = "test-project"

  settings {
    tier             = "db-f1-micro"
    replication_type = "SYNCHRONOUS"

    backup_configuration {
      enabled    = true
      start_time = "17:00"
    }

    ip_configuration {
      ipv4_enabled = true
    }

    dynamic "database_flags" {
      iterator = flag
      for_each = var.database-flags

      content {
        name = flag.key
        value = flag.value
      }
    }
  }
}

Using the above pattern, you can use the database-creating-part of the code as a module and let the consumer decide what flags should be set

like image 106
Carmelid Avatar answered Nov 15 '22 23:11

Carmelid


You should be able to do this by using multiple database_flags blocks:

resource "google_sql_database_instance" "master" {
  name             = "terraform-master"
  region           = "us-central1"
  database_version = "MYSQL_5_6"
  project          = "test-project"

  settings {
    tier             = "db-f1-micro"
    replication_type = "SYNCHRONOUS"

    backup_configuration {
      enabled    = true
      start_time = "17:00"
    }

    ip_configuration {
      ipv4_enabled = true
    }

    database_flags {
      name  = "slow_query_log"
      value = "on"
    }

    database_flags {
      name  = "character_set_server"
      value = "utf8mb4"
    }
  }
}

Here is the output of terraform plan with the above tf:

+ google_sql_database_instance.master
    database_version:                             "MYSQL_5_6"
    ip_address.#:                                 "<computed>"
    name:                                         "terraform-master"
    project:                                      "test-project"
    region:                                       "us-central1"
    self_link:                                    "<computed>"
    settings.#:                                   "1"
    settings.0.backup_configuration.#:            "1"
    settings.0.backup_configuration.0.enabled:    "true"
    settings.0.backup_configuration.0.start_time: "17:00"
    settings.0.database_flags.#:                  "2"
    settings.0.database_flags.0.name:             "slow_query_log"
    settings.0.database_flags.0.value:            "on"
    settings.0.database_flags.1.name:             "character_set_server"
    settings.0.database_flags.1.value:            "utf8mb4"
    settings.0.ip_configuration.#:                "1"
    settings.0.ip_configuration.0.ipv4_enabled:   "true"
    settings.0.replication_type:                  "SYNCHRONOUS"
    settings.0.tier:                              "db-f1-micro"
    settings.0.version:                           "<computed>"
like image 40
Ryan E Avatar answered Nov 15 '22 23:11

Ryan E