$ more *.tf :::::::::::::: main.tf :::::::::::::: provider "google" { version = "~> 2.13" } provider "google-beta" { version = "~> 2.13" } provider "random" { version = "~> 2.2" } resource "random_id" "name" { byte_length = 2 } resource "google_sql_database_instance" "master" { name = "example-mysql-${random_id.name.hex}" project = var.project region = var.region database_version = var.database_version master_instance_name = var.master_instance_name settings { tier = var.tier activation_policy = var.activation_policy authorized_gae_applications = var.authorized_gae_applications disk_autoresize = var.disk_autoresize dynamic "backup_configuration" { for_each = [var.backup_configuration] content { binary_log_enabled = lookup(backup_configuration.value, "binary_log_enabled", null) enabled = lookup(backup_configuration.value, "enabled", null) start_time = lookup(backup_configuration.value, "start_time", null) } } dynamic "ip_configuration" { for_each = [var.ip_configuration] content { ipv4_enabled = lookup(ip_configuration.value, "ipv4_enabled", true) private_network = lookup(ip_configuration.value, "private_network", null) require_ssl = lookup(ip_configuration.value, "require_ssl", null) dynamic "authorized_networks" { for_each = lookup(ip_configuration.value, "authorized_networks", []) content { expiration_time = lookup(authorized_networks.value, "expiration_time", null) name = lookup(authorized_networks.value, "name", null) value = lookup(authorized_networks.value, "value", null) } } } } dynamic "location_preference" { for_each = [var.location_preference] content { follow_gae_application = lookup(location_preference.value, "follow_gae_application", null) zone = lookup(location_preference.value, "zone", null) } } dynamic "maintenance_window" { for_each = [var.maintenance_window] content { day = lookup(maintenance_window.value, "day", null) hour = lookup(maintenance_window.value, "hour", null) update_track = lookup(maintenance_window.value, "update_track", null) } } disk_size = var.disk_size disk_type = var.disk_type pricing_plan = var.pricing_plan replication_type = var.replication_type availability_type = var.availability_type } dynamic "replica_configuration" { for_each = [var.replica_configuration] content { ca_certificate = lookup(replica_configuration.value, "ca_certificate", null) client_certificate = lookup(replica_configuration.value, "client_certificate", null) client_key = lookup(replica_configuration.value, "client_key", null) connect_retry_interval = lookup(replica_configuration.value, "connect_retry_interval", null) dump_file_path = lookup(replica_configuration.value, "dump_file_path", null) failover_target = lookup(replica_configuration.value, "failover_target", null) master_heartbeat_period = lookup(replica_configuration.value, "master_heartbeat_period", null) password = lookup(replica_configuration.value, "password", null) ssl_cipher = lookup(replica_configuration.value, "ssl_cipher", null) username = lookup(replica_configuration.value, "username", null) verify_server_certificate = lookup(replica_configuration.value, "verify_server_certificate", null) } } timeouts { create = "60m" delete = "2h" } } resource "google_sql_database" "default" { count = var.master_instance_name == "" ? 1 : 0 name = var.db_name project = var.project instance = google_sql_database_instance.master.name charset = var.db_charset collation = var.db_collation } resource "random_id" "user-password" { byte_length = 8 } resource "google_sql_user" "default" { count = var.master_instance_name == "" ? 1 : 0 name = var.user_name project = var.project instance = google_sql_database_instance.master.name host = var.user_host password = var.user_password == "" ? random_id.user-password.hex : var.user_password } :::::::::::::: outputs.tf :::::::::::::: output "instance_name" { description = "The name of the database instance" value = google_sql_database_instance.master.name } output "instance_address" { description = "The IPv4 address of the master database instnace" value = google_sql_database_instance.master.ip_address.0.ip_address } output "instance_address_time_to_retire" { description = "The time the master instance IP address will be retired. RFC 3339 format." value = google_sql_database_instance.master.ip_address.0.time_to_retire } output "self_link" { description = "Self link to the master instance" value = google_sql_database_instance.master.self_link } output "generated_user_password" { description = "The auto generated default user password if no input password was provided" value = random_id.user-password.hex sensitive = true } :::::::::::::: variables.tf :::::::::::::: variable "project" { description = "The project to deploy to, if not set the default provider project is used." default = "" } variable "region" { description = "Region for cloud resources" default = "us-central1" } variable "database_version" { description = "The version of of the database. For example, `MYSQL_5_6` or `POSTGRES_9_6`." default = "MYSQL_5_6" } variable "master_instance_name" { description = "The name of the master instance to replicate" default = "" } variable "tier" { description = "The machine tier (First Generation) or type (Second Generation). See this page for supported tiers and pricing: https://cloud.google.com/sql/pricing" default = "db-f1-micro" } variable "db_name" { description = "Name of the default database to create" default = "default" } variable "db_charset" { description = "The charset for the default database" default = "" } variable "db_collation" { description = "The collation for the default database. Example for MySQL databases: 'utf8_general_ci', and Postgres: 'en_US.UTF8'" default = "" } variable "user_name" { description = "The name of the default user" default = "default" } variable "user_host" { description = "The host for the default user" default = "%" } variable "user_password" { description = "The password for the default user. If not set, a random one will be generated and available in the generated_user_password output variable." default = "" } variable "activation_policy" { description = "This specifies when the instance should be active. Can be either `ALWAYS`, `NEVER` or `ON_DEMAND`." default = "ALWAYS" } variable "authorized_gae_applications" { description = "A list of Google App Engine (GAE) project names that are allowed to access this instance." default = [] } variable "disk_autoresize" { description = "Second Generation only. Configuration to increase storage size automatically." default = true } variable "disk_size" { description = "Second generation only. The size of data disk, in GB. Size of a running instance cannot be reduced but can be increased." default = 10 } variable "disk_type" { description = "Second generation only. The type of data disk: `PD_SSD` or `PD_HDD`." default = "PD_SSD" } variable "pricing_plan" { description = "First generation only. Pricing plan for this instance, can be one of `PER_USE` or `PACKAGE`." default = "PER_USE" } variable "replication_type" { description = "Replication type for this instance, can be one of `ASYNCHRONOUS` or `SYNCHRONOUS`." default = "SYNCHRONOUS" } variable "database_flags" { description = "List of Cloud SQL flags that are applied to the database server" default = [] } variable "backup_configuration" { description = "The backup_configuration settings subblock for the database setings" default = {} } variable "ip_configuration" { description = "The ip_configuration settings subblock" default = {} } variable "location_preference" { description = "The location_preference settings subblock" default = {} } variable "maintenance_window" { description = "The maintenance_window settings subblock" default = {} } variable "replica_configuration" { description = "The optional replica_configuration block for the database instance" default = {} } variable "availability_type" { description = "This specifies whether a PostgreSQL instance should be set up for high availability (REGIONAL) or single zone (ZONAL)." default = "ZONAL" }