google_cloudsql_postgres/main.tf (164 lines of code) (raw):
/**
* # gcp-postgres
* Creates a PostgreSQL instance within GCP using Cloud SQL
*/
# https://www.terraform.io/docs/providers/google/r/sql_database_instance.html
#
# There is no need for failover replicas for regional PostgreSQL database
# as that is provided by default.
# It is possible to create one or more read replicas for regional PostgreSQL
# database. For that see
# https://github.com/terraform-providers/terraform-provider-google/issues/1773#issuecomment-408556558
# for an example.
locals {
default_database_name = "${var.application}-${var.realm}-${var.environment}-${var.instance_version}"
database_name = coalesce(var.custom_database_name, local.default_database_name)
replica_name = coalesce(var.custom_replica_name, "${local.database_name}-replica")
tier = coalesce(var.tier_override, "db-custom-${var.db_cpu}-${var.db_mem_gb * 1024}")
replica_tier = coalesce(var.replica_tier_override, "db-custom-${var.replica_db_cpu}-${var.replica_db_mem_gb * 1024}")
ip_addresses = google_sql_database_instance.primary.ip_address
}
resource "google_sql_database_instance" "primary" {
provider = google
name = local.database_name
project = var.project_id
region = var.region
database_version = var.database_version
settings {
dynamic "password_validation_policy" {
for_each = var.password_validation_policy_enable ? range(1) : []
content {
enable_password_policy = true
min_length = var.password_validation_policy_min_length
complexity = var.password_validation_policy_complexity ? "COMPLEXITY_DEFAULT" : null
reuse_interval = var.password_validation_policy_reuse_interval
disallow_username_substring = var.password_validation_policy_disallow_username_substring
password_change_interval = var.password_validation_policy_password_change_interval
}
}
availability_type = var.availability_type
connector_enforcement = var.connector_enforcement
deletion_protection_enabled = var.deletion_protection_enabled
edition = var.edition
tier = local.tier
backup_configuration {
enabled = true
point_in_time_recovery_enabled = true
location = "us"
backup_retention_settings {
retained_backups = 30
retention_unit = "COUNT"
}
}
dynamic "data_cache_config" {
for_each = var.edition == "ENTERPRISE_PLUS" ? [1] : []
content {
data_cache_enabled = var.data_cache_enabled
}
}
insights_config {
query_insights_enabled = true
query_string_length = 1024
record_application_tags = true
record_client_address = true
}
ip_configuration {
ipv4_enabled = var.enable_public_ip
ssl_mode = var.ip_configuration_ssl_mode
enable_private_path_for_google_cloud_services = var.enable_private_path_for_google_cloud_services
dynamic "authorized_networks" {
for_each = var.authorized_networks
content {
# TF-UPGRADE-TODO: The automatic upgrade tool can't predict
# which keys might be set in maps assigned here, so it has
# produced a comprehensive set here. Consider simplifying
# this after confirming which keys can be set in practice.
expiration_time = lookup(authorized_networks.value, "expiration_time", null)
name = lookup(authorized_networks.value, "name", null)
value = lookup(authorized_networks.value, "value", null)
}
}
private_network = var.network
}
dynamic "database_flags" {
for_each = var.database_flags
content {
name = lookup(database_flags.value, "name", null)
value = lookup(database_flags.value, "value", null)
}
}
maintenance_window {
day = var.maintenance_window_day
hour = var.maintenance_window_hour
update_track = var.maintenance_window_update_track
}
user_labels = {
app_code = var.application
component_code = format("%s-%s", var.application, var.component)
env_code = var.environment
realm = var.realm
}
}
lifecycle {
ignore_changes = [settings.0.backup_configuration.0.point_in_time_recovery_enabled]
}
deletion_protection = var.deletion_protection
}
resource "google_sql_database_instance" "replica" {
count = var.replica_count
name = "${local.replica_name}-${count.index}"
region = coalesce(var.replica_region_override, var.region)
database_version = var.database_version
master_instance_name = google_sql_database_instance.primary.name
settings {
dynamic "password_validation_policy" {
for_each = var.password_validation_policy_enable ? range(1) : []
content {
enable_password_policy = true
min_length = var.password_validation_policy_min_length
complexity = var.password_validation_policy_complexity ? "COMPLEXITY_DEFAULT" : null
reuse_interval = var.password_validation_policy_reuse_interval
disallow_username_substring = var.password_validation_policy_disallow_username_substring
password_change_interval = var.password_validation_policy_password_change_interval
}
}
availability_type = var.replica_availability_type
deletion_protection_enabled = var.deletion_protection_enabled
edition = var.replica_edition
tier = local.replica_tier
dynamic "data_cache_config" {
for_each = var.replica_edition == "ENTERPRISE_PLUS" ? [1] : []
content {
data_cache_enabled = var.replica_data_cache_enabled
}
}
dynamic "database_flags" {
for_each = var.database_flags
content {
# TF-UPGRADE-TODO: The automatic upgrade tool can't predict
# which keys might be set in maps assigned here, so it has
# produced a comprehensive set here. Consider simplifying
# this after confirming which keys can be set in practice.
name = lookup(database_flags.value, "name", null)
value = lookup(database_flags.value, "value", null)
}
}
dynamic "insights_config" {
for_each = var.enable_insights_config_on_replica ? range(1) : []
content {
query_insights_enabled = true
query_string_length = 1024
record_application_tags = true
record_client_address = true
}
}
ip_configuration {
ipv4_enabled = var.enable_public_ip
private_network = var.network
ssl_mode = var.ip_configuration_ssl_mode
enable_private_path_for_google_cloud_services = var.enable_private_path_for_google_cloud_services
dynamic "authorized_networks" {
for_each = var.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)
}
}
}
user_labels = {
app_code = var.application
component_code = format("%s-%s", var.application, var.component)
env_code = var.environment
realm = var.realm
}
}
lifecycle {
ignore_changes = [settings.0.backup_configuration.0.point_in_time_recovery_enabled]
}
deletion_protection = var.deletion_protection
}