learner
learner

Reputation: 2840

Unable to create RDS instance even though subnets are in different Availability Zones

Terraform code is here:

resource "aws_rds_cluster" "tf-aws-rds-1" {
  cluster_identifier      = "aurora-cluster-1"
  engine                  = "aurora-mysql"
  engine_version          = "5.7.mysql_aurora.2.03.2"
  availability_zones      = ["us-east-1a","us-east-1b","us-east-1c"]
  database_name           = "cupday"
  master_username         = "administrator"
  master_password         = var.password
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
  storage_encrypted       = true
  kms_key_id              = data.aws_kms_key.rds_key.arn
}

However, when I do run terraform apply, I get the error message below:

aws_rds_cluster.tf-aws-rds-1: Creating...

Error: error creating RDS cluster: InvalidVPCNetworkStateFault: DB Subnet Group doesn't meet availability zone coverage requirement. Please add subnets to cover at least 2 availability zones. Current coverage: 0
        status code: 400, request id: bc05fb5f-311c-4d15-821a-8b97fc27ab5b

However, I do have subnets in multiple AZ, screenshot below:

enter image description here

Any idea what is the issue and how do I solve it? P.S: Subnet created as like below

resource "aws_subnet" "tf-aws-sn" {
  count             = var.subnet_count
  vpc_id            = aws_vpc.tf-aws-vn.id
  cidr_block        = data.template_file.public_cidrsubnet[count.index].rendered
  availability_zone = slice(data.aws_availability_zones.available.names, 0, var.subnet_count)[count.index]
  tags              = local.common_tags
}

Availability Zones I get as like below:

data "aws_availability_zones" "available" {}

Upvotes: 3

Views: 3579

Answers (1)

Marcin
Marcin

Reputation: 238081

I don't see in your code reference to aws_db_subnet_group, so I guess a default subnet group used does not meet this constrain. You can create your own aws_db_subnet_group:

resource "aws_db_subnet_group" "db_subnets" {
  name       = "main"
  subnet_ids = aws_subnet.tf-aws-sn[*].id

  tags = {
    Name = "My DB subnet group"
  }
}

And then use it (no need for availability_zones in this case)

resource "aws_rds_cluster" "tf-aws-rds-1" {
  cluster_identifier      = "aurora-cluster-1"
  engine                  = "aurora-mysql"
  engine_version          = "5.7.mysql_aurora.2.03.2"

  db_subnet_group_name    = aws_db_subnet_group.db_subnets.name

  database_name           = "cupday"
  master_username         = "administrator"
  master_password         = var.password
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
  storage_encrypted       = true
  kms_key_id              = data.aws_kms_key.rds_key.arn
}

Upvotes: 3

Related Questions