From af0b85f88864ca5630ad13ca0da04ce2045774a0 Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Tue, 26 Oct 2021 16:07:54 +0300 Subject: [PATCH 01/14] Add instance and cluster parameter groups configuration and resources to module --- main.tf | 30 ++++++++++++++++++++++++++++++ variables.tf | 24 ++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/main.tf b/main.tf index 60caab1..d7726be 100644 --- a/main.tf +++ b/main.tf @@ -271,3 +271,33 @@ resource "aws_security_group_rule" "cidr_ingress" { cidr_blocks = var.allowed_cidr_blocks security_group_id = local.rds_security_group_id } + +resource "aws_rds_cluster_parameter_group" "cluster_pg" { + count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.parameter_group_settings["pg_name_cluster"] == null ? 0 : 1 + + name = var.parameter_group_settings["pg_name_cluster"] + family = var.parameter_group_settings["family"] + + dynamic "parameter" { + for_each = coalesce(var.parameter_group_settings["parameters_cluster"],{}) + content { + name = parameter.key + value = parameter.value + } + } +} + +resource "aws_db_parameter_group" "instance_pg" { + count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.parameter_group_settings["pg_name_instance"] == null ? 0 : 1 + + name = var.parameter_group_settings["pg_name_instance"] + family = var.parameter_group_settings["family"] + + dynamic "parameter" { + for_each = coalesce(var.parameter_group_settings["parameters_instance"],{}) + content { + name = parameter.key + value = parameter.value + } + } +} diff --git a/variables.tf b/variables.tf index 7698865..5f52276 100644 --- a/variables.tf +++ b/variables.tf @@ -454,3 +454,27 @@ variable "iam_role_max_session_duration" { type = number default = null } + +variable "create_cluster_parameter_group" { + description = "Whether to create a cluster parameter group or not. If specified as false, default parameter group is used." + type = bool + default = true +} + +variable "create_instance_parameter_group" { + description = "Whether to create an instance parameter group or not. If specified as false, default parameter group is used." + type = bool + default = true +} + +variable "parameter_group_settings" { + description = "Map holding all parameter group related settings." + type = object({ + family = string + pg_name_cluster = string + pg_name_instance = string + parameters_cluster = optional(map(string)) + parameters_instance = optional(map(string)) + }) + default = null +} From 77a29f5b4a28d04ce4a121632fd66e378c0a83d7 Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 11:05:44 +0300 Subject: [PATCH 02/14] change family to pg_family --- main.tf | 4 ++-- variables.tf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/main.tf b/main.tf index d7726be..2cf2c05 100644 --- a/main.tf +++ b/main.tf @@ -276,7 +276,7 @@ resource "aws_rds_cluster_parameter_group" "cluster_pg" { count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.parameter_group_settings["pg_name_cluster"] == null ? 0 : 1 name = var.parameter_group_settings["pg_name_cluster"] - family = var.parameter_group_settings["family"] + family = var.parameter_group_settings["pg_family"] dynamic "parameter" { for_each = coalesce(var.parameter_group_settings["parameters_cluster"],{}) @@ -291,7 +291,7 @@ resource "aws_db_parameter_group" "instance_pg" { count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.parameter_group_settings["pg_name_instance"] == null ? 0 : 1 name = var.parameter_group_settings["pg_name_instance"] - family = var.parameter_group_settings["family"] + family = var.parameter_group_settings["pg_family"] dynamic "parameter" { for_each = coalesce(var.parameter_group_settings["parameters_instance"],{}) diff --git a/variables.tf b/variables.tf index 5f52276..816c755 100644 --- a/variables.tf +++ b/variables.tf @@ -470,7 +470,7 @@ variable "create_instance_parameter_group" { variable "parameter_group_settings" { description = "Map holding all parameter group related settings." type = object({ - family = string + pg_family = string pg_name_cluster = string pg_name_instance = string parameters_cluster = optional(map(string)) From d88f4b5ede56a162c6b54f9167c81ab42590f47e Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 11:10:29 +0300 Subject: [PATCH 03/14] recieve a list of param maps --- variables.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/variables.tf b/variables.tf index 816c755..953a811 100644 --- a/variables.tf +++ b/variables.tf @@ -473,8 +473,8 @@ variable "parameter_group_settings" { pg_family = string pg_name_cluster = string pg_name_instance = string - parameters_cluster = optional(map(string)) - parameters_instance = optional(map(string)) + parameters_cluster = optional(list(map(string))) + parameters_instance = optional(list(map(string))) }) default = null } From 8231b4a881f625d3698ffd93e2db8728e978fabf Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 11:15:46 +0300 Subject: [PATCH 04/14] use default pg group name variables --- main.tf | 4 ++-- variables.tf | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/main.tf b/main.tf index 2cf2c05..7b0acab 100644 --- a/main.tf +++ b/main.tf @@ -273,7 +273,7 @@ resource "aws_security_group_rule" "cidr_ingress" { } resource "aws_rds_cluster_parameter_group" "cluster_pg" { - count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.parameter_group_settings["pg_name_cluster"] == null ? 0 : 1 + count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.db_cluster_parameter_group_name == null ? 0 : 1 name = var.parameter_group_settings["pg_name_cluster"] family = var.parameter_group_settings["pg_family"] @@ -288,7 +288,7 @@ resource "aws_rds_cluster_parameter_group" "cluster_pg" { } resource "aws_db_parameter_group" "instance_pg" { - count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.parameter_group_settings["pg_name_instance"] == null ? 0 : 1 + count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.db_parameter_group_name == null ? 0 : 1 name = var.parameter_group_settings["pg_name_instance"] family = var.parameter_group_settings["pg_family"] diff --git a/variables.tf b/variables.tf index 953a811..99c4544 100644 --- a/variables.tf +++ b/variables.tf @@ -471,8 +471,6 @@ variable "parameter_group_settings" { description = "Map holding all parameter group related settings." type = object({ pg_family = string - pg_name_cluster = string - pg_name_instance = string parameters_cluster = optional(list(map(string))) parameters_instance = optional(list(map(string))) }) From 5bfde5534022669537f6269f389d7118243c46d5 Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 11:41:14 +0300 Subject: [PATCH 05/14] add expirmental feature flag --- versions.tf | 1 + 1 file changed, 1 insertion(+) diff --git a/versions.tf b/versions.tf index 4627fe3..9a0e4f1 100644 --- a/versions.tf +++ b/versions.tf @@ -12,4 +12,5 @@ terraform { version = ">= 2.2" } } + experiments = [module_variable_optional_attrs] } From 65d99f297e4df2ec59e680b7752ddf31f7b5f781 Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 11:44:07 +0300 Subject: [PATCH 06/14] make family optional in case default map is to be used --- variables.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/variables.tf b/variables.tf index 99c4544..a3b2eeb 100644 --- a/variables.tf +++ b/variables.tf @@ -470,7 +470,7 @@ variable "create_instance_parameter_group" { variable "parameter_group_settings" { description = "Map holding all parameter group related settings." type = object({ - pg_family = string + pg_family = optional(string) parameters_cluster = optional(list(map(string))) parameters_instance = optional(list(map(string))) }) From 0377415b295542b11d01da3bb691518984bedbcc Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 11:45:50 +0300 Subject: [PATCH 07/14] change coalesce element type --- main.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.tf b/main.tf index 7b0acab..ceaa59e 100644 --- a/main.tf +++ b/main.tf @@ -279,7 +279,7 @@ resource "aws_rds_cluster_parameter_group" "cluster_pg" { family = var.parameter_group_settings["pg_family"] dynamic "parameter" { - for_each = coalesce(var.parameter_group_settings["parameters_cluster"],{}) + for_each = coalesce(var.parameter_group_settings["parameters_cluster"],[]) content { name = parameter.key value = parameter.value @@ -294,7 +294,7 @@ resource "aws_db_parameter_group" "instance_pg" { family = var.parameter_group_settings["pg_family"] dynamic "parameter" { - for_each = coalesce(var.parameter_group_settings["parameters_instance"],{}) + for_each = coalesce(var.parameter_group_settings["parameters_instance"],[]) content { name = parameter.key value = parameter.value From aa79487aa4f35edcf7f01a49e20a0a81633cb785 Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 12:06:19 +0300 Subject: [PATCH 08/14] use resource ID instead of providing name directly in instance/cluster resources --- main.tf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.tf b/main.tf index ceaa59e..b3479b6 100644 --- a/main.tf +++ b/main.tf @@ -75,7 +75,7 @@ resource "aws_rds_cluster" "this" { snapshot_identifier = var.snapshot_identifier storage_encrypted = var.storage_encrypted apply_immediately = var.apply_immediately - db_cluster_parameter_group_name = var.db_cluster_parameter_group_name + db_cluster_parameter_group_name = var.db_cluster_parameter_group_name == null ? null : aws_rds_cluster_parameter_group.cluster_pg[0].id iam_database_authentication_enabled = var.iam_database_authentication_enabled backtrack_window = local.backtrack_window copy_tags_to_snapshot = var.copy_tags_to_snapshot @@ -130,7 +130,7 @@ resource "aws_rds_cluster_instance" "this" { instance_class = try(lookup(var.instances_parameters[count.index], "instance_type"), count.index > 0 ? coalesce(var.instance_type_replica, var.instance_type) : var.instance_type) publicly_accessible = try(lookup(var.instances_parameters[count.index], "publicly_accessible"), var.publicly_accessible) db_subnet_group_name = local.db_subnet_group_name - db_parameter_group_name = var.db_parameter_group_name + db_parameter_group_name = var.db_parameter_group_name == null ? null : aws_db_parameter_group.instance_pg[0].id preferred_maintenance_window = var.preferred_maintenance_window apply_immediately = var.apply_immediately monitoring_role_arn = local.rds_enhanced_monitoring_arn @@ -275,7 +275,7 @@ resource "aws_security_group_rule" "cidr_ingress" { resource "aws_rds_cluster_parameter_group" "cluster_pg" { count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.db_cluster_parameter_group_name == null ? 0 : 1 - name = var.parameter_group_settings["pg_name_cluster"] + name = var.db_cluster_parameter_group_name family = var.parameter_group_settings["pg_family"] dynamic "parameter" { @@ -290,7 +290,7 @@ resource "aws_rds_cluster_parameter_group" "cluster_pg" { resource "aws_db_parameter_group" "instance_pg" { count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.db_parameter_group_name == null ? 0 : 1 - name = var.parameter_group_settings["pg_name_instance"] + name = var.db_parameter_group_name family = var.parameter_group_settings["pg_family"] dynamic "parameter" { From 141f5378c58a582acbf24b88735cfe72d72f89a8 Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 12:45:29 +0300 Subject: [PATCH 09/14] revert adding list to map object --- variables.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/variables.tf b/variables.tf index a3b2eeb..564b0a9 100644 --- a/variables.tf +++ b/variables.tf @@ -471,8 +471,8 @@ variable "parameter_group_settings" { description = "Map holding all parameter group related settings." type = object({ pg_family = optional(string) - parameters_cluster = optional(list(map(string))) - parameters_instance = optional(list(map(string))) + parameters_cluster = optional(map(string)) + parameters_instance = optional(map(string)) }) default = null } From eac6889c5dfbda85a4d97af114f3cc4d37362f32 Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 12:48:19 +0300 Subject: [PATCH 10/14] revert coalesce elements --- main.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.tf b/main.tf index b3479b6..5c7fcd2 100644 --- a/main.tf +++ b/main.tf @@ -279,7 +279,7 @@ resource "aws_rds_cluster_parameter_group" "cluster_pg" { family = var.parameter_group_settings["pg_family"] dynamic "parameter" { - for_each = coalesce(var.parameter_group_settings["parameters_cluster"],[]) + for_each = coalesce(var.parameter_group_settings["parameters_cluster"],{}) content { name = parameter.key value = parameter.value @@ -294,7 +294,7 @@ resource "aws_db_parameter_group" "instance_pg" { family = var.parameter_group_settings["pg_family"] dynamic "parameter" { - for_each = coalesce(var.parameter_group_settings["parameters_instance"],[]) + for_each = coalesce(var.parameter_group_settings["parameters_instance"],{}) content { name = parameter.key value = parameter.value From 053ad9928cf294e6a412299255541f69cac1d6b4 Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 12:58:05 +0300 Subject: [PATCH 11/14] add necessary attributes to PGs to cancel the need of replacement due to description difference --- main.tf | 10 ++++++---- variables.tf | 9 ++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/main.tf b/main.tf index 5c7fcd2..5218640 100644 --- a/main.tf +++ b/main.tf @@ -275,8 +275,9 @@ resource "aws_security_group_rule" "cidr_ingress" { resource "aws_rds_cluster_parameter_group" "cluster_pg" { count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.db_cluster_parameter_group_name == null ? 0 : 1 - name = var.db_cluster_parameter_group_name - family = var.parameter_group_settings["pg_family"] + name = var.db_cluster_parameter_group_name + description = var.parameter_group_settings["pg_description_cluster"] + family = var.parameter_group_settings["pg_family"] dynamic "parameter" { for_each = coalesce(var.parameter_group_settings["parameters_cluster"],{}) @@ -290,8 +291,9 @@ resource "aws_rds_cluster_parameter_group" "cluster_pg" { resource "aws_db_parameter_group" "instance_pg" { count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.db_parameter_group_name == null ? 0 : 1 - name = var.db_parameter_group_name - family = var.parameter_group_settings["pg_family"] + name = var.db_parameter_group_name + description = var.parameter_group_settings["pg_description_instance"] + family = var.parameter_group_settings["pg_family"] dynamic "parameter" { for_each = coalesce(var.parameter_group_settings["parameters_instance"],{}) diff --git a/variables.tf b/variables.tf index 564b0a9..bcbc98a 100644 --- a/variables.tf +++ b/variables.tf @@ -470,9 +470,12 @@ variable "create_instance_parameter_group" { variable "parameter_group_settings" { description = "Map holding all parameter group related settings." type = object({ - pg_family = optional(string) - parameters_cluster = optional(map(string)) - parameters_instance = optional(map(string)) + pg_family = optional(string) + pg_description_cluster = optional(string) + parameters_cluster = optional(map(string)) + pg_description_instance = optional(string) + parameters_instance = optional(map(string)) + }) default = null } From cd9a91075632ef3d8cdeb9389b666a50d84f187e Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Wed, 27 Oct 2021 13:25:55 +0300 Subject: [PATCH 12/14] add functionality to insert apply_method to pgs --- main.tf | 10 ++++++---- variables.tf | 5 ++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/main.tf b/main.tf index 5218640..17a1011 100644 --- a/main.tf +++ b/main.tf @@ -282,8 +282,9 @@ resource "aws_rds_cluster_parameter_group" "cluster_pg" { dynamic "parameter" { for_each = coalesce(var.parameter_group_settings["parameters_cluster"],{}) content { - name = parameter.key - value = parameter.value + name = parameter.key + value = keys(parameter.value)[0] + apply_method = values(parameter.value)[0] } } } @@ -298,8 +299,9 @@ resource "aws_db_parameter_group" "instance_pg" { dynamic "parameter" { for_each = coalesce(var.parameter_group_settings["parameters_instance"],{}) content { - name = parameter.key - value = parameter.value + name = parameter.key + value = keys(parameter.value)[0] + apply_method = values(parameter.value)[0] } } } diff --git a/variables.tf b/variables.tf index bcbc98a..036a1ed 100644 --- a/variables.tf +++ b/variables.tf @@ -472,10 +472,9 @@ variable "parameter_group_settings" { type = object({ pg_family = optional(string) pg_description_cluster = optional(string) - parameters_cluster = optional(map(string)) + parameters_cluster = optional(map(map(string))) pg_description_instance = optional(string) - parameters_instance = optional(map(string)) - + parameters_instance = optional(map(map(string))) }) default = null } From d1f9366756ff375eeee838af5382597b633f838f Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Tue, 2 Nov 2021 15:05:39 +0200 Subject: [PATCH 13/14] change condition to better describe intention --- main.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.tf b/main.tf index 17a1011..8cc7d4f 100644 --- a/main.tf +++ b/main.tf @@ -273,7 +273,7 @@ resource "aws_security_group_rule" "cidr_ingress" { } resource "aws_rds_cluster_parameter_group" "cluster_pg" { - count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.db_cluster_parameter_group_name == null ? 0 : 1 + count = var.create_cluster == false || var.parameter_group_settings == null || var.db_cluster_parameter_group_name == null ? 0 : 1 name = var.db_cluster_parameter_group_name description = var.parameter_group_settings["pg_description_cluster"] @@ -290,7 +290,7 @@ resource "aws_rds_cluster_parameter_group" "cluster_pg" { } resource "aws_db_parameter_group" "instance_pg" { - count = var.create_cluster && var.parameter_group_settings == null ? 0 : var.db_parameter_group_name == null ? 0 : 1 + count = var.create_cluster == false || var.parameter_group_settings == null || var.db_parameter_group_name == null ? 0 : 1 name = var.db_parameter_group_name description = var.parameter_group_settings["pg_description_instance"] From fc89e726116446501b491862e8997c66a7ffea0a Mon Sep 17 00:00:00 2001 From: Nods2008 Date: Tue, 2 Nov 2021 15:06:14 +0200 Subject: [PATCH 14/14] remove create_cluster_pg variables --- variables.tf | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/variables.tf b/variables.tf index 036a1ed..5bfa9f2 100644 --- a/variables.tf +++ b/variables.tf @@ -455,18 +455,6 @@ variable "iam_role_max_session_duration" { default = null } -variable "create_cluster_parameter_group" { - description = "Whether to create a cluster parameter group or not. If specified as false, default parameter group is used." - type = bool - default = true -} - -variable "create_instance_parameter_group" { - description = "Whether to create an instance parameter group or not. If specified as false, default parameter group is used." - type = bool - default = true -} - variable "parameter_group_settings" { description = "Map holding all parameter group related settings." type = object({