Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Support Multi Region Cluster Name argument #12

Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ module "memory_db" {
Examples codified under the [`examples`](https://github.com/terraform-aws-modules/terraform-aws-memory-db/tree/master/examples) are intended to give users references for how to use the module(s) as well as testing/validating changes to the source code of the module. If contributing to the project, please be sure to make any appropriate updates to the relevant examples to allow maintainers to test your changes and to keep the examples up to date for users. Thank you!

- [Complete](https://github.com/terraform-aws-modules/terraform-aws-memory-db/tree/master/examples/complete)
- [Multi Region](https://github.com/terraform-aws-modules/terraform-aws-memory-db/tree/master/examples/multi-region)
- [Valkey](https://github.com/terraform-aws-modules/terraform-aws-memory-db/tree/master/examples/valkey)

<!-- BEGIN_TF_DOCS -->
Expand All @@ -119,13 +120,13 @@ Examples codified under the [`examples`](https://github.com/terraform-aws-module
| Name | Version |
|------|---------|
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.78 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.82 |

## Providers

| Name | Version |
|------|---------|
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 5.78 |
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 5.82 |

## Modules

Expand Down Expand Up @@ -162,6 +163,7 @@ No modules.
| <a name="input_final_snapshot_name"></a> [final\_snapshot\_name](#input\_final\_snapshot\_name) | Name of the final cluster snapshot to be created when this resource is deleted. If omitted, no final snapshot will be made | `string` | `null` | no |
| <a name="input_kms_key_arn"></a> [kms\_key\_arn](#input\_kms\_key\_arn) | ARN of the KMS key used to encrypt the cluster at rest | `string` | `null` | no |
| <a name="input_maintenance_window"></a> [maintenance\_window](#input\_maintenance\_window) | Specifies the weekly time range during which maintenance on the cluster is performed. It is specified as a range in the format `ddd:hh24:mi-ddd:hh24:mi` | `string` | `null` | no |
| <a name="input_multi_region_cluster_name"></a> [multi\_region\_cluster\_name](#input\_multi\_region\_cluster\_name) | The multi region cluster identifier if part of a multi region cluster | `string` | `null` | no |
| <a name="input_name"></a> [name](#input\_name) | Cluster name - also default name used on all resources if more specific resource names are not provided | `string` | `""` | no |
| <a name="input_node_type"></a> [node\_type](#input\_node\_type) | The compute and memory capacity of the nodes in the cluster. See AWS documentation on [supported node types](https://docs.aws.amazon.com/memorydb/latest/devguide/nodes.supportedtypes.html) as well as [vertical scaling](https://docs.aws.amazon.com/memorydb/latest/devguide/cluster-vertical-scaling.html) | `string` | `null` | no |
| <a name="input_num_replicas_per_shard"></a> [num\_replicas\_per\_shard](#input\_num\_replicas\_per\_shard) | The number of replicas to apply to each shard, up to a maximum of 5. Defaults to `1` (i.e. 2 nodes per shard) | `number` | `null` | no |
Expand Down
4 changes: 2 additions & 2 deletions examples/complete/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ Note that this example may create resources which will incur monetary charges on
| Name | Version |
|------|---------|
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.78 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.82 |
| <a name="requirement_random"></a> [random](#requirement\_random) | >= 3.0 |

## Providers

| Name | Version |
|------|---------|
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 5.78 |
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 5.82 |
| <a name="provider_random"></a> [random](#provider\_random) | >= 3.0 |

## Modules
Expand Down
2 changes: 1 addition & 1 deletion examples/complete/versions.tf
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 5.78"
version = ">= 5.82"
}
random = {
source = "hashicorp/random"
Expand Down
67 changes: 67 additions & 0 deletions examples/multi-region/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Multi Region cluster

Configuration in this directory creates:

- AWS Multi-Regional MemoryDB cluster
- AWS MemoryDB cluster
- AWS MemoryDB users
- AWS MemoryDB ACL
- AWS MemoryDB subnet group

<!-- BEGIN_TF_DOCS -->
## Requirements

| Name | Version |
|------|---------|
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.82 |
| <a name="requirement_random"></a> [random](#requirement\_random) | >= 3.0 |

## Providers

| Name | Version |
|------|---------|
| <a name="provider_random"></a> [random](#provider\_random) | >= 3.0 |

## Modules

| Name | Source | Version |
|------|--------|---------|
| <a name="module_memory_db"></a> [memory\_db](#module\_memory\_db) | ../.. | n/a |
| <a name="module_memory_db_disabled"></a> [memory\_db\_disabled](#module\_memory\_db\_disabled) | ../.. | n/a |
| <a name="module_multi_region_cluster"></a> [multi\_region\_cluster](#module\_multi\_region\_cluster) | ../../modules/multi-region-cluster | n/a |
| <a name="module_security_group"></a> [security\_group](#module\_security\_group) | terraform-aws-modules/security-group/aws | ~> 4.0 |
| <a name="module_vpc"></a> [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 5.0 |

## Resources

| Name | Type |
|------|------|
| [random_password.password](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password) | resource |

## Inputs

No inputs.

## Outputs

| Name | Description |
|------|-------------|
| <a name="output_acl_arn"></a> [acl\_arn](#output\_acl\_arn) | The ARN of the ACL |
| <a name="output_acl_id"></a> [acl\_id](#output\_acl\_id) | Name of the ACL |
| <a name="output_acl_minimum_engine_version"></a> [acl\_minimum\_engine\_version](#output\_acl\_minimum\_engine\_version) | The minimum engine version supported by the ACL |
| <a name="output_cluster_arn"></a> [cluster\_arn](#output\_cluster\_arn) | The ARN of the cluster |
| <a name="output_cluster_endpoint_address"></a> [cluster\_endpoint\_address](#output\_cluster\_endpoint\_address) | DNS hostname of the cluster configuration endpoint |
| <a name="output_cluster_endpoint_port"></a> [cluster\_endpoint\_port](#output\_cluster\_endpoint\_port) | Port number that the cluster configuration endpoint is listening on |
| <a name="output_cluster_engine_patch_version"></a> [cluster\_engine\_patch\_version](#output\_cluster\_engine\_patch\_version) | Patch version number of the Redis engine used by the cluster |
| <a name="output_cluster_id"></a> [cluster\_id](#output\_cluster\_id) | Cluster name |
| <a name="output_cluster_shards"></a> [cluster\_shards](#output\_cluster\_shards) | Set of shards in this cluster |
| <a name="output_multi_region_cluster_arn"></a> [multi\_region\_cluster\_arn](#output\_multi\_region\_cluster\_arn) | The ARN of the multi-region cluster |
| <a name="output_multi_region_cluster_name"></a> [multi\_region\_cluster\_name](#output\_multi\_region\_cluster\_name) | The name of the multi-region cluster |
| <a name="output_parameter_group_arn"></a> [parameter\_group\_arn](#output\_parameter\_group\_arn) | The ARN of the parameter group |
| <a name="output_parameter_group_id"></a> [parameter\_group\_id](#output\_parameter\_group\_id) | Name of the parameter group |
| <a name="output_subnet_group_arn"></a> [subnet\_group\_arn](#output\_subnet\_group\_arn) | ARN of the subnet group |
| <a name="output_subnet_group_id"></a> [subnet\_group\_id](#output\_subnet\_group\_id) | Name of the subnet group |
| <a name="output_subnet_group_vpc_id"></a> [subnet\_group\_vpc\_id](#output\_subnet\_group\_vpc\_id) | The VPC in which the subnet group exists |
| <a name="output_users"></a> [users](#output\_users) | Map of attributes for the users created |
<!-- END_TF_DOCS -->
237 changes: 237 additions & 0 deletions examples/multi-region/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
provider "aws" {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lets leave out this example for now as well

region = local.region
}

locals {
region = "us-east-1"
name = "memorydb-ex-${replace(basename(path.cwd), "_", "-")}"

tags = {
Example = local.name
Environment = "dev"
}
}

################################################################################
# Multi Region MemoryDB Module
################################################################################

module "memory_db_disabled" {
source = "../.."

name = "${local.name}-disabled"
create = false
}

module "multi_region_cluster" {
source = "../../modules/multi-region-cluster"

create = true
multi_region_cluster_name_suffix = local.name
tls_enabled = true
engine = "valkey"
engine_version = "7.3"
node_type = "db.r7g.xlarge"
num_shards = 2
}

module "memory_db" {
source = "../.."

# Cluster
name = local.name
description = "Example MemoryDB cluster"

# This makes it part of the multi region cluster
multi_region_cluster_name = module.multi_region_cluster.multi_region_cluster_name

auto_minor_version_upgrade = true
node_type = "db.r7g.xlarge"
num_shards = 2
num_replicas_per_shard = 2

security_group_ids = [module.security_group.security_group_id]
maintenance_window = "sun:23:00-mon:01:30"
snapshot_retention_limit = 7
snapshot_window = "05:00-09:00"

# Users
users = {
admin = {
user_name = "admin-user"
access_string = "on ~* &* +@all"
type = "iam"
tags = { user = "admin" }
}
readonly = {
user_name = "readonly-user"
access_string = "on ~* &* -@all +@read"
passwords = [random_password.password.result]
tags = { user = "readonly" }
}
}

# ACL
create_acl = true
acl_name = "${local.name}-acl"
acl_tags = { acl = "custom" }

# Parameter group
create_parameter_group = false

# Subnet group
subnet_group_name = "${local.name}-subnet-group"
subnet_group_description = "Example MemoryDB subnet group"
subnet_ids = module.vpc.database_subnets
subnet_group_tags = {
subnet_group = "custom"
}

tags = local.tags
}

# Provides example of an additional region cluster that is part of the multi-region cluster
# Note: Deleting a cluster with existing clusters in other regions can take up to several hours
# It places the multi-region clusters into an updating state which is not valid for deletion

#provider "aws" {
# region = "us-west-2"
# alias = "us-west-2"
#}

#module "secondary_memory_db" {
# source = "../.."
#
# # Cluster
# name = "${local.name}-secondary"
# description = "Example MemoryDB cluster"
#
# # This makes it part of the multi region cluster
# multi_region_cluster_name = module.multi_region_cluster.multi_region_cluster_name
#
# auto_minor_version_upgrade = true
# node_type = "db.r7g.xlarge"
# num_shards = 2
# num_replicas_per_shard = 2
#
# security_group_ids = [module.secondary_security_group.security_group_id]
# maintenance_window = "sun:23:00-mon:01:30"
# snapshot_retention_limit = 7
# snapshot_window = "05:00-09:00"
#
# # ACL
# create_acl = true
# acl_name = "${local.name}-acl"
# acl_tags = { acl = "custom" }
#
# # Parameter group
# create_parameter_group = false
#
# # Subnet group
# subnet_group_name = "${local.name}-subnet-group"
# subnet_group_description = "Example MemoryDB subnet group"
# subnet_ids = module.secondary_vpc.database_subnets
# subnet_group_tags = {
# subnet_group = "custom"
# }
#
# tags = local.tags
#
# providers = {
# aws = aws.us-west-2
# }
#}

################################################################################
# Supporting Resources
################################################################################

module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"

name = local.name
cidr = "10.99.0.0/18"

azs = ["${local.region}a", "${local.region}b", "${local.region}d"] # Caution: check which zones are available
private_subnets = ["10.99.0.0/24", "10.99.1.0/24", "10.99.2.0/24"]
database_subnets = ["10.99.3.0/24", "10.99.4.0/24", "10.99.5.0/24"]

create_database_subnet_group = true
enable_nat_gateway = false

manage_default_security_group = true
default_security_group_ingress = []
default_security_group_egress = []

tags = local.tags
}

module "security_group" {
source = "terraform-aws-modules/security-group/aws"
version = "~> 4.0"

name = local.name
description = "Security group for ${local.name}"
vpc_id = module.vpc.vpc_id

ingress_cidr_blocks = module.vpc.private_subnets_cidr_blocks
ingress_rules = ["redis-tcp"]

egress_cidr_blocks = [module.vpc.vpc_cidr_block]
egress_rules = ["all-all"]

tags = local.tags
}

resource "random_password" "password" {
length = 16
special = true
override_special = "_%@"
}

#module "secondary_vpc" {
# source = "terraform-aws-modules/vpc/aws"
# version = "~> 5.0"
#
# name = local.name
# cidr = "10.99.0.0/18"
#
# azs = ["us-west-2a", "us-west-2b", "us-west-2d"] # Caution: check which zones are available
# private_subnets = ["10.99.0.0/24", "10.99.1.0/24", "10.99.2.0/24"]
# database_subnets = ["10.99.3.0/24", "10.99.4.0/24", "10.99.5.0/24"]
#
# create_database_subnet_group = true
# enable_nat_gateway = false
#
# manage_default_security_group = true
# default_security_group_ingress = []
# default_security_group_egress = []
#
# tags = local.tags
#
# providers = {
# aws = aws.us-west-2
# }
#}
#
#module "secondary_security_group" {
# source = "terraform-aws-modules/security-group/aws"
# version = "~> 4.0"
#
# name = local.name
# description = "Security group for ${local.name}"
# vpc_id = module.secondary_vpc.vpc_id
#
# ingress_cidr_blocks = module.secondary_vpc.private_subnets_cidr_blocks
# ingress_rules = ["redis-tcp"]
#
# egress_cidr_blocks = [module.secondary_vpc.vpc_cidr_block]
# egress_rules = ["all-all"]
#
# tags = local.tags
#
# providers = {
# aws = aws.us-west-2
# }
#}
Loading
Loading