From c032bec8cd5b8695a42c6bbb650d935d6930f6c8 Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 5 Nov 2025 13:04:16 -0600 Subject: [PATCH 1/2] chore: Update examples to use latest versions and practices --- README.md | 5 ++-- examples/complete/README.md | 3 ++- examples/complete/main.tf | 49 +++++++++++++++++++++++------------- examples/valkey/README.md | 3 ++- examples/valkey/main.tf | 50 +++++++++++++++++++++++-------------- main.tf | 15 +++++++---- outputs.tf | 28 ++++++++++----------- variables.tf | 3 ++- 8 files changed, 95 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index d75571e..8048969 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,8 @@ module "memory_db" { name = "example" description = "Example MemoryDB cluster" - engine_version = "6.2" + engine = "valkey" + engine_version = "7.3" auto_minor_version_upgrade = true node_type = "db.t4g.small" num_shards = 2 @@ -157,7 +158,7 @@ No modules. | [create\_users](#input\_create\_users) | Determines whether to create users specified | `bool` | `true` | no | | [data\_tiering](#input\_data\_tiering) | Must be set to `true` when using a data tiering node type | `bool` | `null` | no | | [description](#input\_description) | Description for the cluster. Defaults to `Managed by Terraform` | `string` | `null` | no | -| [engine](#input\_engine) | The engine that will run on your nodes. Supported values are redis and valkey | `string` | `null` | no | +| [engine](#input\_engine) | The engine that will run on your nodes. Supported values are `redis` and `valkey` | `string` | `null` | no | | [engine\_version](#input\_engine\_version) | Version number of the engine to be used for the cluster. Downgrades are not supported | `string` | `null` | no | | [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 | | [kms\_key\_arn](#input\_kms\_key\_arn) | ARN of the KMS key used to encrypt the cluster at rest | `string` | `null` | no | diff --git a/examples/complete/README.md b/examples/complete/README.md index a048f11..deee909 100644 --- a/examples/complete/README.md +++ b/examples/complete/README.md @@ -42,7 +42,7 @@ Note that this example may create resources which will incur monetary charges on |------|--------|---------| | [memory\_db](#module\_memory\_db) | ../.. | n/a | | [memory\_db\_disabled](#module\_memory\_db\_disabled) | ../.. | n/a | -| [security\_group](#module\_security\_group) | terraform-aws-modules/security-group/aws | ~> 4.0 | +| [security\_group](#module\_security\_group) | terraform-aws-modules/security-group/aws | ~> 5.0 | | [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 6.0 | ## Resources @@ -51,6 +51,7 @@ Note that this example may create resources which will incur monetary charges on |------|------| | [aws_sns_topic.example](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sns_topic) | resource | | [random_password.password](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password) | resource | +| [aws_availability_zones.available](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source | ## Inputs diff --git a/examples/complete/main.tf b/examples/complete/main.tf index 03b5675..be10e1e 100644 --- a/examples/complete/main.tf +++ b/examples/complete/main.tf @@ -2,13 +2,25 @@ provider "aws" { region = local.region } +data "aws_availability_zones" "available" { + # Exclude local zones + filter { + name = "opt-in-status" + values = ["opt-in-not-required"] + } +} + locals { - region = "us-east-1" - name = "memorydb-ex-${replace(basename(path.cwd), "_", "-")}" + region = "eu-west-1" + name = "ex-${basename(path.cwd)}" + + vpc_cidr = "10.0.0.0/16" + azs = slice(data.aws_availability_zones.available.names, 0, 3) tags = { - Example = local.name - Environment = "dev" + Name = local.name + Example = local.name + Repository = "https://github.com/terraform-aws-modules/terraform-aws-memory-db" } } @@ -16,13 +28,6 @@ locals { # MemoryDB Module ################################################################################ -module "memory_db_disabled" { - source = "../.." - - name = "${local.name}-disabled" - create = false -} - module "memory_db" { source = "../.." @@ -30,6 +35,7 @@ module "memory_db" { name = local.name description = "Example MemoryDB cluster" + engine = "redis" engine_version = "7.0" auto_minor_version_upgrade = true node_type = "db.r6gd.xlarge" @@ -47,13 +53,13 @@ module "memory_db" { # Users users = { admin = { - user_name = "admin-user" + user_name = "redis-admin-user" access_string = "on ~* &* +@all" type = "iam" tags = { user = "admin" } } readonly = { - user_name = "readonly-user" + user_name = "redis-readonly-user" access_string = "on ~* &* -@all +@read" passwords = [random_password.password.result] tags = { user = "readonly" } @@ -89,6 +95,13 @@ module "memory_db" { tags = local.tags } +module "memory_db_disabled" { + source = "../.." + + name = "${local.name}-disabled" + create = false +} + ################################################################################ # Supporting Resources ################################################################################ @@ -98,11 +111,11 @@ module "vpc" { version = "~> 6.0" name = local.name - cidr = "10.99.0.0/18" + cidr = local.vpc_cidr - 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"] + azs = local.azs + private_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 4, k)] + database_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 48)] create_database_subnet_group = true enable_nat_gateway = false @@ -116,7 +129,7 @@ module "vpc" { module "security_group" { source = "terraform-aws-modules/security-group/aws" - version = "~> 4.0" + version = "~> 5.0" name = local.name description = "Security group for ${local.name}" diff --git a/examples/valkey/README.md b/examples/valkey/README.md index e55d7df..ba1eac6 100644 --- a/examples/valkey/README.md +++ b/examples/valkey/README.md @@ -42,7 +42,7 @@ Note that this example may create resources which will incur monetary charges on |------|--------|---------| | [memory\_db](#module\_memory\_db) | ../.. | n/a | | [memory\_db\_disabled](#module\_memory\_db\_disabled) | ../.. | n/a | -| [security\_group](#module\_security\_group) | terraform-aws-modules/security-group/aws | ~> 4.0 | +| [security\_group](#module\_security\_group) | terraform-aws-modules/security-group/aws | ~> 5.0 | | [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 6.0 | ## Resources @@ -51,6 +51,7 @@ Note that this example may create resources which will incur monetary charges on |------|------| | [aws_sns_topic.example](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sns_topic) | resource | | [random_password.password](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password) | resource | +| [aws_availability_zones.available](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source | ## Inputs diff --git a/examples/valkey/main.tf b/examples/valkey/main.tf index 4b34cda..ed9f3d2 100644 --- a/examples/valkey/main.tf +++ b/examples/valkey/main.tf @@ -2,13 +2,25 @@ provider "aws" { region = local.region } +data "aws_availability_zones" "available" { + # Exclude local zones + filter { + name = "opt-in-status" + values = ["opt-in-not-required"] + } +} + locals { - region = "us-east-1" - name = "memorydb-ex-${replace(basename(path.cwd), "_", "-")}" + region = "eu-west-1" + name = "ex-${basename(path.cwd)}" + + vpc_cidr = "10.0.0.0/16" + azs = slice(data.aws_availability_zones.available.names, 0, 3) tags = { - Example = local.name - Environment = "dev" + Name = local.name + Example = local.name + Repository = "https://github.com/terraform-aws-modules/terraform-aws-memory-db" } } @@ -16,13 +28,6 @@ locals { # MemoryDB Module ################################################################################ -module "memory_db_disabled" { - source = "../.." - - name = "${local.name}-disabled" - create = false -} - module "memory_db" { source = "../.." @@ -31,7 +36,7 @@ module "memory_db" { description = "Example MemoryDB cluster" engine = "valkey" - engine_version = "7.2" + engine_version = "7.3" auto_minor_version_upgrade = true node_type = "db.r6gd.xlarge" num_shards = 2 @@ -48,13 +53,13 @@ module "memory_db" { # Users users = { admin = { - user_name = "admin-user" + user_name = "valkey-admin-user" access_string = "on ~* &* +@all" type = "iam" tags = { user = "admin" } } readonly = { - user_name = "readonly-user" + user_name = "valkey-readonly-user" access_string = "on ~* &* -@all +@read" passwords = [random_password.password.result] tags = { user = "readonly" } @@ -90,6 +95,13 @@ module "memory_db" { tags = local.tags } +module "memory_db_disabled" { + source = "../.." + + name = "${local.name}-disabled" + create = false +} + ################################################################################ # Supporting Resources ################################################################################ @@ -99,11 +111,11 @@ module "vpc" { version = "~> 6.0" name = local.name - cidr = "10.98.0.0/18" + cidr = local.vpc_cidr - azs = ["${local.region}a", "${local.region}b", "${local.region}d"] # Caution: check which zones are available - private_subnets = ["10.98.0.0/24", "10.98.1.0/24", "10.98.2.0/24"] - database_subnets = ["10.98.3.0/24", "10.98.4.0/24", "10.98.5.0/24"] + azs = local.azs + private_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 4, k)] + database_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 48)] create_database_subnet_group = true enable_nat_gateway = false @@ -117,7 +129,7 @@ module "vpc" { module "security_group" { source = "terraform-aws-modules/security-group/aws" - version = "~> 4.0" + version = "~> 5.0" name = local.name description = "Security group for ${local.name}" diff --git a/main.tf b/main.tf index 0000553..fc9cbc7 100644 --- a/main.tf +++ b/main.tf @@ -16,6 +16,8 @@ locals { resource "aws_memorydb_cluster" "this" { count = var.create ? 1 : 0 + region = var.region + name = var.use_name_prefix ? null : var.name name_prefix = var.use_name_prefix ? "${var.name}-" : null description = var.description @@ -45,7 +47,6 @@ resource "aws_memorydb_cluster" "this" { snapshot_retention_limit = var.snapshot_retention_limit snapshot_window = var.snapshot_window final_snapshot_name = var.final_snapshot_name - region = var.region tags = var.tags } @@ -57,9 +58,10 @@ resource "aws_memorydb_cluster" "this" { resource "aws_memorydb_user" "this" { for_each = { for k, v in var.users : k => v if var.create && var.create_users } + region = var.region + user_name = each.value.user_name access_string = each.value.access_string - region = var.region authentication_mode { type = each.value.type @@ -76,11 +78,12 @@ resource "aws_memorydb_user" "this" { resource "aws_memorydb_acl" "this" { count = var.create && var.create_acl ? 1 : 0 + region = var.region + name = var.acl_use_name_prefix ? null : local.create_acl_name name_prefix = var.acl_use_name_prefix ? "${local.create_acl_name}-" : null user_names = distinct(concat([for u in aws_memorydb_user.this : u.id], var.acl_user_names)) - region = var.region lifecycle { create_before_destroy = true @@ -96,11 +99,12 @@ resource "aws_memorydb_acl" "this" { resource "aws_memorydb_parameter_group" "this" { count = var.create && var.create_parameter_group ? 1 : 0 + region = var.region + name = var.parameter_group_use_name_prefix ? null : local.create_parameter_group_name name_prefix = var.parameter_group_use_name_prefix ? "${local.create_parameter_group_name}-" : null description = var.parameter_group_description family = var.parameter_group_family - region = var.region dynamic "parameter" { for_each = var.parameter_group_parameters @@ -124,11 +128,12 @@ resource "aws_memorydb_parameter_group" "this" { resource "aws_memorydb_subnet_group" "this" { count = var.create && var.create_subnet_group ? 1 : 0 + region = var.region + name = var.subnet_group_use_name_prefix ? null : local.create_subnet_group_name name_prefix = var.subnet_group_use_name_prefix ? "${local.create_subnet_group_name}-" : null description = var.subnet_group_description subnet_ids = var.subnet_ids - region = var.region lifecycle { create_before_destroy = true diff --git a/outputs.tf b/outputs.tf index 82bf7b5..e4656a2 100644 --- a/outputs.tf +++ b/outputs.tf @@ -4,32 +4,32 @@ output "cluster_id" { description = "Cluster name" - value = try(aws_memorydb_cluster.this[0].id, "") + value = try(aws_memorydb_cluster.this[0].id, null) } output "cluster_arn" { description = "The ARN of the cluster" - value = try(aws_memorydb_cluster.this[0].arn, "") + value = try(aws_memorydb_cluster.this[0].arn, null) } output "cluster_endpoint_address" { description = "DNS hostname of the cluster configuration endpoint" - value = try(aws_memorydb_cluster.this[0].cluster_endpoint[0].address, "") + value = try(aws_memorydb_cluster.this[0].cluster_endpoint[0].address, null) } output "cluster_endpoint_port" { description = "Port number that the cluster configuration endpoint is listening on" - value = try(aws_memorydb_cluster.this[0].cluster_endpoint[0].port, "") + value = try(aws_memorydb_cluster.this[0].cluster_endpoint[0].port, null) } output "cluster_engine_patch_version" { description = "Patch version number of the Redis engine used by the cluster" - value = try(aws_memorydb_cluster.this[0].engine_patch_version, "") + value = try(aws_memorydb_cluster.this[0].engine_patch_version, null) } output "cluster_shards" { description = "Set of shards in this cluster" - value = try(aws_memorydb_cluster.this[0].shards, []) + value = try(aws_memorydb_cluster.this[0].shards, null) } ################################################################################ @@ -48,17 +48,17 @@ output "users" { output "acl_id" { description = "Name of the ACL" - value = try(aws_memorydb_acl.this[0].id, "") + value = try(aws_memorydb_acl.this[0].id, null) } output "acl_arn" { description = "The ARN of the ACL" - value = try(aws_memorydb_acl.this[0].arn, "") + value = try(aws_memorydb_acl.this[0].arn, null) } output "acl_minimum_engine_version" { description = "The minimum engine version supported by the ACL" - value = try(aws_memorydb_acl.this[0].minimum_engine_version, "") + value = try(aws_memorydb_acl.this[0].minimum_engine_version, null) } ################################################################################ @@ -67,12 +67,12 @@ output "acl_minimum_engine_version" { output "parameter_group_id" { description = "Name of the parameter group" - value = try(aws_memorydb_parameter_group.this[0].id, "") + value = try(aws_memorydb_parameter_group.this[0].id, null) } output "parameter_group_arn" { description = "The ARN of the parameter group" - value = try(aws_memorydb_parameter_group.this[0].arn, "") + value = try(aws_memorydb_parameter_group.this[0].arn, null) } ################################################################################ @@ -81,15 +81,15 @@ output "parameter_group_arn" { output "subnet_group_id" { description = "Name of the subnet group" - value = try(aws_memorydb_subnet_group.this[0].id, "") + value = try(aws_memorydb_subnet_group.this[0].id, null) } output "subnet_group_arn" { description = "ARN of the subnet group" - value = try(aws_memorydb_subnet_group.this[0].arn, "") + value = try(aws_memorydb_subnet_group.this[0].arn, null) } output "subnet_group_vpc_id" { description = "The VPC in which the subnet group exists" - value = try(aws_memorydb_subnet_group.this[0].vpc_id, "") + value = try(aws_memorydb_subnet_group.this[0].vpc_id, null) } diff --git a/variables.tf b/variables.tf index 3201152..2a6a1b4 100644 --- a/variables.tf +++ b/variables.tf @@ -39,7 +39,7 @@ variable "description" { } variable "engine" { - description = "The engine that will run on your nodes. Supported values are redis and valkey" + description = "The engine that will run on your nodes. Supported values are `redis` and `valkey`" type = string default = null } @@ -156,6 +156,7 @@ variable "multi_region_cluster_name" { # User(s) ################################################################################ +# TODO - remove at next breaking change variable "create_users" { description = "Determines whether to create users specified" type = bool From 6bfefb4705c20e1d09eb648bb91d75dea0b9f0df Mon Sep 17 00:00:00 2001 From: Bryant Biggs Date: Wed, 5 Nov 2025 13:06:58 -0600 Subject: [PATCH 2/2] chore: Rename `complete` example to `redis` --- README.md | 2 +- examples/{complete => redis}/README.md | 0 examples/{complete => redis}/main.tf | 0 examples/{complete => redis}/outputs.tf | 0 examples/{complete => redis}/variables.tf | 0 examples/{complete => redis}/versions.tf | 0 6 files changed, 1 insertion(+), 1 deletion(-) rename examples/{complete => redis}/README.md (100%) rename examples/{complete => redis}/main.tf (100%) rename examples/{complete => redis}/outputs.tf (100%) rename examples/{complete => redis}/variables.tf (100%) rename examples/{complete => redis}/versions.tf (100%) diff --git a/README.md b/README.md index 8048969..e3f9b70 100644 --- a/README.md +++ b/README.md @@ -111,7 +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) +- [Redis](https://github.com/terraform-aws-modules/terraform-aws-memory-db/tree/master/examples/redis) - [Valkey](https://github.com/terraform-aws-modules/terraform-aws-memory-db/tree/master/examples/valkey) diff --git a/examples/complete/README.md b/examples/redis/README.md similarity index 100% rename from examples/complete/README.md rename to examples/redis/README.md diff --git a/examples/complete/main.tf b/examples/redis/main.tf similarity index 100% rename from examples/complete/main.tf rename to examples/redis/main.tf diff --git a/examples/complete/outputs.tf b/examples/redis/outputs.tf similarity index 100% rename from examples/complete/outputs.tf rename to examples/redis/outputs.tf diff --git a/examples/complete/variables.tf b/examples/redis/variables.tf similarity index 100% rename from examples/complete/variables.tf rename to examples/redis/variables.tf diff --git a/examples/complete/versions.tf b/examples/redis/versions.tf similarity index 100% rename from examples/complete/versions.tf rename to examples/redis/versions.tf