Tag: MySQL

  • Creating Cloud MySQL instance with Terraform

    Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions.”

    In this post, will show how to use Terraform to mange Google Cloud SQL resources.

    Prerequisites:

    • Google Cloud Platform account
    • Terraform installed on your machine (you can find more info here)

    Introduction

    This article will cover the following:

    • Create a Cloud MySQL instance with a randomised name
    • Use labels to indicate that this is a development environment
    • Set the maintenance window
    • Create a database and a database user
    • Parameterise configurations using input variables in a file
    • Use output variables for display connection name after creating the instance

    Configuration

    Create a directory to store all configuration files. By default Terraform will load all files ending in .tf or .tfvars. In that directory, create a main.tf file with additional resources.

    provider "google" {
      version = "3.10.0"
      credentials = file(var.credentials_file)
    
      project = var.project
      region = var.region
      zone = var.zone
    }
    
    resource "random_id" "db_name_suffix" {
      byte_length = 4
    }
    
    resource "google_sql_database_instance" "mysql" {
      name = "mysql-instance-${random_id.db_name_suffix.hex}"
      database_version = "MYSQL_5_6"
    
      settings{
        tier = "db-f1-micro"
        user_labels = {
          "environment" = "development"
        }
        maintenance_window {
          day  = "1"
          hour = "4"
        }
        backup_configuration {
          enabled = true
          start_time = "04:30"
        }
      }
    }

    Initialize and pull Terraform cloud-specific dependencies:

    terraform init
    

    Apply Terraform:

    terraform apply -var-file="secret.tfvars"
    
    - created a secret.tfvars file that do not version control. The file contains the following:
     project = "[PROJECT_ID]"
     credentials_file = "[NAME].json"
    
    outputs.tf contains:
    output "connection_name" {
      value = google_sql_database_instance.postgres.connection_name
    }
    
    variables.tf:
    variable "project" {
    }
    variable "credentials_file" {
    }
    variable "region" {
      default = "europe-west2"
    }
    variable "zone" {
      default = "urope-west2-c""
    }

    Creating MySQL instance will take a few minutes. After Terraform is done, go to the console to see the instance that has been created or use ‘gcloud sql instances list’.

     Terraform will perform the following actions:
       # google_sql_database.database will be created
       + resource "google_sql_database" "database" {
           + charset   = (known after apply)
           + collation = (known after apply)
           + id        = (known after apply)
           + instance  = (known after apply)
           + name      = "azuri"
           + project   = (known after apply)
           + self_link = (known after apply)
         }
       # google_sql_database_instance.mysql will be created
       + resource "google_sql_database_instance" "mysql" {
           + connection_name               = (known after apply)
           + database_version              = "MYSQL_5_6"
           + first_ip_address              = (known after apply)
           + id                            = (known after apply)
           + ip_address                    = (known after apply)
           + master_instance_name          = (known after apply)
           + name                          = (known after apply)
           + private_ip_address            = (known after apply)
           + project                       = (known after apply)
           + public_ip_address             = (known after apply)
           + region                        = (known after apply)
           + self_link                     = (known after apply)
           + server_ca_cert                = (known after apply)
           + service_account_email_address = (known after apply)
       Enter a value: yes
     random_id.db_name_suffix: Creating...
     random_id.db_name_suffix: Creation complete after 0s [id=q_MscA]
     google_sql_database_instance.mysql: Creating...
     google_sql_database_instance.mysql: Still creating... [10s elapsed]