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