使用Terraform创建跨区域跨VPC的RDS只读副本时安全组VPC不匹配报错
报错根因
跨区域创建RDS只读副本时,你没有显式指定目标区域的DB子网组,AWS API会默认将副本创建到目标区域的默认VPC中,而你传入的安全组属于自定义VPC,两者VPC不一致导致报错。控制台操作时会引导选择目标VPC的子网组,因此不会触发该错误。
解决步骤
- 配置目标区域的Terraform AWS Provider(跨区域资源需要用别名Provider区分),示例如下:
provider "aws" { alias = "replica_region" region = "ap-southeast-1" # 替换为你的副本目标区域 }
- 在目标VPC(即你所用的
peering_sg所属的VPC)下创建目标区域专属的RDS子网组,要求至少包含2个可用区的子网,示例如下:
resource "aws_db_subnet_group" "replica_subnet_group" { provider = aws.replica_region name = "rds-replica-subnet-group" subnet_ids = [aws_subnet.replica_sub1.id, aws_subnet.replica_sub2.id] # 替换为目标VPC下的子网ID列表 tags = { Name = "RDS Replica Subnet Group" } }
- 修改原有的RDS副本资源配置,新增
provider指定目标区域、新增db_subnet_group_name绑定刚创建的目标子网组,同时确认replicate_source_db传入源数据库完整ARN,修正后的配置示例:
resource "aws_db_instance" "replica" { provider = aws.replica_region # 指定资源创建在目标区域 count = var.enable_peering_read_replica ? 1 : 0 name = "db-replica" identifier = "db-replica" replicate_source_db = "arn:aws:rds:源区域:源账号ID:db:source-db" # 替换为源数据库的完整ARN instance_class = "db.t3.small" apply_immediately = true publicly_accessible = false skip_final_snapshot = true vpc_security_group_ids = [aws_security_group.peering_sg.id] db_subnet_group_name = aws_db_subnet_group.replica_subnet_group.name # 绑定目标区域子网组 }
额外校验项
- 确认
aws_security_group.peering_sg是通过目标区域Provider创建,和上述子网组属于同一个VPC - 源RDS实例需要开启自动备份,保留周期至少1天,否则无法创建跨区域只读副本
- 如果源RDS实例存储加密,需要在副本配置中新增
kms_key_id参数,指定目标区域的KMS密钥用于加密副本存储
内容的提问来源于stack exchange,提问作者einonsy
相关产品推荐
相关产品推荐

