Skip to content

Commit 45d7bf7

Browse files
huzaifa-binafzalantonbabenkoNods2008haytham-salhihussein-mimi
authored
feat: Support feature to create parameter group for aws-rds-aurora cluster and instances (#307)
Co-authored-by: Anton Babenko <[email protected]> Co-authored-by: Nods2008 <[email protected]> Co-authored-by: Haytham Salhi <[email protected]> Co-authored-by: husseinmimi <[email protected]> Co-authored-by: Haytham Salhi <[email protected]> Co-authored-by: Bryant Biggs <[email protected]>
1 parent 2237e70 commit 45d7bf7

File tree

15 files changed

+541
-243
lines changed

15 files changed

+541
-243
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
22
- repo: https://github.com/antonbabenko/pre-commit-terraform
3-
rev: v1.72.1
3+
rev: v1.74.1
44
hooks:
55
- id: terraform_fmt
66
- id: terraform_validate

README.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,12 +243,14 @@ No modules.
243243
|------|------|
244244
| [aws_appautoscaling_policy.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/appautoscaling_policy) | resource |
245245
| [aws_appautoscaling_target.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/appautoscaling_target) | resource |
246+
| [aws_db_parameter_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_parameter_group) | resource |
246247
| [aws_db_subnet_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_subnet_group) | resource |
247248
| [aws_iam_role.rds_enhanced_monitoring](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
248249
| [aws_iam_role_policy_attachment.rds_enhanced_monitoring](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |
249250
| [aws_rds_cluster.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster) | resource |
250251
| [aws_rds_cluster_endpoint.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster_endpoint) | resource |
251252
| [aws_rds_cluster_instance.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster_instance) | resource |
253+
| [aws_rds_cluster_parameter_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster_parameter_group) | resource |
252254
| [aws_rds_cluster_role_association.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster_role_association) | resource |
253255
| [aws_security_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource |
254256
| [aws_security_group_rule.cidr_ingress](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group_rule) | resource |
@@ -271,6 +273,7 @@ No modules.
271273
| <a name="input_autoscaling_enabled"></a> [autoscaling\_enabled](#input\_autoscaling\_enabled) | Determines whether autoscaling of the cluster read replicas is enabled | `bool` | `false` | no |
272274
| <a name="input_autoscaling_max_capacity"></a> [autoscaling\_max\_capacity](#input\_autoscaling\_max\_capacity) | Maximum number of read replicas permitted when autoscaling is enabled | `number` | `2` | no |
273275
| <a name="input_autoscaling_min_capacity"></a> [autoscaling\_min\_capacity](#input\_autoscaling\_min\_capacity) | Minimum number of read replicas permitted when autoscaling is enabled | `number` | `0` | no |
276+
| <a name="input_autoscaling_policy_name"></a> [autoscaling\_policy\_name](#input\_autoscaling\_policy\_name) | Autoscaling policy name | `string` | `"target-metric"` | no |
274277
| <a name="input_autoscaling_scale_in_cooldown"></a> [autoscaling\_scale\_in\_cooldown](#input\_autoscaling\_scale\_in\_cooldown) | Cooldown in seconds before allowing further scaling operations after a scale in | `number` | `300` | no |
275278
| <a name="input_autoscaling_scale_out_cooldown"></a> [autoscaling\_scale\_out\_cooldown](#input\_autoscaling\_scale\_out\_cooldown) | Cooldown in seconds before allowing further scaling operations after a scale out | `number` | `300` | no |
276279
| <a name="input_autoscaling_target_connections"></a> [autoscaling\_target\_connections](#input\_autoscaling\_target\_connections) | Average number of connections threshold which will initiate autoscaling. Default value is 70% of db.r4/r5/r6g.large's default max\_connections | `number` | `700` | no |
@@ -282,14 +285,24 @@ No modules.
282285
| <a name="input_cluster_timeouts"></a> [cluster\_timeouts](#input\_cluster\_timeouts) | Create, update, and delete timeout configurations for the cluster | `map(string)` | `{}` | no |
283286
| <a name="input_copy_tags_to_snapshot"></a> [copy\_tags\_to\_snapshot](#input\_copy\_tags\_to\_snapshot) | Copy all Cluster `tags` to snapshots | `bool` | `null` | no |
284287
| <a name="input_create_cluster"></a> [create\_cluster](#input\_create\_cluster) | Whether cluster should be created (affects nearly all resources) | `bool` | `true` | no |
288+
| <a name="input_create_db_cluster_parameter_group"></a> [create\_db\_cluster\_parameter\_group](#input\_create\_db\_cluster\_parameter\_group) | Determines whether a cluster parameter should be created or use existing | `bool` | `false` | no |
289+
| <a name="input_create_db_parameter_group"></a> [create\_db\_parameter\_group](#input\_create\_db\_parameter\_group) | Determines whether a DB parameter should be created or use existing | `bool` | `false` | no |
285290
| <a name="input_create_db_subnet_group"></a> [create\_db\_subnet\_group](#input\_create\_db\_subnet\_group) | Determines whether to create the database subnet group or use existing | `bool` | `true` | no |
286291
| <a name="input_create_monitoring_role"></a> [create\_monitoring\_role](#input\_create\_monitoring\_role) | Determines whether to create the IAM role for RDS enhanced monitoring | `bool` | `true` | no |
287292
| <a name="input_create_random_password"></a> [create\_random\_password](#input\_create\_random\_password) | Determines whether to create random password for RDS primary cluster | `bool` | `true` | no |
288293
| <a name="input_create_security_group"></a> [create\_security\_group](#input\_create\_security\_group) | Determines whether to create security group for RDS cluster | `bool` | `true` | no |
289294
| <a name="input_database_name"></a> [database\_name](#input\_database\_name) | Name for an automatically created database on cluster creation | `string` | `null` | no |
290295
| <a name="input_db_cluster_db_instance_parameter_group_name"></a> [db\_cluster\_db\_instance\_parameter\_group\_name](#input\_db\_cluster\_db\_instance\_parameter\_group\_name) | Instance parameter group to associate with all instances of the DB cluster. The `db_cluster_db_instance_parameter_group_name` is only valid in combination with `allow_major_version_upgrade` | `string` | `null` | no |
291-
| <a name="input_db_cluster_parameter_group_name"></a> [db\_cluster\_parameter\_group\_name](#input\_db\_cluster\_parameter\_group\_name) | A cluster parameter group to associate with the cluster | `string` | `null` | no |
292-
| <a name="input_db_parameter_group_name"></a> [db\_parameter\_group\_name](#input\_db\_parameter\_group\_name) | The name of the DB parameter group to associate with instances | `string` | `null` | no |
296+
| <a name="input_db_cluster_parameter_group_description"></a> [db\_cluster\_parameter\_group\_description](#input\_db\_cluster\_parameter\_group\_description) | The description of the DB cluster parameter group. Defaults to "Managed by Terraform" | `string` | `null` | no |
297+
| <a name="input_db_cluster_parameter_group_family"></a> [db\_cluster\_parameter\_group\_family](#input\_db\_cluster\_parameter\_group\_family) | The family of the DB cluster parameter group | `string` | `""` | no |
298+
| <a name="input_db_cluster_parameter_group_name"></a> [db\_cluster\_parameter\_group\_name](#input\_db\_cluster\_parameter\_group\_name) | The name of the DB cluster parameter group | `string` | `""` | no |
299+
| <a name="input_db_cluster_parameter_group_parameters"></a> [db\_cluster\_parameter\_group\_parameters](#input\_db\_cluster\_parameter\_group\_parameters) | A list of DB cluster parameters to apply. Note that parameters may differ from a family to an other | `list(map(string))` | `[]` | no |
300+
| <a name="input_db_cluster_parameter_group_use_name_prefix"></a> [db\_cluster\_parameter\_group\_use\_name\_prefix](#input\_db\_cluster\_parameter\_group\_use\_name\_prefix) | Determines whether the DB cluster parameter group name is used as a prefix | `bool` | `true` | no |
301+
| <a name="input_db_parameter_group_description"></a> [db\_parameter\_group\_description](#input\_db\_parameter\_group\_description) | The description of the DB parameter group. Defaults to "Managed by Terraform" | `string` | `null` | no |
302+
| <a name="input_db_parameter_group_family"></a> [db\_parameter\_group\_family](#input\_db\_parameter\_group\_family) | The family of the DB parameter group | `string` | `""` | no |
303+
| <a name="input_db_parameter_group_name"></a> [db\_parameter\_group\_name](#input\_db\_parameter\_group\_name) | The name of the DB parameter group | `string` | `""` | no |
304+
| <a name="input_db_parameter_group_parameters"></a> [db\_parameter\_group\_parameters](#input\_db\_parameter\_group\_parameters) | A list of DB parameters to apply. Note that parameters may differ from a family to an other | `list(map(string))` | `[]` | no |
305+
| <a name="input_db_parameter_group_use_name_prefix"></a> [db\_parameter\_group\_use\_name\_prefix](#input\_db\_parameter\_group\_use\_name\_prefix) | Determines whether the DB parameter group name is used as a prefix | `bool` | `true` | no |
293306
| <a name="input_db_subnet_group_name"></a> [db\_subnet\_group\_name](#input\_db\_subnet\_group\_name) | The name of the subnet group name (existing or created) | `string` | `""` | no |
294307
| <a name="input_deletion_protection"></a> [deletion\_protection](#input\_deletion\_protection) | If the DB instance should have deletion protection enabled. The database can't be deleted when this value is set to `true`. The default is `false` | `bool` | `null` | no |
295308
| <a name="input_enable_global_write_forwarding"></a> [enable\_global\_write\_forwarding](#input\_enable\_global\_write\_forwarding) | Whether cluster should forward writes to an associated global cluster. Applied to secondary clusters to enable them to forward writes to an `aws_rds_global_cluster`'s primary cluster | `bool` | `null` | no |
@@ -369,6 +382,10 @@ No modules.
369382
| <a name="output_cluster_reader_endpoint"></a> [cluster\_reader\_endpoint](#output\_cluster\_reader\_endpoint) | A read-only endpoint for the cluster, automatically load-balanced across replicas |
370383
| <a name="output_cluster_resource_id"></a> [cluster\_resource\_id](#output\_cluster\_resource\_id) | The RDS Cluster Resource ID |
371384
| <a name="output_cluster_role_associations"></a> [cluster\_role\_associations](#output\_cluster\_role\_associations) | A map of IAM roles associated with the cluster and their attributes |
385+
| <a name="output_db_cluster_parameter_group_arn"></a> [db\_cluster\_parameter\_group\_arn](#output\_db\_cluster\_parameter\_group\_arn) | The ARN of the DB cluster parameter group created |
386+
| <a name="output_db_cluster_parameter_group_id"></a> [db\_cluster\_parameter\_group\_id](#output\_db\_cluster\_parameter\_group\_id) | The ID of the DB cluster parameter group created |
387+
| <a name="output_db_parameter_group_arn"></a> [db\_parameter\_group\_arn](#output\_db\_parameter\_group\_arn) | The ARN of the DB parameter group created |
388+
| <a name="output_db_parameter_group_id"></a> [db\_parameter\_group\_id](#output\_db\_parameter\_group\_id) | The ID of the DB parameter group created |
372389
| <a name="output_db_subnet_group_name"></a> [db\_subnet\_group\_name](#output\_db\_subnet\_group\_name) | The db subnet group name |
373390
| <a name="output_enhanced_monitoring_iam_role_arn"></a> [enhanced\_monitoring\_iam\_role\_arn](#output\_enhanced\_monitoring\_iam\_role\_arn) | The Amazon Resource Name (ARN) specifying the enhanced monitoring role |
374391
| <a name="output_enhanced_monitoring_iam_role_name"></a> [enhanced\_monitoring\_iam\_role\_name](#output\_enhanced\_monitoring\_iam\_role\_name) | The name of the enhanced monitoring role |

examples/autoscaling/main.tf

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,13 @@ provider "aws" {
55
locals {
66
name = "example-${replace(basename(path.cwd), "_", "-")}"
77
region = "eu-west-1"
8+
89
tags = {
910
Owner = "user"
1011
Environment = "dev"
1112
}
1213
}
1314

14-
################################################################################
15-
# Supporting Resources
16-
################################################################################
17-
18-
module "vpc" {
19-
source = "terraform-aws-modules/vpc/aws"
20-
version = "~> 3.0"
21-
22-
name = local.name
23-
cidr = "10.99.0.0/18"
24-
25-
azs = ["${local.region}a", "${local.region}b", "${local.region}c"]
26-
public_subnets = ["10.99.0.0/24", "10.99.1.0/24", "10.99.2.0/24"]
27-
private_subnets = ["10.99.3.0/24", "10.99.4.0/24", "10.99.5.0/24"]
28-
database_subnets = ["10.99.7.0/24", "10.99.8.0/24", "10.99.9.0/24"]
29-
30-
tags = local.tags
31-
}
32-
3315
################################################################################
3416
# RDS Aurora Module
3517
################################################################################
@@ -89,3 +71,22 @@ module "disabled_aurora" {
8971

9072
create_cluster = false
9173
}
74+
75+
################################################################################
76+
# Supporting Resources
77+
################################################################################
78+
79+
module "vpc" {
80+
source = "terraform-aws-modules/vpc/aws"
81+
version = "~> 3.0"
82+
83+
name = local.name
84+
cidr = "10.99.0.0/18"
85+
86+
azs = ["${local.region}a", "${local.region}b", "${local.region}c"]
87+
public_subnets = ["10.99.0.0/24", "10.99.1.0/24", "10.99.2.0/24"]
88+
private_subnets = ["10.99.3.0/24", "10.99.4.0/24", "10.99.5.0/24"]
89+
database_subnets = ["10.99.7.0/24", "10.99.8.0/24", "10.99.9.0/24"]
90+
91+
tags = local.tags
92+
}

examples/global_cluster/main.tf

Lines changed: 68 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ provider "aws" {
99

1010
locals {
1111
name = "example-${replace(basename(path.cwd), "_", "-")}"
12+
1213
primary = {
1314
region = "eu-west-1"
1415
cidr_prefix = "10.99"
@@ -17,6 +18,7 @@ locals {
1718
region = "us-east-1"
1819
cidr_prefix = "10.98"
1920
}
21+
2022
tags = {
2123
Owner = "user"
2224
Environment = "dev"
@@ -25,6 +27,72 @@ locals {
2527

2628
data "aws_caller_identity" "current" {}
2729

30+
################################################################################
31+
# RDS Aurora Module
32+
################################################################################
33+
34+
resource "aws_rds_global_cluster" "this" {
35+
global_cluster_identifier = local.name
36+
engine = "aurora-postgresql"
37+
engine_version = "11.12"
38+
database_name = "example_db"
39+
storage_encrypted = true
40+
}
41+
42+
module "aurora_primary" {
43+
source = "../../"
44+
45+
name = local.name
46+
database_name = aws_rds_global_cluster.this.database_name
47+
engine = aws_rds_global_cluster.this.engine
48+
engine_version = aws_rds_global_cluster.this.engine_version
49+
global_cluster_identifier = aws_rds_global_cluster.this.id
50+
instance_class = "db.r6g.large"
51+
instances = { for i in range(2) : i => {} }
52+
kms_key_id = aws_kms_key.primary.arn
53+
54+
vpc_id = module.primary_vpc.vpc_id
55+
db_subnet_group_name = module.primary_vpc.database_subnet_group_name
56+
create_db_subnet_group = false
57+
create_security_group = true
58+
allowed_cidr_blocks = module.primary_vpc.private_subnets_cidr_blocks
59+
60+
skip_final_snapshot = true
61+
62+
tags = local.tags
63+
}
64+
65+
module "aurora_secondary" {
66+
source = "../../"
67+
68+
providers = { aws = aws.secondary }
69+
70+
is_primary_cluster = false
71+
72+
name = local.name
73+
engine = aws_rds_global_cluster.this.engine
74+
engine_version = aws_rds_global_cluster.this.engine_version
75+
global_cluster_identifier = aws_rds_global_cluster.this.id
76+
source_region = local.primary.region
77+
instance_class = "db.r6g.large"
78+
instances = { for i in range(2) : i => {} }
79+
kms_key_id = aws_kms_key.secondary.arn
80+
81+
vpc_id = module.secondary_vpc.vpc_id
82+
db_subnet_group_name = module.secondary_vpc.database_subnet_group_name
83+
create_db_subnet_group = false
84+
create_security_group = true
85+
allowed_cidr_blocks = module.secondary_vpc.private_subnets_cidr_blocks
86+
87+
skip_final_snapshot = true
88+
89+
depends_on = [
90+
module.aurora_primary
91+
]
92+
93+
tags = local.tags
94+
}
95+
2896
################################################################################
2997
# Supporting Resources
3098
################################################################################
@@ -108,69 +176,3 @@ resource "aws_kms_key" "secondary" {
108176
policy = data.aws_iam_policy_document.rds.json
109177
tags = local.tags
110178
}
111-
112-
################################################################################
113-
# RDS Aurora Module
114-
################################################################################
115-
116-
resource "aws_rds_global_cluster" "this" {
117-
global_cluster_identifier = local.name
118-
engine = "aurora-postgresql"
119-
engine_version = "11.12"
120-
database_name = "example_db"
121-
storage_encrypted = true
122-
}
123-
124-
module "aurora_primary" {
125-
source = "../../"
126-
127-
name = local.name
128-
database_name = aws_rds_global_cluster.this.database_name
129-
engine = aws_rds_global_cluster.this.engine
130-
engine_version = aws_rds_global_cluster.this.engine_version
131-
global_cluster_identifier = aws_rds_global_cluster.this.id
132-
instance_class = "db.r6g.large"
133-
instances = { for i in range(2) : i => {} }
134-
kms_key_id = aws_kms_key.primary.arn
135-
136-
vpc_id = module.primary_vpc.vpc_id
137-
db_subnet_group_name = module.primary_vpc.database_subnet_group_name
138-
create_db_subnet_group = false
139-
create_security_group = true
140-
allowed_cidr_blocks = module.primary_vpc.private_subnets_cidr_blocks
141-
142-
skip_final_snapshot = true
143-
144-
tags = local.tags
145-
}
146-
147-
module "aurora_secondary" {
148-
source = "../../"
149-
150-
providers = { aws = aws.secondary }
151-
152-
is_primary_cluster = false
153-
154-
name = local.name
155-
engine = aws_rds_global_cluster.this.engine
156-
engine_version = aws_rds_global_cluster.this.engine_version
157-
global_cluster_identifier = aws_rds_global_cluster.this.id
158-
source_region = local.primary.region
159-
instance_class = "db.r6g.large"
160-
instances = { for i in range(2) : i => {} }
161-
kms_key_id = aws_kms_key.secondary.arn
162-
163-
vpc_id = module.secondary_vpc.vpc_id
164-
db_subnet_group_name = module.secondary_vpc.database_subnet_group_name
165-
create_db_subnet_group = false
166-
create_security_group = true
167-
allowed_cidr_blocks = module.secondary_vpc.private_subnets_cidr_blocks
168-
169-
skip_final_snapshot = true
170-
171-
depends_on = [
172-
module.aurora_primary
173-
]
174-
175-
tags = local.tags
176-
}

0 commit comments

Comments
 (0)