Skip to main content
Aurora Limitless Database is a horizontally-scaled variant of Amazon Aurora that distributes both reads and writes across a sharded cluster. Instead of provisioning individual DB instances, you configure a shard group that Aurora manages automatically — scaling Aurora Capacity Units (ACUs) within the bounds you define. This is a fundamentally different architecture from standard provisioned Aurora. The cluster itself still exists as an aws_rds_cluster, but no individual aws_rds_cluster_instance resources are created. Connections go to the shard group endpoint rather than the cluster endpoint.
Aurora Limitless is a newer feature with limited regional availability. Verify that your target AWS region supports Aurora Limitless before deploying. As of this writing, supported regions include us-east-1, us-east-2, us-west-2, and eu-west-1, among others — but check the AWS documentation for the current list.
Use Aurora Limitless when you need to scale write throughput beyond what a single Aurora writer instance can handle, or when your dataset is too large for a single Aurora cluster. For workloads that only need read scale-out, standard provisioned Aurora with autoscaling read replicas is simpler and more cost-effective.

Key differences from standard Aurora

  • Set cluster_scalability_type = "limitless" on the module — this automatically sets engine_mode to an empty string (required by AWS)
  • No instances block is used; capacity is managed by the shard_group block instead
  • The engine version must be a Limitless-specific version (e.g. 16.9-limitless)
  • Managed master user password (manage_master_user_password) is not supported for Limitless clusters — you must supply a password directly via master_password_wo
  • Use storage_type = "aurora-iopt1" (Aurora I/O Optimized), which is required for Limitless

Example

The following example provisions a PostgreSQL Aurora Limitless cluster in eu-west-1 with a shard group capped at 16 ACUs.
provider "aws" {
  region = local.region
}

data "aws_availability_zones" "available" {
  # Exclude local zones
  filter {
    name   = "opt-in-status"
    values = ["opt-in-not-required"]
  }
}

locals {
  name   = "ex-limitless"
  region = "eu-west-1"

  vpc_cidr = "10.0.0.0/16"
  azs      = slice(data.aws_availability_zones.available.names, 0, 3)

  tags = {
    Example   = local.name
    Terraform = "true"
  }
}

module "aurora" {
  source = "terraform-aws-modules/rds-aurora/aws"

  name           = local.name
  engine         = "aurora-postgresql"
  engine_version = "16.9-limitless"
  storage_type   = "aurora-iopt1"

  cluster_scalability_type    = "limitless"
  cluster_monitoring_interval = 30

  cluster_performance_insights_enabled          = true
  cluster_performance_insights_retention_period = 31

  shard_group = {
    compute_redundancy = 0
    identifier         = local.name
    max_acu            = 16
  }

  # Aurora Limitless clusters do not support managed master user password
  manage_master_user_password = false
  master_username             = "root"
  master_password_wo          = random_password.master.result
  master_password_wo_version  = 1

  vpc_id               = module.vpc.vpc_id
  db_subnet_group_name = module.vpc.database_subnet_group_name
  security_group_ingress_rules = {
    private-az1 = {
      cidr_ipv4 = element(module.vpc.private_subnets_cidr_blocks, 0)
    }
    private-az2 = {
      cidr_ipv4 = element(module.vpc.private_subnets_cidr_blocks, 1)
    }
    private-az3 = {
      cidr_ipv4 = element(module.vpc.private_subnets_cidr_blocks, 2)
    }
  }

  apply_immediately   = true
  skip_final_snapshot = true

  cluster_parameter_group = {
    name        = local.name
    family      = "aurora-postgresql16"
    description = "${local.name} example cluster parameter group"
    parameters = [
      {
        name         = "log_min_duration_statement"
        value        = 4000
        apply_method = "immediate"
      },
      {
        name         = "rds.force_ssl"
        value        = 1
        apply_method = "immediate"
      }
    ]
  }

  enabled_cloudwatch_logs_exports = ["postgresql"]
  create_cloudwatch_log_group     = true

  tags = local.tags
}

resource "random_password" "master" {
  length  = 20
  special = false
}

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "~> 6.0"

  name = local.name
  cidr = local.vpc_cidr

  azs              = local.azs
  public_subnets   = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k)]
  private_subnets  = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 3)]
  database_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 6)]

  tags = local.tags
}

The shard_group variable

The shard_group object configures the aws_rds_shard_group resource that Aurora Limitless creates alongside the cluster.
AttributeTypeRequiredDescription
identifierstringyesThe identifier for the shard group
max_acunumberyesMaximum Aurora Capacity Units for the shard group
min_acunumbernoMinimum Aurora Capacity Units for the shard group
compute_redundancynumbernoNumber of additional writer DB instances (0 or 1). Set to 0 to disable redundancy
publicly_accessibleboolnoWhether the shard group is publicly accessible
tagsmap(string)noTags to apply to the shard group resource
timeoutsobjectnoCreate/update/delete timeout overrides for the shard group

Timeout configuration

The timeouts sub-object within shard_group accepts:
shard_group = {
  identifier = "my-cluster"
  max_acu    = 32
  timeouts = {
    create = "60m"
    update = "60m"
    delete = "60m"
  }
}

The engine_mode behavior

When cluster_scalability_type = "limitless" is set, the module automatically passes an empty string "" for engine_mode to the underlying aws_rds_cluster resource. This is required by AWS — do not set engine_mode manually when using Limitless.
# In main.tf — handled automatically by the module:
engine_mode = var.cluster_scalability_type == "limitless" ? "" : var.engine_mode

Outputs

The shard group endpoint is exposed as a module output rather than the standard cluster endpoint:
output "db_shard_group_arn" {
  description = "ARN of the shard group"
  value       = module.aurora.db_shard_group_arn
}

output "db_shard_group_resource_id" {
  description = "The AWS Region-unique, immutable identifier for the DB shard group"
  value       = module.aurora.db_shard_group_resource_id
}

output "db_shard_group_endpoint" {
  description = "The connection endpoint for the DB shard group"
  value       = module.aurora.db_shard_group_endpoint
}
Connect your application to db_shard_group_endpoint — not cluster_endpoint — when using Aurora Limitless.

Build docs developers (and LLMs) love