Redshift clusters should have automatic upgrades to major versions enabled
Redshift major version upgrades can include security patches, performance improvements, and reliability fixes. Leaving a cluster on an older major version longer than intended is a common outcome when upgrades require manual intervention: change-freeze windows stack up, team bandwidth gets allocated elsewhere, and the upgrade quietly gets deferred.
Automatic upgrades apply during preferred_maintenance_window, so the brief unavailability is predictable and schedulable. This setting reduces that operational drag, but it does not replace a proper patch and vulnerability management process.
Implementation
Choose the approach that matches how you manage Terraform.
Use the compliance.tf module to enforce this control by default. See get started with compliance.tf.
module "redshift" {
source = "nistcsf.compliance.tf/terraform-aws-modules/redshift/aws"
version = ">=7.0.0,<8.0.0"
automated_snapshot_retention_period = 7
cluster_identifier = "abc123"
create_cloudwatch_log_group = true
database_name = "mydb"
logging = {
log_destination_type = "cloudwatch"
log_exports = ["connectionlog", "userlog", "useractivitylog"]
}
master_password_wo = "change-me-in-production"
master_username = "admin"
node_type = "ra3.xlplus"
number_of_nodes = 2
subnet_ids = ["subnet-12345678", "subnet-12345678", "subnet-12345678"]
vpc_id = "vpc-12345678"
vpc_security_group_ids = ["sg-12345678"]
}
If you use terraform-aws-modules/redshift/aws, set the right module inputs for this control. You can later migrate to the compliance.tf module with minimal changes because it is compatible by design.
module "redshift" {
source = "terraform-aws-modules/redshift/aws"
version = ">=7.0.0,<8.0.0"
automated_snapshot_retention_period = 7
cluster_identifier = "abc123"
create_cloudwatch_log_group = true
database_name = "mydb"
logging = {
log_destination_type = "cloudwatch"
log_exports = ["connectionlog", "userlog", "useractivitylog"]
}
master_password_wo = "change-me-in-production"
master_username = "admin"
node_type = "ra3.xlplus"
number_of_nodes = 2
subnet_ids = ["subnet-12345678", "subnet-12345678", "subnet-12345678"]
vpc_id = "vpc-12345678"
vpc_security_group_ids = ["sg-12345678"]
allow_version_upgrade = true
}
Use AWS provider resources directly. See docs for the resources involved: aws_redshift_cluster.
resource "aws_redshift_cluster" "this" {
automated_snapshot_retention_period = 7
cluster_identifier = "pofix-abc123"
cluster_subnet_group_name = "example-redshift-subnet-group"
master_password = "ChangeMe123!"
master_username = "admin"
node_type = "ra3.large"
skip_final_snapshot = true
allow_version_upgrade = true
}
What this control checks
This control validates allow_version_upgrade on the aws_redshift_cluster resource. It accepts a boolean: true passes, false fails. The Terraform AWS provider defaults this argument to true, so omitting it also passes. A cluster fails only when allow_version_upgrade is explicitly set to false. No additional resources are required.
Common pitfalls
Explicit false overrides a safe default
The Terraform default for
allow_version_upgradeonaws_redshift_clusteristrue. Teams sometimes copy older module templates that explicitly setallow_version_upgrade = falseto prevent unexpected changes. Grep your modules for this value before assuming compliance.Maintenance window misalignment causes perceived outages
Disabling
allow_version_upgradereactively because upgrades overlap with peak query hours is the wrong fix. Upgrade timing is governed bypreferred_maintenance_window. Set that to a low-traffic window and the disruption concern goes away.Terraform import may not capture the setting
After
terraform import,allow_version_upgradeis read from the API, but only if you have declared it in your.tffile. If the argument is absent, subsequent plans will silently rely on the provider default. Declare it explicitly to avoid configuration drift.
Audit evidence
Auditors expect AWS Config rule evaluation results showing all Redshift clusters as compliant, or equivalent output from a CSPM tool such as Turbot Pipes. Supplementary evidence includes aws redshift describe-clusters output showing "AllowVersionUpgrade": true for each cluster across all active regions. Organizations using Config conformance packs can provide the rule's evaluation history as a timestamped compliance record covering continuous adherence, not just a point-in-time snapshot.
Framework-specific interpretation
NIST Cybersecurity Framework v2.0: PR.PS (Platform Security) covers protection of platform components, and keeping Redshift on a current major version is part of that. This setting reduces time spent on older engine releases with known issues and supports technology asset protection under the Protect function.
Tool mappings
Use these identifiers to cross-reference this control across tools, reports, and evidence.
Compliance.tf Control:
redshift_cluster_automatic_upgrade_major_versions_enabledAWS Config Managed Rule:
REDSHIFT_CLUSTER_MAINTENANCESETTINGS_CHECKCheckov Check:
CKV_AWS_141Powerpipe Control:
aws_compliance.control.redshift_cluster_automatic_upgrade_major_versions_enabledProwler Check:
redshift_cluster_automatic_upgradesAWS Security Hub Control:
Redshift.6
Last reviewed: 2026-03-09