diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 41c1baad..6f64b5a3 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,4 +1,25 @@
# Use this file to define individuals or teams that are responsible for code in a repository.
# Read more:
+#
+# Order is important: the last matching pattern has the highest precedence
-* @cloudposse/engineering
\ No newline at end of file
+# These owners will be the default owners for everything
+* @cloudposse/engineering @cloudposse/contributors
+
+# Cloud Posse must review any changes to Makefiles
+**/Makefile @cloudposse/engineering
+**/Makefile.* @cloudposse/engineering
+
+# Cloud Posse must review any changes to GitHub actions
+.github/* @cloudposse/engineering
+
+# Cloud Posse must review any changes to standard context definition,
+# but some changes can be rubber-stamped.
+**/*.tf @cloudposse/engineering @cloudposse/contributors @cloudposse/approvers
+README.yaml @cloudposse/engineering @cloudposse/contributors @cloudposse/approvers
+README.md @cloudposse/engineering @cloudposse/contributors @cloudposse/approvers
+docs/*.md @cloudposse/engineering @cloudposse/contributors @cloudposse/approvers
+
+# Cloud Posse Admins must review all changes to CODEOWNERS or the mergify configuration
+.github/mergify.yml @cloudposse/admins
+.github/CODEOWNERS @cloudposse/admins
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 00000000..94d32460
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,72 @@
+---
+name: Bug report
+description: Create a report to help us improve
+labels: ["bug"]
+assignees: [""]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Found a bug?
+
+ Please checkout our [Slack Community](https://slack.cloudposse.com)
+ or visit our [Slack Archive](https://archive.sweetops.com/).
+
+ [![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com)
+
+ - type: textarea
+ id: concise-description
+ attributes:
+ label: Describe the Bug
+ description: A clear and concise description of what the bug is.
+ placeholder: What is the bug about?
+ validations:
+ required: true
+
+ - type: textarea
+ id: expected
+ attributes:
+ label: Expected Behavior
+ description: A clear and concise description of what you expected.
+ placeholder: What happened?
+ validations:
+ required: true
+
+ - type: textarea
+ id: reproduction-steps
+ attributes:
+ label: Steps to Reproduce
+ description: Steps to reproduce the behavior.
+ placeholder: How do we reproduce it?
+ validations:
+ required: true
+
+ - type: textarea
+ id: screenshots
+ attributes:
+ label: Screenshots
+ description: If applicable, add screenshots or logs to help explain.
+ validations:
+ required: false
+
+ - type: textarea
+ id: environment
+ attributes:
+ label: Environment
+ description: Anything that will help us triage the bug.
+ placeholder: |
+ - OS: [e.g. Linux, OSX, WSL, etc]
+ - Version [e.g. 10.15]
+ - Module version
+ - Terraform version
+ validations:
+ required: false
+
+ - type: textarea
+ id: additional
+ attributes:
+ label: Additional Context
+ description: |
+ Add any other context about the problem here.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index ecc9eb62..39a8686f 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -7,7 +7,7 @@ assignees: ''
---
-Have a question? Please checkout our [Slack Community](https://slack.cloudposse.com) in the `#geodesic` channel or visit our [Slack Archive](https://archive.sweetops.com/geodesic/).
+Have a question? Please checkout our [Slack Community](https://slack.cloudposse.com) or visit our [Slack Archive](https://archive.sweetops.com/).
[![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com)
@@ -33,4 +33,4 @@ Explain what alternative solutions or features you've considered.
## Additional Context
-Add any other context or screenshots about the feature request here.
\ No newline at end of file
+Add any other context or screenshots about the feature request here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 00000000..7b866727
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,71 @@
+---
+name: Feature Request
+description: Suggest an idea for this project
+labels: ["feature request"]
+assignees: [""]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Have a question?
+
+ Please checkout our [Slack Community](https://slack.cloudposse.com)
+ or visit our [Slack Archive](https://archive.sweetops.com/).
+
+ [![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com)
+
+ - type: textarea
+ id: concise-description
+ attributes:
+ label: Describe the Feature
+ description: A clear and concise description of what the feature is.
+ placeholder: What is the feature about?
+ validations:
+ required: true
+
+ - type: textarea
+ id: expected
+ attributes:
+ label: Expected Behavior
+ description: A clear and concise description of what you expected.
+ placeholder: What happened?
+ validations:
+ required: true
+
+ - type: textarea
+ id: use-case
+ attributes:
+ label: Use Case
+ description: |
+ Is your feature request related to a problem/challenge you are trying
+ to solve?
+
+ Please provide some additional context of why this feature or
+ capability will be valuable.
+ validations:
+ required: true
+
+ - type: textarea
+ id: ideal-solution
+ attributes:
+ label: Describe Ideal Solution
+ description: A clear and concise description of what you want to happen.
+ validations:
+ required: true
+
+ - type: textarea
+ id: alternatives-considered
+ attributes:
+ label: Alternatives Considered
+ description: Explain alternative solutions or features considered.
+ validations:
+ required: false
+
+ - type: textarea
+ id: additional
+ attributes:
+ label: Additional Context
+ description: |
+ Add any other context about the problem here.
+ validations:
+ required: false
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 4b8f32df..8944933e 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,13 +1,21 @@
## what
-* Describe high-level what changed as a result of these commits (i.e. in plain-english, what do these changes mean?)
-* Use bullet points to be concise and to the point.
+
+
## why
-* Provide the justifications for the changes (e.g. business case).
-* Describe why these changes were made (e.g. why do these commits fix the problem?)
-* Use bullet points to be concise and to the point.
+
+
## references
-* Link to any supporting github issues or helpful documentation to add some context (e.g. stackoverflow).
-* Use `closes #123`, if this PR closes a GitHub issue `#123`
+
diff --git a/.github/auto-release.yml b/.github/auto-release.yml
new file mode 100644
index 00000000..cc9bf057
--- /dev/null
+++ b/.github/auto-release.yml
@@ -0,0 +1,54 @@
+name-template: 'v$RESOLVED_VERSION'
+tag-template: '$RESOLVED_VERSION'
+version-template: '$MAJOR.$MINOR.$PATCH'
+version-resolver:
+ major:
+ labels:
+ - 'major'
+ minor:
+ labels:
+ - 'minor'
+ - 'enhancement'
+ patch:
+ labels:
+ - 'auto-update'
+ - 'patch'
+ - 'fix'
+ - 'bugfix'
+ - 'bug'
+ - 'hotfix'
+ default: 'minor'
+filter-by-commitish: true
+
+categories:
+- title: 'π Enhancements'
+ labels:
+ - 'enhancement'
+ - 'patch'
+- title: 'π Bug Fixes'
+ labels:
+ - 'fix'
+ - 'bugfix'
+ - 'bug'
+ - 'hotfix'
+- title: 'π€ Automatic Updates'
+ labels:
+ - 'auto-update'
+
+change-template: |
+
+ $TITLE @$AUTHOR (#$NUMBER)
+
+ $BODY
+
+
+template: |
+ $CHANGES
+
+replacers:
+# Remove irrelevant information from Renovate bot
+- search: '/(?<=---\s)\s*^#.*(Renovate configuration|Configuration)(?:.|\n)*?This PR has been generated .*/gm'
+ replace: ''
+# Remove Renovate bot banner image
+- search: '/\[!\[[^\]]*Renovate\][^\]]*\](\([^)]*\))?\s*\n+/gm'
+ replace: ''
diff --git a/.github/banner.png b/.github/banner.png
new file mode 100644
index 00000000..729b1160
Binary files /dev/null and b/.github/banner.png differ
diff --git a/.github/mergify.yml b/.github/mergify.yml
new file mode 100644
index 00000000..526045d4
--- /dev/null
+++ b/.github/mergify.yml
@@ -0,0 +1 @@
+extends: .github
diff --git a/.github/renovate.json b/.github/renovate.json
new file mode 100644
index 00000000..909df094
--- /dev/null
+++ b/.github/renovate.json
@@ -0,0 +1,14 @@
+{
+ "extends": [
+ "config:base",
+ ":preserveSemverRanges",
+ ":rebaseStalePrs"
+ ],
+ "baseBranches": ["main"],
+ "labels": ["auto-update"],
+ "dependencyDashboardAutoclose": true,
+ "enabledManagers": ["terraform"],
+ "terraform": {
+ "ignorePaths": ["**/context.tf"]
+ }
+}
diff --git a/.github/settings.yml b/.github/settings.yml
new file mode 100644
index 00000000..fb87c08f
--- /dev/null
+++ b/.github/settings.yml
@@ -0,0 +1,7 @@
+# Upstream changes from _extends are only recognized when modifications are made to this file in the default branch.
+_extends: .github
+repository:
+ name: terraform-aws-elasticache-redis
+ description: Terraform module to provision an ElastiCache Redis Cluster
+ homepage: https://cloudposse.com/accelerate
+ topics: terraform, terraform-module, elasticache, aws, cache, elasticache-redis
diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml
new file mode 100644
index 00000000..fd64cd85
--- /dev/null
+++ b/.github/workflows/branch.yml
@@ -0,0 +1,25 @@
+---
+name: Branch
+on:
+ pull_request:
+ branches:
+ - main
+ - release/**
+ types: [opened, synchronize, reopened, labeled, unlabeled]
+ push:
+ branches:
+ - main
+ - release/v*
+ paths-ignore:
+ - '.github/**'
+ - 'docs/**'
+ - 'examples/**'
+ - 'test/**'
+ - 'README.md'
+
+permissions: {}
+
+jobs:
+ terraform-module:
+ uses: cloudposse/.github/.github/workflows/shared-terraform-module.yml@main
+ secrets: inherit
diff --git a/.github/workflows/chatops.yml b/.github/workflows/chatops.yml
new file mode 100644
index 00000000..c3d47fa6
--- /dev/null
+++ b/.github/workflows/chatops.yml
@@ -0,0 +1,16 @@
+---
+name: chatops
+on:
+ issue_comment:
+ types: [created]
+
+permissions:
+ pull-requests: write
+ id-token: write
+ contents: write
+
+jobs:
+ terraform-module:
+ uses: cloudposse/.github/.github/workflows/shared-terraform-chatops.yml@main
+ secrets:
+ github_access_token: ${{ secrets.REPO_ACCESS_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 00000000..f9680681
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,13 @@
+---
+name: release
+on:
+ release:
+ types:
+ - published
+
+permissions: {}
+
+jobs:
+ terraform-module:
+ uses: cloudposse/.github/.github/workflows/shared-release-branches.yml@main
+ secrets: inherit
diff --git a/.github/workflows/scheduled.yml b/.github/workflows/scheduled.yml
new file mode 100644
index 00000000..a79e9498
--- /dev/null
+++ b/.github/workflows/scheduled.yml
@@ -0,0 +1,16 @@
+---
+name: scheduled
+on:
+ workflow_dispatch: { } # Allows manually trigger this workflow
+ schedule:
+ - cron: "0 3 * * *"
+
+permissions:
+ pull-requests: write
+ id-token: write
+ contents: write
+
+jobs:
+ scheduled:
+ uses: cloudposse/.github/.github/workflows/shared-terraform-scheduled.yml@main
+ secrets: inherit
diff --git a/.github/workflows/slash-command-dispatch.yml b/.github/workflows/slash-command-dispatch.yml
deleted file mode 100644
index 3e3c1387..00000000
--- a/.github/workflows/slash-command-dispatch.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-name: Slash Command Dispatch
-on:
- issue_comment:
- types: [created]
-
-jobs:
- slashCommandDispatch:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
-
- - name: Slash Command Dispatch
- uses: cloudposse/actions/github/slash-command-dispatch@0.12.0
- with:
- token: ${{ secrets.GITHUB_BOT_TOKEN }}
- reaction-token: ${{ secrets.GITHUB_TOKEN }}
- repository: cloudposse/actions
- commands: rebuild-readme, terraform-fmt
- permission: none
- issue-type: pull-request
diff --git a/Makefile b/Makefile
index 655f6303..d1d74612 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ SHELL := /bin/bash
# List of targets the `readme` target should call before generating the readme
export README_DEPS ?= docs/targets.md docs/terraform.md
--include $(shell curl -sSL -o .build-harness "https://git.io/build-harness"; echo .build-harness)
+-include $(shell curl -sSL -o .build-harness "https://cloudposse.tools/build-harness"; echo .build-harness)
## Lint terraform code
lint:
diff --git a/README.md b/README.md
index 28565148..d0d7984e 100644
--- a/README.md
+++ b/README.md
@@ -1,24 +1,22 @@
-
+
+
+
+
+
-[![README Header][readme_header_img]][readme_header_link]
-
-[![Cloud Posse][logo]](https://cpco.io/homepage)
-
-# terraform-aws-elasticache-redis [![Codefresh Build Status](https://g.codefresh.io/api/badges/pipeline/cloudposse/terraform-modules%2Fterraform-aws-elasticache-redis?type=cf-1)](https://g.codefresh.io/public/accounts/cloudposse/pipelines/5d23a11695dc3006a29862e2) [![Latest Release](https://img.shields.io/github/release/cloudposse/terraform-aws-elasticache-redis.svg)](https://github.com/cloudposse/terraform-aws-elastic-beanstalk-environment/releases/latest) [![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com)
-
+-->
Terraform module to provision an [`ElastiCache`](https://aws.amazon.com/elasticache/) Redis Cluster
----
-
-This project is part of our comprehensive ["SweetOps"](https://cpco.io/sweetops) approach towards DevOps.
-[][share_email]
-[][share_googleplus]
-[][share_facebook]
-[][share_reddit]
-[][share_linkedin]
-[][share_twitter]
-
-
-[![Terraform Open Source Modules](https://docs.cloudposse.com/images/terraform-open-source-modules.svg)][terraform_modules]
-
-
-
-It's 100% Open Source and licensed under the [APACHE2](LICENSE).
-
-
-
-
-
-
-
-We literally have [*hundreds of terraform modules*][terraform_modules] that are Open Source and well-maintained. Check them out!
-
-
+> [!TIP]
+> #### π½ Use Atmos with Terraform
+> Cloud Posse uses [`atmos`](https://atmos.tools) to easily orchestrate multiple environments using Terraform.
+> Works with [Github Actions](https://atmos.tools/integrations/github-actions/), [Atlantis](https://atmos.tools/integrations/atlantis), or [Spacelift](https://atmos.tools/integrations/spacelift).
+>
+>
+> Watch demo of using Atmos with Terraform
+>
+> Example of running atmos
to manage infrastructure from our Quick Start tutorial.
+>
@@ -81,81 +47,120 @@ We literally have [*hundreds of terraform modules*][terraform_modules] that are
## Usage
+_**Disruptive changes introduced at version 0.41.0**. If upgrading from an earlier version, see
+[migration notes](https://github.com/cloudposse/terraform-aws-elasticache-redis/blob/master/docs/migration-notes-0.41.0.md) for details._
-**IMPORTANT:** The `master` branch is used in `source` just as an example. In your code, do not pin to `master` because there may be breaking changes between releases.
-Instead pin to the release tag (e.g. `?ref=tags/x.y.z`) of one of our [latest releases](https://github.com/cloudposse/terraform-aws-elasticache-redis/releases).
+Note that this uses secure defaults. One of the ways this module can trip users up is with `transit_encryption_enabled`
+which is `true` by default. With this enabled, one does not simply `redis-cli` in without setting up an `stunnel`.
+Amazon provides [good documentation on how to connect with it enabled](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/in-transit-encryption.html#connect-tls).
+If this is not desired behavior, set `transit_encryption_enabled=false`.
+This module creates, by default, a new security group for the Elasticache Redis Cluster. When a configuration
+change (for example, a different security group name) cannot be applied to the security group, Terraform will
+replace that security group with a new one with the new configuration. In order to allow Terraform to fully manage the security group, you
+should not place any other resources in (or associate any other resources with) the security group this module
+creates. Also, in order to keep things from breaking when this module replaces the security group, you should
+not reference the created security group anywhere else (such as in rules in other security groups). If you
+want to associate the cluster with a more stable security group that you can reference elsewhere, create that security group
+outside this module (perhaps with [terraform-aws-security-group](https://github.com/cloudposse/terraform-aws-security-group))
+and pass the security group ID in via `associated_security_group_ids`.
+**Note about `zone_id`**: Previously, `zone_id` was a string. This caused problems (see [#82](https://github.com/cloudposse/terraform-aws-elasticache-redis/issues/82)).
+Now `zone_id` should be supplied as a `list(string)`, either empty or with exactly 1 zone ID in order to avoid the problem.
For a complete example, see [examples/complete](examples/complete).
For automated tests of the complete example using [bats](https://github.com/bats-core/bats-core) and [Terratest](https://github.com/gruntwork-io/terratest) (which tests and deploys the example on AWS), see [test](test).
```hcl
- provider "aws" {
- region = var.region
- }
-
- module "vpc" {
- source = "git::https://github.com/cloudposse/terraform-aws-vpc.git?ref=tags/0.8.1"
- namespace = var.namespace
- stage = var.stage
- name = var.name
- cidr_block = "172.16.0.0/16"
- }
-
- module "subnets" {
- source = "git::https://github.com/cloudposse/terraform-aws-dynamic-subnets.git?ref=tags/0.18.1"
- availability_zones = var.availability_zones
- namespace = var.namespace
- stage = var.stage
- name = var.name
- vpc_id = module.vpc.vpc_id
- igw_id = module.vpc.igw_id
- cidr_block = module.vpc.vpc_cidr_block
- nat_gateway_enabled = true
- nat_instance_enabled = false
- }
-
- module "redis" {
- source = "git::https://github.com/cloudposse/terraform-aws-elasticache-redis.git?ref=master"
- availability_zones = var.availability_zones
- namespace = var.namespace
- stage = var.stage
- name = var.name
- zone_id = var.zone_id
- vpc_id = module.vpc.vpc_id
- allowed_security_groups = [module.vpc.vpc_default_security_group_id]
- subnets = module.subnets.private_subnet_ids
- cluster_size = var.cluster_size
- instance_type = var.instance_type
- apply_immediately = true
- automatic_failover = false
- engine_version = var.engine_version
- family = var.family
- at_rest_encryption_enabled = var.at_rest_encryption_enabled
- transit_encryption_enabled = var.transit_encryption_enabled
-
- parameter = [
- {
- name = "notify-keyspace-events"
- value = "lK"
- }
- ]
- }
+provider "aws" {
+ region = var.region
+}
+
+module "this" {
+ source = "cloudposse/label/null"
+ # Cloud Posse recommends pinning every module to a specific version
+ # version = "x.x.x"
+ namespace = var.namespace
+ stage = var.stage
+ name = var.name
+}
+
+module "vpc" {
+ source = "cloudposse/vpc/aws"
+ # Cloud Posse recommends pinning every module to a specific version
+ # version = "x.x.x"
+
+ cidr_block = "172.16.0.0/16"
+
+ context = module.this.context
+}
+
+module "subnets" {
+ source = "cloudposse/dynamic-subnets/aws"
+ # Cloud Posse recommends pinning every module to a specific version
+ # version = "x.x.x"
+
+ availability_zones = var.availability_zones
+ vpc_id = module.vpc.vpc_id
+ igw_id = module.vpc.igw_id
+ cidr_block = module.vpc.vpc_cidr_block
+ nat_gateway_enabled = true
+ nat_instance_enabled = false
+
+ context = module.this.context
+}
+
+module "redis" {
+ source = "cloudposse/elasticache-redis/aws"
+ # Cloud Posse recommends pinning every module to a specific version
+ # version = "x.x.x"
+
+ availability_zones = var.availability_zones
+ zone_id = var.zone_id
+ vpc_id = module.vpc.vpc_id
+ allowed_security_group_ids = [module.vpc.vpc_default_security_group_id]
+ subnets = module.subnets.private_subnet_ids
+ cluster_size = var.cluster_size
+ instance_type = var.instance_type
+ apply_immediately = true
+ automatic_failover_enabled = false
+ engine_version = var.engine_version
+ family = var.family
+ at_rest_encryption_enabled = var.at_rest_encryption_enabled
+ transit_encryption_enabled = var.transit_encryption_enabled
+
+ parameter = [
+ {
+ name = "notify-keyspace-events"
+ value = "lK"
+ }
+ ]
+
+ context = module.this.context
+}
```
+> [!IMPORTANT]
+> In Cloud Posse's examples, we avoid pinning modules to specific versions to prevent discrepancies between the documentation
+> and the latest released versions. However, for your own projects, we strongly advise pinning each module to the exact version
+> you're using. This practice ensures the stability of your infrastructure. Additionally, we recommend implementing a systematic
+> approach for updating versions to avoid unexpected changes.
+
+
## Examples
-Review the [complete example](examples/simple) to see how to use this module.
+Review the [complete example](examples/complete) to see how to use this module.
+
+
## Makefile Targets
-```
+```text
Available targets:
help Help screen
@@ -164,231 +169,267 @@ Available targets:
lint Lint terraform code
```
-## Inputs
-
-| Name | Description | Type | Default | Required |
-|------|-------------|:----:|:-----:|:-----:|
-| alarm_actions | Alarm action list | list(string) | `` | no |
-| alarm_cpu_threshold_percent | CPU threshold alarm level | number | `75` | no |
-| alarm_memory_threshold_bytes | Ram threshold alarm level | number | `10000000` | no |
-| allowed_cidr_blocks | List of CIDR blocks that are allowed ingress to the cluster's Security Group created in the module | list(string) | `` | no |
-| allowed_security_groups | List of Security Group IDs that are allowed ingress to the cluster's Security Group created in the module | list(string) | `` | no |
-| apply_immediately | Apply changes immediately | bool | `true` | no |
-| at_rest_encryption_enabled | Enable encryption at rest | bool | `false` | no |
-| attributes | Additional attributes (_e.g._ "1") | list(string) | `` | no |
-| auth_token | Auth token for password protecting redis, `transit_encryption_enabled` must be set to `true`. Password must be longer than 16 chars | string | `null` | no |
-| automatic_failover_enabled | Automatic failover (Not available for T1/T2 instances) | bool | `false` | no |
-| availability_zones | Availability zone IDs | list(string) | `` | no |
-| cluster_mode_enabled | Flag to enable/disable creation of a native redis cluster. `automatic_failover_enabled` must be set to `true`. Only 1 `cluster_mode` block is allowed | bool | `false` | no |
-| cluster_mode_num_node_groups | Number of node groups (shards) for this Redis replication group. Changing this number will trigger an online resizing operation before other settings modifications | number | `0` | no |
-| cluster_mode_replicas_per_node_group | Number of replica nodes in each node group. Valid values are 0 to 5. Changing this number will force a new resource | number | `0` | no |
-| cluster_size | Number of nodes in cluster. *Ignored when `cluster_mode_enabled` == `true`* | number | `1` | no |
-| delimiter | Delimiter between `name`, `namespace`, `stage` and `attributes` | string | `-` | no |
-| dns_subdomain | The subdomain to use for the CNAME record. If not provided then the CNAME record will use var.name. | string | `` | no |
-| elasticache_subnet_group_name | Subnet group name for the ElastiCache instance | string | `` | no |
-| enabled | Set to false to prevent the module from creating any resources | bool | `true` | no |
-| engine_version | Redis engine version | string | `4.0.10` | no |
-| existing_security_groups | List of existing Security Group IDs to place the cluster into. Set `use_existing_security_groups` to `true` to enable using `existing_security_groups` as Security Groups for the cluster | list(string) | `` | no |
-| family | Redis family | string | `redis4.0` | no |
-| instance_type | Elastic cache instance type | string | `cache.t2.micro` | no |
-| maintenance_window | Maintenance window | string | `wed:03:00-wed:04:00` | no |
-| name | Name of the application | string | - | yes |
-| namespace | Namespace (e.g. `eg` or `cp`) | string | `` | no |
-| notification_topic_arn | Notification topic arn | string | `` | no |
-| ok_actions | The list of actions to execute when this alarm transitions into an OK state from any other state. Each action is specified as an Amazon Resource Number (ARN) | list(string) | `` | no |
-| parameter | A list of Redis parameters to apply. Note that parameters may differ from one Redis family to another | object | `` | no |
-| port | Redis port | number | `6379` | no |
-| replication_group_id | Replication group ID with the following constraints: A name must contain from 1 to 20 alphanumeric characters or hyphens. The first character must be a letter. A name cannot end with a hyphen or contain two consecutive hyphens. | string | `` | no |
-| snapshot_retention_limit | The number of days for which ElastiCache will retain automatic cache cluster snapshots before deleting them. | number | `0` | no |
-| snapshot_window | The daily time range (in UTC) during which ElastiCache will begin taking a daily snapshot of your cache cluster. | string | `06:30-07:30` | no |
-| stage | Stage (e.g. `prod`, `dev`, `staging`) | string | `` | no |
-| subnets | Subnet IDs | list(string) | `` | no |
-| tags | Additional tags (_e.g._ map("BusinessUnit","ABC") | map(string) | `