如何用Terraform一次性完成AWS RDS Aurora(Postgres)13.12至14.17的升级?
解决方案:一次性完成Aurora Postgres大版本升级并解决密码同步问题
问题根源分析
快照冲突错误:你同时在
aws_rds_cluster中设置了snapshot_identifier和final_snapshot_identifier,这两个参数的作用完全冲突:final_snapshot_identifier仅在删除集群时触发快照生成snapshot_identifier用于基于指定快照创建新集群
大版本升级不需要删除重建集群,同时配置这两个参数会导致Terraform试图在旧集群快照未生成时就创建新集群,自然抛出「快照名称未找到」错误。
密码同步问题:
random_password默认是持久化资源,但如果你的配置中没有添加keepers约束,或者错误触发了资源重建,会导致密码重新生成;同时直接用random_password结果配置集群,无法和Secrets Manager实现稳定同步。
修正后的Terraform配置
1. 核心集群升级配置(移除冲突参数,优化升级逻辑)
resource "aws_rds_cluster" "aurora" { cluster_identifier = local.env_config.rds_db_identifier engine = local.env_config.rds_engine engine_mode = local.env_config.rds_engine_mode engine_version = "14.17" allow_major_version_upgrade = true apply_immediately = local.env_config.rds_apply_immediately database_name = local.env_config.auroradb_name master_username = local.env_config.auroradb_user # 优先从Secrets Manager读取现有密码,首次部署则用random_password生成 master_password = length(aws_secretsmanager_secret_version.aurora.secret_string) > 0 ? jsondecode(aws_secretsmanager_secret_version.aurora.secret_string).password : random_password.aurora_passwd.result vpc_security_group_ids = [aws_security_group.aurora.id] db_subnet_group_name = aws_db_subnet_group.aurora_group.id copy_tags_to_snapshot = true deletion_protection = false enable_http_endpoint = true preferred_maintenance_window = local.env_config.preferred_maintenance_window backup_retention_period = 14 preferred_backup_window = "01:00-02:00" skip_final_snapshot = true # 升级无需删除集群,跳过最终快照 storage_encrypted = true serverlessv2_scaling_configuration { max_capacity = 4 min_capacity = 2 } tags = local.default_tags timeouts { create = "120m" update = "120m" # 大版本升级耗时久,增加更新超时时间 } }
2. 集群实例配置(同步版本,避免冲突)
resource "aws_rds_cluster_instance" "aurora_provisioned_instance" { cluster_identifier = aws_rds_cluster.aurora.id instance_class = "db.serverless" engine = local.env_config.rds_engine engine_version = aws_rds_cluster.aurora.engine_version # 和集群版本强同步 publicly_accessible = false db_subnet_group_name = aws_db_subnet_group.aurora_group.id apply_immediately = local.env_config.rds_apply_immediately # 和集群配置保持一致 }
3. 密码持久化配置(确保密码不随意变更)
resource "random_password" "aurora_passwd" { length = 16 special = true override_special = "!@#$%^&*()" # 添加keepers约束,仅当指定参数变化时才重新生成密码 keepers = { db_identifier = local.env_config.rds_db_identifier db_user = local.env_config.auroradb_user } }
执行步骤
- 运行
terraform plan确认变更:应显示更新现有集群及实例的engine_version,而非销毁重建资源。 - 运行
terraform apply执行升级,注意大版本升级过程中集群会有短暂不可用,提前做好业务降级准备。
关键注意事项
- Aurora Postgres大版本升级会自动生成预升级快照,无需手动配置快照参数。
- 升级前确保集群无长时间运行的事务,避免升级失败。
- Secrets Manager会自动同步密码,无需手动维护两者一致性。
内容的提问来源于stack exchange,提问作者Coding_ninja
相关产品推荐
相关产品推荐

