Jedipunkz
Jedipunkz

Reputation: 131

How setup GCP CloudSQL by 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.

Upvotes: 13

Views: 7764

Answers (2)

Carmelid
Carmelid

Reputation: 228

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

Upvotes: 9

Ryan E
Ryan E

Reputation: 1145

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>"

Upvotes: 13

Related Questions