diff --git a/modules/cloudsql-instance/README.md b/modules/cloudsql-instance/README.md index 92fc189437..9e05b0b384 100644 --- a/modules/cloudsql-instance/README.md +++ b/modules/cloudsql-instance/README.md @@ -146,29 +146,29 @@ module "db" { | name | description | type | required | default | |---|---|:---:|:---:|:---:| -| [database_version](variables.tf#L58) | Database type and version to create. | string | ✓ | | -| [name](variables.tf#L111) | Name of primary instance. | string | ✓ | | -| [network](variables.tf#L116) | VPC self link where the instances will be deployed. Private Service Networking must be enabled and configured in this VPC. | string | ✓ | | -| [project_id](variables.tf#L137) | The ID of the project where this instances will be created. | string | ✓ | | -| [region](variables.tf#L142) | Region of the primary instance. | string | ✓ | | -| [tier](variables.tf#L162) | The machine type to use for the instances. | string | ✓ | | +| [database_version](variables.tf#L61) | Database type and version to create. | string | ✓ | | +| [name](variables.tf#L114) | Name of primary instance. | string | ✓ | | +| [network](variables.tf#L119) | VPC self link where the instances will be deployed. Private Service Networking must be enabled and configured in this VPC. | string | ✓ | | +| [project_id](variables.tf#L140) | The ID of the project where this instances will be created. | string | ✓ | | +| [region](variables.tf#L145) | Region of the primary instance. | string | ✓ | | +| [tier](variables.tf#L165) | The machine type to use for the instances. | string | ✓ | | | [allocated_ip_ranges](variables.tf#L17) | (Optional)The name of the allocated ip range for the private ip CloudSQL instance. For example: \"google-managed-services-default\". If set, the instance ip will be created in the allocated range. The range name must comply with RFC 1035. Specifically, the name must be 1-63 characters long and match the regular expression a-z?. | object({…}) | | {} | | [authorized_networks](variables.tf#L26) | Map of NAME=>CIDR_RANGE to allow to connect to the database(s). | map(string) | | null | | [availability_type](variables.tf#L32) | Availability type for the primary replica. Either `ZONAL` or `REGIONAL`. | string | | "ZONAL" | -| [backup_configuration](variables.tf#L38) | Backup settings for primary instance. Will be automatically enabled if using MySQL with one or more replicas. | object({…}) | | {…} | -| [databases](variables.tf#L63) | Databases to create once the primary instance is created. | list(string) | | null | -| [deletion_protection](variables.tf#L69) | Allow terraform to delete instances. | bool | | false | -| [disk_size](variables.tf#L75) | Disk size in GB. Set to null to enable autoresize. | number | | null | -| [disk_type](variables.tf#L81) | The type of data disk: `PD_SSD` or `PD_HDD`. | string | | "PD_SSD" | -| [encryption_key_name](variables.tf#L87) | The full path to the encryption key used for the CMEK disk encryption of the primary instance. | string | | null | -| [flags](variables.tf#L93) | Map FLAG_NAME=>VALUE for database-specific tuning. | map(string) | | null | -| [ipv4_enabled](variables.tf#L99) | Add a public IP address to database instance. | bool | | false | -| [labels](variables.tf#L105) | Labels to be attached to all instances. | map(string) | | null | -| [postgres_client_certificates](variables.tf#L121) | Map of cert keys connect to the application(s) using public IP. | list(string) | | null | -| [prefix](variables.tf#L127) | Optional prefix used to generate instance names. | string | | null | -| [replicas](variables.tf#L147) | Map of NAME=> {REGION, KMS_KEY} for additional read replicas. Set to null to disable replica creation. | map(object({…})) | | {} | -| [root_password](variables.tf#L156) | Root password of the Cloud SQL instance. Required for MS SQL Server. | string | | null | -| [users](variables.tf#L167) | Map of users to create in the primary instance (and replicated to other replicas) in the format USER=>PASSWORD. For MySQL, anything afterr the first `@` (if persent) will be used as the user's host. Set PASSWORD to null if you want to get an autogenerated password. | map(string) | | null | +| [backup_configuration](variables.tf#L38) | Backup settings for primary instance. Will be automatically enabled if using MySQL with one or more replicas. | object({…}) | | {…} | +| [databases](variables.tf#L66) | Databases to create once the primary instance is created. | list(string) | | null | +| [deletion_protection](variables.tf#L72) | Allow terraform to delete instances. | bool | | false | +| [disk_size](variables.tf#L78) | Disk size in GB. Set to null to enable autoresize. | number | | null | +| [disk_type](variables.tf#L84) | The type of data disk: `PD_SSD` or `PD_HDD`. | string | | "PD_SSD" | +| [encryption_key_name](variables.tf#L90) | The full path to the encryption key used for the CMEK disk encryption of the primary instance. | string | | null | +| [flags](variables.tf#L96) | Map FLAG_NAME=>VALUE for database-specific tuning. | map(string) | | null | +| [ipv4_enabled](variables.tf#L102) | Add a public IP address to database instance. | bool | | false | +| [labels](variables.tf#L108) | Labels to be attached to all instances. | map(string) | | null | +| [postgres_client_certificates](variables.tf#L124) | Map of cert keys connect to the application(s) using public IP. | list(string) | | null | +| [prefix](variables.tf#L130) | Optional prefix used to generate instance names. | string | | null | +| [replicas](variables.tf#L150) | Map of NAME=> {REGION, KMS_KEY} for additional read replicas. Set to null to disable replica creation. | map(object({…})) | | {} | +| [root_password](variables.tf#L159) | Root password of the Cloud SQL instance. Required for MS SQL Server. | string | | null | +| [users](variables.tf#L170) | Map of users to create in the primary instance (and replicated to other replicas) in the format USER=>PASSWORD. For MySQL, anything afterr the first `@` (if persent) will be used as the user's host. Set PASSWORD to null if you want to get an autogenerated password. | map(string) | | null | ## Outputs diff --git a/modules/cloudsql-instance/main.tf b/modules/cloudsql-instance/main.tf index ebfc3c42a6..2419dc0d6d 100644 --- a/modules/cloudsql-instance/main.tf +++ b/modules/cloudsql-instance/main.tf @@ -88,6 +88,7 @@ resource "google_sql_database_instance" "primary" { ) start_time = var.backup_configuration.start_time location = var.backup_configuration.location + point_in_time_recovery_enabled = var.backup_configuration.point_in_time_recovery_enabled transaction_log_retention_days = var.backup_configuration.log_retention_days backup_retention_settings { retained_backups = var.backup_configuration.retention_count diff --git a/modules/cloudsql-instance/variables.tf b/modules/cloudsql-instance/variables.tf index 538fd1fea1..c7c4ef8d01 100644 --- a/modules/cloudsql-instance/variables.tf +++ b/modules/cloudsql-instance/variables.tf @@ -37,21 +37,24 @@ variable "availability_type" { variable "backup_configuration" { description = "Backup settings for primary instance. Will be automatically enabled if using MySQL with one or more replicas." + nullable = false type = object({ - enabled = bool - binary_log_enabled = bool - start_time = string - location = string - log_retention_days = number - retention_count = number + enabled = optional(bool, false) + binary_log_enabled = optional(bool, false) + start_time = optional(string, "23:00") + location = optional(string) + log_retention_days = optional(number, 7) + point_in_time_recovery_enabled = optional(bool) + retention_count = optional(number, 7) }) default = { - enabled = false - binary_log_enabled = false - start_time = "23:00" - location = null - log_retention_days = 7 - retention_count = 7 + enabled = false + binary_log_enabled = false + start_time = "23:00" + location = null + log_retention_days = 7 + point_in_time_recovery_enabled = null + retention_count = 7 } } diff --git a/modules/gke-cluster/README.md b/modules/gke-cluster/README.md index df7f14ca6b..2e09aeb113 100644 --- a/modules/gke-cluster/README.md +++ b/modules/gke-cluster/README.md @@ -97,6 +97,32 @@ module "cluster-autopilot" { } # tftest modules=1 resources=1 inventory=autopilot.yaml ``` + +### Cloud DNS + +This example shows how to [use Cloud DNS as a Kubernetes DNS provider](https://cloud.google.com/kubernetes-engine/docs/how-to/cloud-dns) for GKE Standard clusters. + +```hcl +module "cluster-1" { + source = "./fabric/modules/gke-cluster" + project_id = var.project_id + name = "cluster-1" + location = "europe-west1-b" + vpc_config = { + network = var.vpc.self_link + subnetwork = var.subnet.self_link + secondary_range_names = { pods = "pods", services = "services" } + } + enable_features = { + dns = { + provider = "CLOUD_DNS" + scope = "CLUSTER_SCOPE" + domain = "gke.local" + } + } +} +# tftest modules=1 resources=1 inventory=dns.yaml +``` ## Variables @@ -110,7 +136,7 @@ module "cluster-autopilot" { | [cluster_autoscaling](variables.tf#L17) | Enable and configure limits for Node Auto-Provisioning with Cluster Autoscaler. | object({…}) | | null | | [description](variables.tf#L38) | Cluster description. | string | | null | | [enable_addons](variables.tf#L44) | Addons enabled in the cluster (true means enabled). | object({…}) | | {…} | -| [enable_features](variables.tf#L68) | Enable cluster-level features. Certain features allow configuration. | object({…}) | | {…} | +| [enable_features](variables.tf#L68) | Enable cluster-level features. Certain features allow configuration. | object({…}) | | {…} | | [issue_client_certificate](variables.tf#L107) | Enable issuing client certificate. | bool | | false | | [labels](variables.tf#L113) | Cluster resource labels. | map(string) | | null | | [logging_config](variables.tf#L124) | Logging configuration. | list(string) | | ["SYSTEM_COMPONENTS"] | diff --git a/modules/gke-cluster/main.tf b/modules/gke-cluster/main.tf index 83604c0044..0079dd8d88 100644 --- a/modules/gke-cluster/main.tf +++ b/modules/gke-cluster/main.tf @@ -1,5 +1,5 @@ /** - * Copyright 2022 Google LLC + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -140,7 +140,17 @@ resource "google_container_cluster" "cluster" { dynamic "cluster_autoscaling" { for_each = var.cluster_autoscaling == null ? [] : [""] content { - enabled = true + enabled = var.enable_features.autopilot ? null : true + + dynamic "auto_provisioning_defaults" { + for_each = var.cluster_autoscaling.auto_provisioning_defaults != null ? [""] : [] + content { + boot_disk_kms_key = var.cluster_autoscaling.auto_provisioning_defaults.boot_disk_kms_key + image_type = var.cluster_autoscaling.auto_provisioning_defaults.image_type + oauth_scopes = var.cluster_autoscaling.auto_provisioning_defaults.oauth_scopes + service_account = var.cluster_autoscaling.auto_provisioning_defaults.service_account + } + } dynamic "resource_limits" { for_each = var.cluster_autoscaling.cpu_limits != null ? [""] : [] content { @@ -170,11 +180,11 @@ resource "google_container_cluster" "cluster" { } dynamic "dns_config" { - for_each = var.enable_features.cloud_dns != null ? [""] : [] + for_each = var.enable_features.dns != null ? [""] : [] content { - cluster_dns = enable_features.cloud_dns.cluster_dns - cluster_dns_scope = enable_features.cloud_dns.cluster_dns_scope - cluster_dns_domain = enable_features.cloud_dns.cluster_dns_domain + cluster_dns = var.enable_features.dns.provider + cluster_dns_scope = var.enable_features.dns.scope + cluster_dns_domain = var.enable_features.dns.domain } } diff --git a/modules/gke-cluster/variables.tf b/modules/gke-cluster/variables.tf index ecfa11c93d..a51ff20871 100644 --- a/modules/gke-cluster/variables.tf +++ b/modules/gke-cluster/variables.tf @@ -1,5 +1,5 @@ /** - * Copyright 2022 Google LLC + * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -70,7 +70,7 @@ variable "enable_features" { type = object({ autopilot = optional(bool, false) binary_authorization = optional(bool, false) - cloud_dns = optional(object({ + dns = optional(object({ provider = optional(string) scope = optional(string) domain = optional(string) diff --git a/tests/modules/gke_cluster/examples/dns.yaml b/tests/modules/gke_cluster/examples/dns.yaml new file mode 100644 index 0000000000..53792e051f --- /dev/null +++ b/tests/modules/gke_cluster/examples/dns.yaml @@ -0,0 +1,28 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.cluster-1.google_container_cluster.cluster: + dns_config: + - cluster_dns: CLOUD_DNS + cluster_dns_domain: gke.local + cluster_dns_scope: CLUSTER_SCOPE + ip_allocation_policy: + - cluster_secondary_range_name: pods + services_secondary_range_name: services + location: europe-west1-b + name: cluster-1 + +counts: + google_container_cluster: 1