Skip to content

AWS RDS Module

Terraform module for creating AWS RDS instances with optional RDS Proxy support.

Features

  • PostgreSQL or MySQL database instances
  • Private subnet deployment (recommended)
  • Security group configuration
  • Optional RDS Proxy for connection pooling
  • Secrets Manager integration for credentials
  • CloudWatch logging support
  • Backup and maintenance window configuration

Usage

Basic RDS Instance

hcl
module "rds" {
  source = "../../modules/aws/rds"

  db_instance_identifier = "my-app-db"
  vpc_id                 = module.vpc.vpc_id
  vpc_cidr              = "10.0.0.0/16"
  subnet_ids            = module.vpc.private_subnet_ids

  db_name     = "appdb"
  db_username = "appuser"
  db_password = "secure-password"

  resource_tags = {
    Environment = "production"
    ManagedBy   = "terraform"
  }
}

RDS with Proxy

hcl
module "rds" {
  source = "../../modules/aws/rds"

  db_instance_identifier = "my-app-db"
  vpc_id                 = module.vpc.vpc_id
  vpc_cidr              = "10.0.0.0/16"
  subnet_ids            = module.vpc.private_subnet_ids

  db_name     = "appdb"
  db_username = "appuser"
  db_password = "secure-password"

  create_rds_proxy = true

  resource_tags = {
    Environment = "production"
  }
}

RDS with EKS Access

hcl
module "rds" {
  source = "../../modules/aws/rds"

  db_instance_identifier = "my-app-db"
  vpc_id                 = module.vpc.vpc_id
  vpc_cidr              = "10.0.0.0/16"
  subnet_ids            = module.vpc.private_subnet_ids

  # Allow EKS nodes to access RDS
  allowed_security_group_ids = [module.eks_cluster.node_security_group_id]

  db_name     = "appdb"
  db_username = "appuser"
  db_password = "secure-password"

  resource_tags = {
    Environment = "production"
  }
}

Inputs

NameDescriptionTypeDefaultRequired
db_instance_identifierIdentifier for the RDS instancestringn/ayes
vpc_idVPC ID where RDS will be deployedstringn/ayes
vpc_cidrCIDR block of the VPCstringn/ayes
subnet_idsList of subnet IDs for DB subnet grouplist(string)n/ayes
engineDatabase enginestring"postgres"no
engine_versionEngine versionstring"14.9"no
instance_classRDS instance classstring"db.t3.micro"no
allocated_storageAllocated storage in GBnumber20no
db_nameName of the database to createstring"appdb"no
db_usernameMaster usernamestring"appuser"no
db_passwordMaster passwordstringn/ayes
publicly_accessibleMake RDS publicly accessibleboolfalseno
create_rds_proxyCreate RDS Proxyboolfalseno
allowed_security_group_idsSecurity groups allowed to access RDSlist(string)[]no

Outputs

NameDescription
db_instance_endpointRDS instance endpoint (hostname:port)
db_instance_addressRDS instance hostname
db_instance_portRDS instance port
db_nameDatabase name
db_security_group_idSecurity group ID for RDS
rds_proxy_endpointRDS Proxy endpoint (if created)
rds_proxy_arnRDS Proxy ARN (if created)

RDS Proxy

RDS Proxy provides connection pooling and failover capabilities:

  • Connection Pooling: Reuses database connections
  • Failover: Automatic failover to standby instances
  • IAM Authentication: Optional IAM-based authentication
  • Secrets Manager: Automatic credential rotation

When to Use RDS Proxy

  • High connection count applications
  • Serverless applications (Lambda)
  • Need for connection pooling
  • Automatic failover requirements

Security Best Practices

  1. Private Subnets: Deploy RDS in private subnets
  2. Security Groups: Restrict access to specific security groups
  3. Encryption: Enable storage encryption
  4. No Public Access: Keep publicly_accessible = false
  5. Secrets Manager: Use Secrets Manager for credentials (with RDS Proxy)

Cost Considerations

  • db.t3.micro: ~$15/month (smallest tier)
  • db.t3.small: ~$30/month
  • Storage: ~$0.10/GB/month (gp3)
  • RDS Proxy: ~$15/month + connection charges

Additional Resources

Released under the MIT License.