You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Terraform一次性完成AWS RDS Aurora(Postgres)13.12至14.17的升级?

解决方案:一次性完成Aurora Postgres大版本升级并解决密码同步问题

问题根源分析

  1. 快照冲突错误:你同时在aws_rds_cluster中设置了snapshot_identifier和final_snapshot_identifier,这两个参数的作用完全冲突:

    • final_snapshot_identifier仅在删除集群时触发快照生成
    • snapshot_identifier用于基于指定快照创建新集群
      大版本升级不需要删除重建集群,同时配置这两个参数会导致Terraform试图在旧集群快照未生成时就创建新集群,自然抛出「快照名称未找到」错误。
  2. 密码同步问题: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
  }
}

执行步骤

  1. 运行terraform plan确认变更:应显示更新现有集群及实例的engine_version,而非销毁重建资源。
  2. 运行terraform apply执行升级,注意大版本升级过程中集群会有短暂不可用,提前做好业务降级准备。

关键注意事项

  • Aurora Postgres大版本升级会自动生成预升级快照,无需手动配置快照参数。
  • 升级前确保集群无长时间运行的事务,避免升级失败。
  • Secrets Manager会自动同步密码,无需手动维护两者一致性。

内容的提问来源于stack exchange,提问作者Coding_ninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:04:59