如何用Terraform创建实例类型不同的AWS Aurora PostgreSQL只读副本?
解决Terraform创建Aurora集群自定义只读副本的问题
问题分析
你遇到的DBInstanceAlreadyExists错误,核心原因有两个:
- 资源引用错误:第二个
aws_rds_cluster_instance块中,engine和engine_version引用了不存在的aws_rds_cluster.default,正确的引用应该是你定义的集群资源aws_rds_cluster.aurora-cluster。 - 同名实例冲突:如果之前通过控制台/CLI手动创建过相同标识符的实例,或者Terraform状态中残留了同名资源记录,也会触发该错误。
正确实现方案
1. 修正引用并添加不同实例类型的只读副本
修改第二个aws_rds_cluster_instance块的资源引用,确保实例标识符唯一,并指定自定义实例类型:
resource "aws_rds_cluster_instance" "aurora-cluster-ro-instance" { count = 1 identifier = "${var.vpc_name}-aurora-ro-${count.index}" cluster_identifier = aws_rds_cluster.aurora-cluster.id instance_class = "db.r6g.xlarge" engine = aws_rds_cluster.aurora-cluster.engine engine_version = aws_rds_cluster.aurora-cluster.engine_version }
2. 添加Aurora Serverless V2只读副本
如果需要创建Serverless V2类型的副本,需指定instance_class = "db.serverless",并配置serverlessv2_scaling_configuration块:
resource "aws_rds_cluster_instance" "aurora-cluster-serverless-ro" { count = 1 identifier = "${var.vpc_name}-aurora-serverless-ro-${count.index}" cluster_identifier = aws_rds_cluster.aurora-cluster.id instance_class = "db.serverless" engine = aws_rds_cluster.aurora-cluster.engine engine_version = aws_rds_cluster.aurora-cluster.engine_version serverlessv2_scaling_configuration { min_capacity = 0.5 max_capacity = 128 } }
3. 处理已存在的实例
如果确实存在同名实例,可通过以下方式解决:
- 手动删除AWS控制台中对应的RDS实例,再重新执行
terraform apply。 - 使用Terraform导入命令,将已存在的实例纳入Terraform管理:
导入后执行terraform import aws_rds_cluster_instance.aurora-cluster-ro-instance[0] <你的实例标识符>terraform plan确认状态一致,再执行apply。
完整示例代码
整合后的核心代码如下:
resource "aws_rds_cluster" "aurora-cluster" { cluster_identifier = "${var.vpc_name}-aurora" db_subnet_group_name = "${var.vpc_name}-aurora-subnet" vpc_security_group_ids = [aws_security_group.vpc.id] engine = "aurora-postgresql" engine_version = var.aurora_engine_version database_name = var.aurora_db_name master_username = var.aurora_admin master_password = var.aurora_pass skip_final_snapshot = true } # 主实例+2个同类型只读副本 resource "aws_rds_cluster_instance" "aurora-cluster-instance" { count = 3 identifier = "${var.vpc_name}-aurora-${count.index}" cluster_identifier = aws_rds_cluster.aurora-cluster.id instance_class = "db.r5.xlarge" engine = aws_rds_cluster.aurora-cluster.engine engine_version = aws_rds_cluster.aurora-cluster.engine_version } # 自定义实例类型的只读副本 resource "aws_rds_cluster_instance" "aurora-cluster-ro-instance" { count = 1 identifier = "${var.vpc_name}-aurora-ro-${count.index}" cluster_identifier = aws_rds_cluster.aurora-cluster.id instance_class = "db.r6g.xlarge" engine = aws_rds_cluster.aurora-cluster.engine engine_version = aws_rds_cluster.aurora-cluster.engine_version } # Aurora Serverless V2只读副本 resource "aws_rds_cluster_instance" "aurora-cluster-serverless-ro" { count = 1 identifier = "${var.vpc_name}-aurora-serverless-ro-${count.index}" cluster_identifier = aws_rds_cluster.aurora-cluster.id instance_class = "db.serverless" engine = aws_rds_cluster.aurora-cluster.engine engine_version = aws_rds_cluster.aurora-cluster.engine_version serverlessv2_scaling_configuration { min_capacity = 0.5 max_capacity = 128 } }
内容的提问来源于stack exchange,提问作者dovka
相关产品推荐
相关产品推荐

