Terraform创建跨区域Aurora PostgreSQL集群报DB子网组不存在错误
问题根因
AWS资源为区域隔离属性,DB子网组属于区域级资源,你当前仅在us-east-2(主区域)创建了名为cse-cr的子网组,而次级集群部署在us-east-1(备区域),该区域下不存在同名的子网组,因此触发404报错。
另外你当前的子网数据源、子网组资源都没有绑定指定provider,会默认使用无别名的AWS provider配置,容易出现区域匹配错误。
修复步骤
- 为备区域
us-east-1准备该区域下2个以上可用区的子网,单独创建备区域的DB子网组 - 所有区域级资源显式绑定对应provider,避免默认provider匹配偏差
- 子网组名称引用直接关联资源属性,不要硬编码字符串,避免拼写错误
调整后代码示例
provider "aws" { alias = "primary" region = "us-east-2" } provider "aws" { alias = "secondary" region = "us-east-1" } resource "aws_rds_global_cluster" "example" { global_cluster_identifier = "global-test" engine = "aurora-postgresql" engine_version = "13.4" database_name = "example_db" } variable "database_name" { description = "What should RDS name the initial db?" default = "variableWithSomeDefault" } # 主区域us-east-2子网、子网组配置 data "aws_subnet" "primary_subnet1" { provider = aws.primary id = "subnet-xxx-us-east-2-1" # 替换为us-east-2下实际子网ID } data "aws_subnet" "primary_subnet2" { provider = aws.primary id = "subnet-xxx-us-east-2-2" # 替换为us-east-2下实际子网ID } resource "aws_db_subnet_group" "primary" { provider = aws.primary name = "cse-cr" description = "Private subnets for RDS instance in us-east-2" subnet_ids = [data.aws_subnet.primary_subnet1.id, data.aws_subnet.primary_subnet2.id] } # 备区域us-east-1子网、子网组配置 data "aws_subnet" "secondary_subnet1" { provider = aws.secondary id = "subnet-xxx-us-east-1-1" # 替换为us-east-1下实际子网ID } data "aws_subnet" "secondary_subnet2" { provider = aws.secondary id = "subnet-xxx-us-east-1-2" # 替换为us-east-1下实际子网ID } resource "aws_db_subnet_group" "secondary" { provider = aws.secondary name = "cse-cr" description = "Private subnets for RDS instance in us-east-1" subnet_ids = [data.aws_subnet.secondary_subnet1.id, data.aws_subnet.secondary_subnet2.id] } resource "aws_rds_cluster" "primary" { provider = aws.primary engine = "aurora-postgresql" engine_version = "13.4" cluster_identifier = "test-primary-cluster" master_username = "username" master_password = "somepass123" database_name = var.database_name global_cluster_identifier = aws_rds_global_cluster.example.global_cluster_identifier db_subnet_group_name = aws_db_subnet_group.primary.name # 直接关联资源属性,避免硬编码错误 skip_final_snapshot = true } resource "aws_rds_cluster_instance" "primary" { provider = aws.primary engine = "aurora-postgresql" engine_version = "13.4" identifier = "primaryinstancetest" cluster_identifier = aws_rds_cluster.primary.cluster_identifier instance_class = "db.r5.large" db_subnet_group_name = aws_db_subnet_group.primary.name } resource "aws_rds_cluster" "secondary" { provider = aws.secondary engine = "aurora-postgresql" engine_version = "13.4" cluster_identifier = "test-secondary-cluster" global_cluster_identifier = aws_rds_global_cluster.example.global_cluster_identifier skip_final_snapshot = true db_subnet_group_name = aws_db_subnet_group.secondary.name # 用备区域的子网组 depends_on = [ aws_rds_cluster_instance.primary ] } resource "aws_rds_cluster_instance" "secondary" { provider = aws.secondary engine = "aurora-postgresql" engine_version = "13.4" identifier = "secondaryinstancetest" cluster_identifier = aws_rds_cluster.secondary.cluster_identifier instance_class = "db.r5.large" db_subnet_group_name = aws_db_subnet_group.secondary.name }
内容的提问来源于stack exchange,提问作者Stephanie Couto
相关产品推荐
相关产品推荐

