diff --git a/.github/workflows/pr-lint.yml b/.github/workflows/pr-lint.yml
new file mode 100644
index 0000000..f046139
--- /dev/null
+++ b/.github/workflows/pr-lint.yml
@@ -0,0 +1,15 @@
+name: PR lint
+
+on:
+ pull_request:
+ types: ['opened', 'edited', 'reopened', 'synchronize']
+
+jobs:
+ pr-lint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: seferov/pr-lint-action@master
+ with:
+ title-regex: '^((Pulling|Update from) refs\/heads\/|(\[tf (plan|apply|destroy|status)\]|\[non tf\])\s(feat|fix|build|chore|ci|docs|style|refactor|perf|test)(\!?): (.{3,250})[^\s*]$)'
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ auto-close-message: 'Closing this pull request since the title does not match %pattern% pattern. Please fix the title and re-open the pull request.'
diff --git a/.github/workflows/state-actions.yml b/.github/workflows/state-actions.yml
deleted file mode 100644
index e54077c..0000000
--- a/.github/workflows/state-actions.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: "Mark or close stale issues and PRs"
-on:
- schedule:
- - cron: "0 0 10 * *"
-
-jobs:
- stale:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/stale@v4
- with:
- repo-token: ${{ secrets.GITHUB_TOKEN }}
- # Staling issues and PR's
- days-before-stale: 30
- stale-issue-label: stale
- stale-pr-label: stale
- stale-issue-message: |
- This issue has been automatically marked as stale because it has been open 30 days
- with no activity. Remove stale label or comment or this issue will be closed in 10 days
- stale-pr-message: |
- This PR has been automatically marked as stale because it has been open 30 days
- with no activity. Remove stale label or comment or this PR will be closed in 10 days
- # Not stale if have this labels or part of milestone
- exempt-issue-labels: bug,wip,on-hold
- exempt-pr-labels: bug,wip,on-hold
- exempt-all-milestones: true
- # Close issue operations
- # Label will be automatically removed if the issues are no longer closed nor locked.
- days-before-close: 10
- delete-branch: false
- close-issue-message: This issue was automatically closed because of stale in 10 days
- close-pr-message: This PR was automatically closed because of stale in 10 days
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index fb4c52c..f971f4d 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
- rev: v1.64.0
+ rev: v1.76.0
hooks:
- id: terraform_fmt
- id: terraform_tflint
@@ -12,14 +12,13 @@ repos:
- '--args=--only=terraform_documented_outputs'
- '--args=--only=terraform_documented_variables'
- '--args=--only=terraform_typed_variables'
- #- '--args=--only=terraform_module_pinned_source'
- '--args=--only=terraform_naming_convention'
- '--args=--only=terraform_required_providers'
- '--args=--only=terraform_standard_module_structure'
- '--args=--only=terraform_workspace_remote'
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.1.0
+ rev: v4.3.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
@@ -31,7 +30,7 @@ repos:
- id: requirements-txt-fixer
- repo: https://github.com/bridgecrewio/checkov.git
- rev: '2.0.914'
+ rev: '2.1.280'
hooks:
- id: checkov
verbose: true
diff --git a/README.md b/README.md
index da34752..abdbbde 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@
### Versions
- Module tested for Terraform 1.0.1.
-- AWS provider version [3.74](https://registry.terraform.io/providers/hashicorp/aws/latest)
+- AWS provider version [4.35](https://registry.terraform.io/providers/hashicorp/aws/latest)
- `main` branch: Provider versions not pinned to keep up with Terraform releases
- `tags` releases: Tags are pinned with versions (use
in your releases)
@@ -44,7 +44,7 @@ terraform destroy -var='teamid=tryme' -var='prjid=project1'
#### Option 2:
-##### Recommended method (stores remote state in S3 using `prjid` and `teamid` to create directory structure):
+##### Recommended method (stores remote state in remote backend(S3, Azure storage, or Google bucket) using `prjid` and `teamid` to create directory structure):
- Create python 3.8+ virtual environment
```
@@ -91,43 +91,6 @@ tf -c=aws destroy -var='teamid=foo' -var='prjid=bar'
```
**Note:** Read more on [tfremote](https://github.com/tomarv2/tfremote)
-```
-terraform {
- required_version = ">= 1.0.1"
- required_providers {
- aws = {
- version = "~> 3.74"
- }
- }
-}
-
-provider "aws" {
- region = var.region
-}
-
-module "redis" {
- source = "../"
-
- deploy_redis = true
- deploy_redis_parameter_group = true
-
- security_group_ids = [module.security_group.security_group_id]
- # ----------------------------------------------
- # Note: Do not change teamid and prjid once set.
- teamid = var.teamid
- prjid = var.prjid
-}
-
-module "security_group" {
- source = "git::git@github.com:tomarv2/terraform-aws-security-group.git?ref=v0.0.6"
-
- deploy_security_group = true
-
- service_ports = [6379]
- teamid = var.teamid
- prjid = var.prjid
-}
-```
Please refer to examples directory [link](examples) for references.
@@ -141,13 +104,13 @@ Please refer to examples directory [link](examples) for references.
| Name | Version |
|------|---------|
| [terraform](#requirement\_terraform) | >= 1.0.1 |
-| [aws](#requirement\_aws) | ~> 3.74 |
+| [aws](#requirement\_aws) | ~> 4.35 |
## Providers
| Name | Version |
|------|---------|
-| [aws](#provider\_aws) | ~> 3.74 |
+| [aws](#provider\_aws) | ~> 4.35 |
## Modules
@@ -159,9 +122,8 @@ Please refer to examples directory [link](examples) for references.
| Name | Type |
|------|------|
-| [aws_elasticache_cluster.default](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/elasticache_cluster) | resource |
-| [aws_elasticache_parameter_group.default](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/elasticache_parameter_group) | resource |
-| [aws_elasticache_subnet_group.default](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/elasticache_subnet_group) | resource |
+| [aws_elasticache_cluster.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/elasticache_cluster) | resource |
+| [aws_elasticache_parameter_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/elasticache_parameter_group) | resource |
| [aws_caller_identity.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source |
| [aws_region.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/region) | data source |
@@ -169,34 +131,14 @@ Please refer to examples directory [link](examples) for references.
| Name | Description | Type | Default | Required |
|------|-------------|------|---------|:--------:|
-| [apply\_immediately](#input\_apply\_immediately) | Specifies whether any database modifications are applied immediately, or during the next maintenance window. Default is false. | `bool` | `true` | no |
-| [availability\_zone](#input\_availability\_zone) | The Availability Zone for the cache cluster. If you want to create cache nodes in multi-az, use preferred\_availability\_zones instead. Default: System chosen Availability Zone. Changing this value will re-create the resource. | `string` | `null` | no |
-| [az\_mode](#input\_az\_mode) | (Memcached only) Specifies whether the nodes in this Memcached node group are created in a single Availability Zone or created across multiple Availability Zones in the cluster's region. Valid values for this parameter are single-az or cross-az, default is single-az. If you want to choose cross-az, num\_cache\_nodes must be greater than 1. | `string` | `null` | no |
-| [cache\_nodes](#input\_cache\_nodes) | The initial number of cache nodes that the cache cluster will have. For Redis, this value must be 1. For Memcache, this value must be between 1 and 20. | `number` | `1` | no |
-| [cluster\_id](#input\_cluster\_id) | Group identifier. ElastiCache converts this name to lowercase | `string` | `null` | no |
-| [cluster\_mode\_enabled](#input\_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 |
-| [deploy\_redis](#input\_deploy\_redis) | Feature flag, true or false | `bool` | `true` | no |
-| [deploy\_redis\_parameter\_group](#input\_deploy\_redis\_parameter\_group) | Feature flag, true or false | `bool` | `true` | no |
-| [engine](#input\_engine) | Name of the cache engine to be used for this cache cluster. Valid values for this parameter are memcached or redis. | `string` | `"redis"` | no |
-| [engine\_version](#input\_engine\_version) | Version of engine | `string` | `"5.0.6"` | no |
-| [maintenance\_window](#input\_maintenance\_window) | Specifies the weekly time range for when maintenance on the cache cluster is performed. | `string` | `"mon:10:30-mon:11:30"` | no |
-| [node\_type](#input\_node\_type) | The compute and memory capacity of the nodes | `string` | `"cache.t2.micro"` | no |
-| [notification\_topic\_arn](#input\_notification\_topic\_arn) | An Amazon Resource Name (ARN) of an SNS topic to send ElastiCache notifications to. Example: arn:aws:sns:us-east-1:012345678999:my\_sns\_topic. | `string` | `null` | no |
-| [parameter](#input\_parameter) | A list of Redis parameters to apply. Note that parameters may differ from one Redis family to another |
list(object({
name = string
value = string
})) | `[]` | no |
-| [parameter\_group\_family](#input\_parameter\_group\_family) | The family of the ElastiCache parameter group | `string` | `"redis5.0"` | no |
-| [port](#input\_port) | The port number on which each of the cache nodes will accept connections. For Memcache the default is 11211, and for Redis the default port is 6379. | `number` | `6379` | no |
-| [prjid](#input\_prjid) | Name of the project/stack e.g: mystack, nifieks, demoaci. Should not be changed after running 'tf apply' | `string` | n/a | yes |
-| [security\_group\_ids](#input\_security\_group\_ids) | One or more VPC security groups associated with the cache cluster | `string` | n/a | yes |
-| [snapshot\_arns](#input\_snapshot\_arns) | A single-element string list containing an Amazon Resource Name (ARN) of a Redis RDB snapshot file stored in Amazon S3. Example: arn:aws:s3:::my\_bucket/snapshot1.rdb | `list(any)` | [| no | -| [snapshot\_retention\_limit](#input\_snapshot\_retention\_limit) | Number of days snapshot image will be retained | `number` | `5` | no | -| [snapshot\_window](#input\_snapshot\_window) | Daily time range (in UTC) during which ElastiCache will begin taking a daily snapshot of your cache cluster. Example: 05:00-09:00. | `string` | `""` | no | -| [teamid](#input\_teamid) | Name of the team/group e.g. devops, dataengineering. Should not be changed after running 'tf apply' | `string` | n/a | yes | +| [config](#input\_config) | Redis configuration | `map(any)` | `{}` | no | +| [extra\_tags](#input\_extra\_tags) | Additional tags to associate | `map(string)` | `{}` | no | ## Outputs | Name | Description | |------|-------------| -| [aws\_elasticache\_parameter\_group](#output\_aws\_elasticache\_parameter\_group) | Elasticache Parameter Group | -| [elasticache\_cluster\_address](#output\_elasticache\_cluster\_address) | Elasticache Cluster address | -| [elasticache\_id](#output\_elasticache\_id) | Elasticache Id | +| [cluster\_address](#output\_cluster\_address) | Elasticache Cluster address | +| [cluster\_id](#output\_cluster\_id) | Elasticache Id | +| [parameter\_group](#output\_parameter\_group) | Elasticache Parameter Group | diff --git a/examples/main.tf b/examples/main.tf index f06468b..d1525f7 100644 --- a/examples/main.tf +++ b/examples/main.tf @@ -2,34 +2,59 @@ terraform { required_version = ">= 1.0.1" required_providers { aws = { - version = "~> 3.74" + version = "~> 4.35" } } } provider "aws" { - region = var.region + region = "us-west-2" } module "redis" { source = "../" - deploy_redis = true - deploy_redis_parameter_group = true - - security_group_ids = [module.security_group.security_group_id] - # ---------------------------------------------- - # Note: Do not change teamid and prjid once set. - teamid = var.teamid - prjid = var.prjid + config = { + demo = { + security_group_ids = module.security_group.id + engine_version = "6.2" + family = "redis6.x" + parameter_group_config = { + activerehashing = { + value = "yes" + } + } + } + } } module "security_group" { - source = "git::git@github.com:tomarv2/terraform-aws-security-group.git?ref=v0.0.6" - - deploy_security_group = true - - service_ports = [6379] - teamid = var.teamid - prjid = var.prjid + #source = "git::git@github.com:tomarv2/terraform-aws-security-group.git?ref=v0.0.12" + source = "../../terraform-aws-security-group" + config = { + demo_redis = { + all_ingress_rules = [ + { + description = "https" + type = "ingress" + from_port = 6379 + protocol = "tcp" + to_port = 6379 + self = true + cidr_blocks = [] + } + ] + all_egress_rules = [ + { + description = "outbound traffic" + from_port = 0 + protocol = "-1" + type = "egress" + to_port = 0 + self = false + cidr_blocks = ["0.0.0.0/0"] + } + ] + } + } } diff --git a/examples/outputs.tf b/examples/outputs.tf index aa344c7..3e376cf 100644 --- a/examples/outputs.tf +++ b/examples/outputs.tf @@ -1,19 +1,19 @@ -output "elasticache_id" { +output "cluster_id" { + value = module.redis.cluster_id description = "Elasticache Id" - value = module.redis.elasticache_id } -output "elasticache_cluster_address" { +output "cluster_address" { + value = module.redis.cluster_address description = "Elasticache Cluster address" - value = module.redis.elasticache_cluster_address } -output "aws_elasticache_parameter_group" { +output "parameter_group" { description = "Elasticache Parameter Group" - value = module.redis.aws_elasticache_parameter_group + value = module.redis.parameter_group } output "security_group_id" { description = "Security group Id" - value = module.security_group.security_group_id + value = module.security_group.id } diff --git a/examples/variables.tf b/examples/variables.tf deleted file mode 100644 index ea0008b..0000000 --- a/examples/variables.tf +++ /dev/null @@ -1,15 +0,0 @@ -variable "teamid" { - description = "Name of the team/group e.g. devops, dataengineering. Should not be changed after running 'tf apply'" - type = string -} - -variable "prjid" { - description = "Name of the project/stack e.g: mystack, nifieks, demoaci. Should not be changed after running 'tf apply'" - type = string -} - -variable "region" { - description = "AWS region to create resources" - default = "us-west-2" - type = string -} diff --git a/main.tf b/main.tf index 0277740..52634e3 100644 --- a/main.tf +++ b/main.tf @@ -2,25 +2,50 @@ #NOTE: For working with Redis (Cluster Mode Enabled) replication groups # see the aws_elasticache_replication_group resource. # -resource "aws_elasticache_cluster" "default" { - count = var.deploy_redis ? 1 : 0 +resource "aws_elasticache_cluster" "this" { + for_each = var.config + cluster_id = each.key + engine = try(each.value.engine, "redis") + node_type = try(each.value.node_type, "cache.t2.micro") + num_cache_nodes = try(each.value.num_cache_nodes, 1) + parameter_group_name = try(each.value.parameter_group_config, null) == null ? "" : join("", [for entry in aws_elasticache_parameter_group.this : entry.name]) + engine_version = try(each.value.engine_version, "6.2") + port = try(each.value.port, 6379) + #subnet_group_name = module.global.list_of_subnets[local.account_id][local.region] + security_group_ids = try(each.value.security_group_ids, "") + snapshot_arns = try(each.value.snapshot_arns, []) + snapshot_window = try(each.value.snapshot_window, "") + snapshot_retention_limit = try(each.value.snapshot_retention_limit, 5) + az_mode = try(each.value.az_mode, null) + availability_zone = try(each.value.availability_zone, null) + notification_topic_arn = try(each.value.notification_topic_arn, null) + apply_immediately = try(each.value.apply_immediately, true) + maintenance_window = try(each.value.maintenance_window, "mon:10:30-mon:11:30") + tags = merge(local.shared_tags, var.extra_tags) +} + +locals { + parameter_group_settings = flatten([ + for instance, config in var.config : [ + for k, v in config.parameter_group_config : { + name = instance + family = try(config.family, "redis6.0") + parameter_name = k + parameter_value = v.value + } + ]]) +} + +resource "aws_elasticache_parameter_group" "this" { + for_each = { for i in local.parameter_group_settings : i.parameter_name => i } + name = each.value.name + family = each.value.family - cluster_id = var.cluster_id == null ? "${var.teamid}-${var.prjid}" : var.cluster_id - engine = var.engine - node_type = var.node_type - num_cache_nodes = var.cache_nodes - parameter_group_name = var.deploy_redis_parameter_group == true ? join("", aws_elasticache_parameter_group.default.*.name) : "" - engine_version = var.engine_version - port = var.port - subnet_group_name = aws_elasticache_subnet_group.default.name - security_group_ids = var.security_group_ids - snapshot_arns = var.snapshot_arns == [""] ? [] : var.snapshot_arns - snapshot_window = var.snapshot_window == "" ? null : var.snapshot_window - snapshot_retention_limit = var.snapshot_retention_limit == "" ? null : var.snapshot_retention_limit - az_mode = var.az_mode == null ? null : var.az_mode - availability_zone = var.availability_zone == null ? null : var.availability_zone - tags = merge(local.shared_tags) - notification_topic_arn = var.notification_topic_arn == null ? null : var.notification_topic_arn - apply_immediately = var.apply_immediately == "" ? true : var.apply_immediately - maintenance_window = var.maintenance_window + dynamic "parameter" { + for_each = { for i in local.parameter_group_settings : i.parameter_name => i } + content { + name = parameter.value.parameter_name + value = parameter.value.parameter_value + } + } } diff --git a/outputs.tf b/outputs.tf index 7559a3e..930269b 100644 --- a/outputs.tf +++ b/outputs.tf @@ -1,14 +1,14 @@ -output "elasticache_id" { - value = join("", aws_elasticache_cluster.default.*.id) +output "cluster_id" { + value = [for i in aws_elasticache_cluster.this : i.id] description = "Elasticache Id" } -output "elasticache_cluster_address" { - value = aws_elasticache_cluster.default.*.cache_nodes.0.address +output "cluster_address" { + value = [for i in aws_elasticache_cluster.this : i.cluster_address] description = "Elasticache Cluster address" } -output "aws_elasticache_parameter_group" { +output "parameter_group" { description = "Elasticache Parameter Group" - value = join("", aws_elasticache_parameter_group.default.*.name) + value = [for i in aws_elasticache_parameter_group.this : i.name] } diff --git a/parameter_group.tf b/parameter_group.tf deleted file mode 100644 index 5a59559..0000000 --- a/parameter_group.tf +++ /dev/null @@ -1,15 +0,0 @@ -resource "aws_elasticache_parameter_group" "default" { - count = var.deploy_redis_parameter_group ? 1 : 0 - - name = var.cluster_id == null ? "${var.teamid}-${var.prjid}" : var.cluster_id - family = var.parameter_group_family - - - dynamic "parameter" { - for_each = var.cluster_mode_enabled ? concat([{ name = "cluster-enabled", value = "yes" }], var.parameter) : var.parameter - content { - name = parameter.value.name - value = parameter.value.value - } - } -} diff --git a/providers.tf b/providers.tf index 93f2248..6c0e9ed 100644 --- a/providers.tf +++ b/providers.tf @@ -2,7 +2,7 @@ terraform { required_version = ">= 1.0.1" required_providers { aws = { - version = "~> 3.74" + version = "~> 4.35" } } } diff --git a/subnet_group.tf b/subnet_group.tf deleted file mode 100644 index fee16bf..0000000 --- a/subnet_group.tf +++ /dev/null @@ -1,4 +0,0 @@ -resource "aws_elasticache_subnet_group" "default" { - name = var.cluster_id == null ? "${var.teamid}-${var.prjid}" : var.cluster_id - subnet_ids = module.global.list_of_subnets[local.account_id][local.region] -} diff --git a/tags.tf b/tags.tf index 5e98596..fea54a2 100755 --- a/tags.tf +++ b/tags.tf @@ -1,9 +1,5 @@ locals { shared_tags = tomap( - { - "Name" = "${var.teamid}-${var.prjid}", - "Team" = var.teamid, - "Project" = var.prjid - } + {} ) } diff --git a/variables.tf b/variables.tf index a0a8498..dbbde22 100644 --- a/variables.tf +++ b/variables.tf @@ -1,132 +1,11 @@ -variable "teamid" { - description = "Name of the team/group e.g. devops, dataengineering. Should not be changed after running 'tf apply'" - type = string +variable "config" { + description = "Redis configuration" + type = map(any) + default = {} } -variable "prjid" { - description = "Name of the project/stack e.g: mystack, nifieks, demoaci. Should not be changed after running 'tf apply'" - type = string -} - -variable "cluster_id" { - default = null - description = "Group identifier. ElastiCache converts this name to lowercase" - type = string -} - -variable "node_type" { - default = "cache.t2.micro" - description = "The compute and memory capacity of the nodes" - type = string -} - -variable "cache_nodes" { - description = "The initial number of cache nodes that the cache cluster will have. For Redis, this value must be 1. For Memcache, this value must be between 1 and 20." - default = 1 - type = number -} - - -variable "engine_version" { - default = "5.0.6" - description = "Version of engine" - type = string -} - -variable "port" { - description = "The port number on which each of the cache nodes will accept connections. For Memcache the default is 11211, and for Redis the default port is 6379." - default = 6379 - type = number -} - -variable "security_group_ids" { - description = "One or more VPC security groups associated with the cache cluster" - type = string -} - -variable "snapshot_window" { - default = "" - description = "Daily time range (in UTC) during which ElastiCache will begin taking a daily snapshot of your cache cluster. Example: 05:00-09:00." - type = string -} - -variable "snapshot_retention_limit" { - description = "Number of days snapshot image will be retained" - default = 5 - type = number -} - -variable "engine" { - default = "redis" - description = "Name of the cache engine to be used for this cache cluster. Valid values for this parameter are memcached or redis." - type = string -} - -variable "notification_topic_arn" { - description = "An Amazon Resource Name (ARN) of an SNS topic to send ElastiCache notifications to. Example: arn:aws:sns:us-east-1:012345678999:my_sns_topic." - default = null - type = string -} - -variable "snapshot_arns" { - description = "A single-element string list containing an Amazon Resource Name (ARN) of a Redis RDB snapshot file stored in Amazon S3. Example: arn:aws:s3:::my_bucket/snapshot1.rdb" - default = [""] - type = list(any) -} - -variable "apply_immediately" { - description = "Specifies whether any database modifications are applied immediately, or during the next maintenance window. Default is false." - default = true - type = bool -} - -variable "az_mode" { - description = "(Memcached only) Specifies whether the nodes in this Memcached node group are created in a single Availability Zone or created across multiple Availability Zones in the cluster's region. Valid values for this parameter are single-az or cross-az, default is single-az. If you want to choose cross-az, num_cache_nodes must be greater than 1." - default = null - type = string -} - -variable "deploy_redis" { - description = "Feature flag, true or false" - default = true - type = bool -} - -variable "availability_zone" { - default = null - description = "The Availability Zone for the cache cluster. If you want to create cache nodes in multi-az, use preferred_availability_zones instead. Default: System chosen Availability Zone. Changing this value will re-create the resource." - type = string -} - -variable "deploy_redis_parameter_group" { - description = "Feature flag, true or false" - default = true - type = bool -} - -variable "cluster_mode_enabled" { - type = bool - description = "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" - default = false -} - -variable "parameter" { - type = list(object({ - name = string - value = string - })) - default = [] - description = "A list of Redis parameters to apply. Note that parameters may differ from one Redis family to another" -} - -variable "parameter_group_family" { - default = "redis5.0" - description = "The family of the ElastiCache parameter group" - type = string -} - -variable "maintenance_window" { - description = "Specifies the weekly time range for when maintenance on the cache cluster is performed. " - default = "mon:10:30-mon:11:30" - type = string +variable "extra_tags" { + description = "Additional tags to associate" + type = map(string) + default = {} }
""
]