使用Terraform升级AWS RDS PostgreSQL 10.18至13.4遇阻求助
Aurora PostgreSQL大版本升级(10.18→13.4)Terraform解决方案
问题原因分析
- 首次报错提示需要
AllowMajorVersionUpgrade,但Aurora集群不支持allow_major_version_upgrade参数——这个参数仅适用于单实例RDS(aws_db_instance资源)。 - 你之前在
lifecycle中设置了ignore_changes = [engine_version],这会阻止Terraform应用引擎版本的变更。 - 大版本升级必须配合对应目标版本的集群参数组。
具体修复步骤
1. 移除错误参数
删除aws_rds_cluster和aws_rds_cluster_instance中添加的allow_major_version_upgrade = true,这两个资源不支持该参数。
2. 解除引擎版本变更限制
在两个资源的lifecycle块中,移除ignore_changes = [engine_version]——否则Terraform会忽略你对engine_version的修改。
3. 更新引擎版本与参数组
- 修改
aws_rds_cluster的engine_version为"13.4" - 确保
db_cluster_parameter_group_name指向针对Aurora PostgreSQL 13.4创建的参数组(如果还没创建,需要先定义aws_rds_cluster_parameter_group资源,示例见下方)。
4. 示例修改后代码
集群参数组(如果未创建需添加)
resource "aws_rds_cluster_parameter_group" "param_group_v13" { name = "aurora-postgres-13-param-group" family = "aurora-postgresql13" description = "Parameter group for Aurora PostgreSQL 13.4" parameter { name = "log_statement" value = "all" # 按需添加其他参数 } }
修改后的aws_rds_cluster资源
resource "aws_rds_cluster" "aws_rds_cluster" { engine = "aurora-postgresql" engine_version = "13.4" # 更新为目标版本 cluster_identifier = "aws_rds_cluster_instance-cluster" availability_zones = data.aws_availability_zones.available.names database_name = "aws_rds_cluster_instance" deletion_protection = true master_username = var.db_username master_password = var.db_password backup_retention_period = 7 preferred_backup_window = "07:00-08:00" preferred_maintenance_window = "mon:23:00-mon:23:30" port = 5432 skip_final_snapshot = "true" storage_encrypted = "true" iam_database_authentication_enabled = "true" kms_key_id = aws_kms_key.key.arn vpc_security_group_ids = [aws_security_group.db.id] db_subnet_group_name = aws_db_subnet_group.db.name db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.param_group_v13.name # 指向13版本参数组 tags = merge(map( "system", "local.system_name", "business_unit", "local.business_unit", ), local.base_tags) lifecycle { # 移除ignore_changes = [engine_version] prevent_destroy = true } }
修改后的aws_rds_cluster_instance资源
resource "aws_rds_cluster_instance" "aws_rds_cluster_instance" { count = 3 identifier = "aws_rds_cluster_instance-${count.index}" instance_class = "db.r4.large" availability_zone = data.aws_availability_zones.available.names[count.index] engine = "aurora-postgresql" engine_version = aws_rds_cluster.aws_rds_cluster.engine_version # 继承集群版本,无需手动修改 cluster_identifier = aws_rds_cluster.aws_rds_cluster.id monitoring_interval = "60" monitoring_role_arn = "arn:aws:iam::12345678910:role/role" performance_insights_enabled = "true" preferred_maintenance_window = "mon:12:20-mon:12:50" promotion_tier = "1" publicly_accessible = "false" db_subnet_group_name = aws_db_subnet_group.db.name tags = merge(map( "system", "local.system_name", "business_unit", "local.business_unit", ), local.base_tags) lifecycle { # 移除ignore_changes = [engine_version] prevent_destroy = true } }
5. 执行变更
依次运行以下命令:
terraform init terraform plan # 确认变更内容,检查是否为升级集群版本和参数组 terraform apply
注意事项
- Aurora大版本升级会触发集群滚动重启,建议在业务低峰期操作
- 升级前请确保已完成数据库备份
- 部分参数可能需要在升级前调整,可参考AWS官方文档中Aurora PostgreSQL大版本升级的前置要求
内容的提问来源于stack exchange,提问作者asur
相关产品推荐
相关产品推荐

