使用Terraform创建Aurora PostgreSQL只读副本遇参数组合错误
问题
尝试使用Terraform为us-east-1区域的现有Aurora PostgreSQL集群创建同区域只读副本,使用的Terraform脚本如下:
resource "aws_rds_cluster" "test_db_cluster" { cluster_identifier = "${var.base_name}-read-replica" engine = "aurora-postgresql" engine_mode = "provisioned" engine_version = "16.1" skip_final_snapshot = true storage_encrypted = true replication_source_identifier = "arn:aws:rds:us-east-1:<xxx>:cluster:testdev" source_region = "us-east-1" }
执行后出现错误:
InvalidParameterCombination: The DB engine aurora-postgresql doesn't support cross-region read replicas.
即使移除source_region参数,错误依然存在。原集群同样通过Terraform创建,脚本如下:
resource "aws_rds_cluster" "test_db_cluster" { cluster_identifier = var.base_name engine = "aurora-postgresql" engine_mode = "provisioned" engine_version = "16.1" database_name = var.database_name master_username = var.master_username db_subnet_group_name = var.subnet_group vpc_security_group_ids = [var.security_group_id] availability_zones = [var.az] skip_final_snapshot = true storage_encrypted = true manage_master_user_password = true master_user_secret_kms_key_id = aws_kms_key.scopp_db_kms.key_id serverlessv2_scaling_configuration { max_capacity = var.max_capacity min_capacity = var.min_capacity } } resource "aws_rds_cluster_instance" "test_db_instance" { identifier = "${var.base_name}-instance-1" cluster_identifier = aws_rds_cluster.test_db_cluster.id instance_class = "db.serverless" engine = aws_rds_cluster.test_db_cluster.engine engine_version = aws_rds_cluster.test_db_cluster.engine_version performance_insights_enabled = true } resource "aws_kms_key" "test_db_kms" { description = "Test DB KMS Key" }
原因分析
原集群为Serverless v2模式,不支持独立只读副本集群
你的原Aurora PostgreSQL集群配置了serverlessv2_scaling_configuration,且实例类为db.serverless,属于Serverless v2架构。而Aurora PostgreSQL的Serverless v2集群不支持创建单独的只读副本集群——无论同区域还是跨区域都不允许这种操作。错误提示存在误导性
虽然你是在同区域创建副本,但AWS API的错误提示会误报为"不支持跨区域副本",本质原因是Serverless v2集群本身不支持这种副本创建方式。正确的只读访问实现方式
对于Serverless v2的Aurora PostgreSQL集群,无需创建独立副本集群,直接在同一个集群内添加只读实例即可实现只读访问。可以通过新增aws_rds_cluster_instance资源并指定promotion_tier参数标记为只读实例:resource "aws_rds_cluster_instance" "test_db_read_replica" { identifier = "${var.base_name}-read-instance-1" cluster_identifier = aws_rds_cluster.test_db_cluster.id instance_class = "db.serverless" engine = aws_rds_cluster.test_db_cluster.engine engine_version = aws_rds_cluster.test_db_cluster.engine_version promotion_tier = 1 # 标记为只读实例,无法被提升为主实例 performance_insights_enabled = true }
内容的提问来源于stack exchange,提问作者Kstackr

